From dfcbaae7d0b7d61d3af526f510db7e233cfb6807 Mon Sep 17 00:00:00 2001 From: Andrey Smirnov Date: Thu, 29 Feb 2024 17:19:57 +0400 Subject: [PATCH] chore: initial commit Omni is source-available under BUSL. Signed-off-by: Andrey Smirnov Co-Authored-By: Artem Chernyshev Co-Authored-By: Utku Ozdemir Co-Authored-By: Dmitriy Matrenichev Co-Authored-By: Philipp Sauter Co-Authored-By: Noel Georgi Co-Authored-By: evgeniybryzh Co-Authored-By: Tim Jones Co-Authored-By: Andrew Rynhard Co-Authored-By: Spencer Smith Co-Authored-By: Christian Rolland Co-Authored-By: Gerard de Leeuw Co-Authored-By: Steve Francis <67986293+steverfrancis@users.noreply.github.com> Co-Authored-By: Volodymyr Mazurets --- .codecov.yml | 18 + .conform.yaml | 88 + .dockerignore | 29 + .github/ISSUE_TEMPLATE/bug_report.yaml | 56 + .github/ISSUE_TEMPLATE/feature_request.yaml | 33 + .github/workflows/ci.yaml | 439 + .github/workflows/e2e-backups-cron.yaml | 53 + .github/workflows/e2e-scaling-cron.yaml | 53 + .github/workflows/e2e-short-cron.yaml | 53 + .github/workflows/e2e-templates-cron.yaml | 53 + .github/workflows/e2e-upgrades-cron.yaml | 53 + .github/workflows/slack-notify.yaml | 97 + .gitignore | 10 + .golangci.yml | 178 + .kres.yaml | 511 + .license-header.go.txt | 4 + .markdownlint.json | 9 + .vscode/settings.json | 4 + CHANGELOG.md | 1655 + CONTRIBUTING.md | 11 + DEVELOPMENT.md | 232 + Dockerfile | 513 + LICENSE | 95 + Makefile | 365 + README.md | 70 + client/.golangci.yml | 178 + client/.license-header.go.txt | 3 + client/CONTRIBUTING.md | 6 + client/LICENSE | 373 + client/README.md | 41 + client/api/common/common.proto | 116 + client/api/common/omni.pb.go | 206 + client/api/common/omni.proto | 22 + client/api/common/omni_vtproto.pb.go | 195 + client/api/google/rpc/status.proto | 49 + client/api/omni/management/management.pb.go | 1825 + .../api/omni/management/management.pb.gw.go | 965 + client/api/omni/management/management.proto | 146 + .../api/omni/management/management_grpc.pb.go | 574 + .../omni/management/management_vtproto.pb.go | 4745 +++ client/api/omni/oidc/oidc.pb.go | 223 + client/api/omni/oidc/oidc.pb.gw.go | 163 + client/api/omni/oidc/oidc.proto | 21 + client/api/omni/oidc/oidc_grpc.pb.go | 112 + client/api/omni/oidc/oidc_vtproto.pb.go | 368 + client/api/omni/resources/resources.pb.go | 1315 + client/api/omni/resources/resources.pb.gw.go | 602 + client/api/omni/resources/resources.proto | 108 + .../api/omni/resources/resources_grpc.pb.go | 360 + .../omni/resources/resources_vtproto.pb.go | 3474 ++ client/api/omni/specs/auth.pb.go | 2017 + client/api/omni/specs/auth.proto | 165 + client/api/omni/specs/auth_vtproto.pb.go | 6474 +++ client/api/omni/specs/control_plane_status.go | 40 + client/api/omni/specs/ephemeral.pb.go | 183 + client/api/omni/specs/ephemeral.proto | 16 + client/api/omni/specs/ephemeral_vtproto.pb.go | 287 + client/api/omni/specs/oidc.pb.go | 166 + client/api/omni/specs/oidc.proto | 14 + client/api/omni/specs/oidc_vtproto.pb.go | 257 + client/api/omni/specs/omni.pb.go | 8367 ++++ client/api/omni/specs/omni.proto | 933 + client/api/omni/specs/omni_vtproto.pb.go | 22572 +++++++++++ client/api/omni/specs/omni_yaml.go | 48 + client/api/omni/specs/siderolink.pb.go | 497 + client/api/omni/specs/siderolink.proto | 47 + .../api/omni/specs/siderolink_vtproto.pb.go | 1339 + client/api/omni/specs/system.pb.go | 286 + client/api/omni/specs/system.proto | 20 + client/api/omni/specs/system_vtproto.pb.go | 556 + client/api/omni/specs/virtual.pb.go | 489 + client/api/omni/specs/virtual.proto | 36 + client/api/omni/specs/virtual_vtproto.pb.go | 1234 + client/api/talos/machine/machine.pb.gw.go | 3016 ++ client/api/talos/machine/machine.proto | 1097 + client/api/v1alpha1/resource.proto | 72 + client/go.mod | 100 + client/go.sum | 368 + client/pkg/access/access.go | 11 + client/pkg/client/client.go | 132 + client/pkg/client/example_test.go | 130 + client/pkg/client/management/management.go | 316 + client/pkg/client/oidc/oidc.go | 37 + client/pkg/client/omni/omni.go | 38 + client/pkg/client/options.go | 64 + client/pkg/client/talos/talos.go | 80 + client/pkg/constants/constants.go | 75 + client/pkg/constants/debug_disabled.go | 10 + client/pkg/constants/debug_enabled.go | 10 + client/pkg/constants/talos.go | 55 + client/pkg/cosi/labels/labels.go | 37 + client/pkg/cosi/labels/labels_test.go | 211 + client/pkg/cosi/labels/lexer.go | 247 + client/pkg/cosi/labels/parser.go | 298 + client/pkg/example_test.go | 33 + client/pkg/meta/labels.go | 31 + client/pkg/meta/meta.go | 38 + .../pkg/omni/resources/auth/access_policy.go | 52 + client/pkg/omni/resources/auth/auth.go | 18 + client/pkg/omni/resources/auth/config.go | 64 + client/pkg/omni/resources/auth/identity.go | 49 + client/pkg/omni/resources/auth/labels.go | 32 + client/pkg/omni/resources/auth/public_key.go | 49 + .../pkg/omni/resources/auth/saml_assertion.go | 47 + .../omni/resources/auth/saml_label_rule.go | 58 + client/pkg/omni/resources/auth/user.go | 49 + client/pkg/omni/resources/common/common.go | 30 + client/pkg/omni/resources/k8s/k8s.go | 12 + .../omni/resources/k8s/kubernetes_resource.go | 51 + .../pkg/omni/resources/oidc/jwt_public_key.go | 43 + client/pkg/omni/resources/oidc/oidc.go | 19 + client/pkg/omni/resources/omni/annotations.go | 23 + client/pkg/omni/resources/omni/backup_conf.go | 74 + client/pkg/omni/resources/omni/backup_data.go | 48 + client/pkg/omni/resources/omni/cluster.go | 74 + .../omni/cluster_bootstrap_status.go | 53 + .../resources/omni/cluster_config_version.go | 48 + .../resources/omni/cluster_destroy_status.go | 53 + .../omni/resources/omni/cluster_endpoint.go | 53 + .../omni/resources/omni/cluster_machine.go | 46 + .../resources/omni/cluster_machine_config.go | 49 + .../omni/cluster_machine_config_patches.go | 46 + .../cluster_machine_config_patches_test.go | 86 + .../omni/cluster_machine_config_status.go | 48 + .../omni/cluster_machine_encryption_key.go | 48 + .../omni/cluster_machine_identity.go | 48 + .../omni/cluster_machine_installer_options.go | 47 + .../resources/omni/cluster_machine_status.go | 60 + .../omni/cluster_machine_template.go | 62 + .../pkg/omni/resources/omni/cluster_status.go | 65 + .../pkg/omni/resources/omni/cluster_uuid.go | 53 + .../pkg/omni/resources/omni/config_patch.go | 148 + .../omni/resources/omni/config_patch_test.go | 83 + .../resources/omni/control_plane_status.go | 48 + .../omni/resources/omni/etcd_audit_result.go | 45 + client/pkg/omni/resources/omni/etcd_backup.go | 60 + .../resources/omni/etcd_backup_conf_status.go | 61 + .../resources/omni/etcd_backup_encryption.go | 48 + .../omni/etcd_backup_overall_status.go | 77 + .../omni/resources/omni/etcd_backup_status.go | 65 + .../omni/resources/omni/etcd_manual_backup.go | 53 + .../omni/resources/omni/exposed_service.go | 57 + .../omni/resources/omni/features_config.go | 60 + .../omni/resources/omni/image_pull_request.go | 47 + .../omni/resources/omni/image_pull_status.go | 72 + .../omni/resources/omni/installation_media.go | 51 + client/pkg/omni/resources/omni/kubeconfig.go | 47 + .../omni/resources/omni/kubernetes_status.go | 47 + .../kubernetes_upgrade_manifest_status.go | 47 + .../omni/kubernetes_upgrade_status.go | 47 + .../omni/resources/omni/kubernetes_version.go | 49 + client/pkg/omni/resources/omni/labels.go | 149 + .../resources/omni/loadbalancer_config.go | 45 + .../resources/omni/loadbalancer_status.go | 50 + client/pkg/omni/resources/omni/machine.go | 91 + .../pkg/omni/resources/omni/machine_class.go | 48 + .../omni/machine_config_gen_options.go | 48 + .../pkg/omni/resources/omni/machine_labels.go | 48 + client/pkg/omni/resources/omni/machine_set.go | 75 + .../omni/machine_set_destroy_status.go | 53 + .../omni/resources/omni/machine_set_node.go | 68 + .../omni/resources/omni/machine_set_status.go | 48 + .../pkg/omni/resources/omni/machine_status.go | 222 + .../resources/omni/machine_status_link.go | 108 + .../resources/omni/machine_status_snapshot.go | 49 + .../resources/omni/machine_status_test.go | 169 + client/pkg/omni/resources/omni/omni.go | 70 + .../pkg/omni/resources/omni/ongoing_task.go | 52 + .../omni/redacted_cluster_machine_config.go | 48 + client/pkg/omni/resources/omni/schematic.go | 48 + .../resources/omni/schematic_configuration.go | 48 + client/pkg/omni/resources/omni/secrets.go | 67 + .../omni/resources/omni/talos_extensions.go | 47 + .../resources/omni/talos_upgrade_status.go | 47 + .../pkg/omni/resources/omni/talos_version.go | 53 + client/pkg/omni/resources/omni/talosconfig.go | 67 + .../pkg/omni/resources/registry/registry.go | 34 + client/pkg/omni/resources/resources.go | 44 + .../pkg/omni/resources/siderolink/config.go | 55 + .../resources/siderolink/connection_params.go | 61 + client/pkg/omni/resources/siderolink/link.go | 57 + .../omni/resources/siderolink/linkcounter.go | 55 + .../omni/resources/siderolink/siderolink.go | 28 + .../resources/system/cert_refresh_tick.go | 44 + client/pkg/omni/resources/system/dbversion.go | 48 + client/pkg/omni/resources/system/system.go | 14 + .../pkg/omni/resources/system/sysversion.go | 52 + .../resources/virtual/cluster_permissions.go | 49 + .../omni/resources/virtual/current_user.go | 63 + .../resources/virtual/kubernetes_usage.go | 47 + .../pkg/omni/resources/virtual/permissions.go | 56 + client/pkg/omni/resources/virtual/virtual.go | 15 + client/pkg/omnictl/apply.go | 176 + client/pkg/omnictl/cluster.go | 11 + client/pkg/omnictl/cluster/cluster.go | 32 + client/pkg/omnictl/cluster/delete.go | 45 + .../omnictl/cluster/kubernetes/kubernetes.go | 24 + .../cluster/kubernetes/manifest-sync.go | 68 + .../cluster/kubernetes/upgrade-pre-checks.go | 43 + client/pkg/omnictl/cluster/machine.go | 79 + client/pkg/omnictl/cluster/status.go | 57 + client/pkg/omnictl/cluster/template/delete.go | 51 + client/pkg/omnictl/cluster/template/diff.go | 44 + client/pkg/omnictl/cluster/template/export.go | 70 + client/pkg/omnictl/cluster/template/render.go | 41 + client/pkg/omnictl/cluster/template/status.go | 63 + client/pkg/omnictl/cluster/template/sync.go | 50 + .../pkg/omnictl/cluster/template/template.go | 36 + .../pkg/omnictl/cluster/template/validate.go | 41 + client/pkg/omnictl/common.go | 58 + client/pkg/omnictl/config.go | 318 + client/pkg/omnictl/config/config.go | 196 + client/pkg/omnictl/config/rename.go | 18 + client/pkg/omnictl/config/types.go | 33 + client/pkg/omnictl/delete.go | 162 + client/pkg/omnictl/docs.go | 86 + client/pkg/omnictl/download.go | 585 + client/pkg/omnictl/get.go | 237 + client/pkg/omnictl/internal/access/access.go | 6 + client/pkg/omnictl/internal/access/client.go | 139 + client/pkg/omnictl/internal/access/context.go | 19 + client/pkg/omnictl/internal/access/flags.go | 12 + client/pkg/omnictl/kubeconfig.go | 216 + client/pkg/omnictl/logformat/dmesg.go | 71 + client/pkg/omnictl/logformat/omni.go | 78 + client/pkg/omnictl/logformat/raw.go | 29 + client/pkg/omnictl/machine-logs.go | 69 + client/pkg/omnictl/output/json.go | 84 + client/pkg/omnictl/output/jsonpath.go | 124 + client/pkg/omnictl/output/output.go | 54 + client/pkg/omnictl/output/table.go | 133 + client/pkg/omnictl/output/yaml.go | 59 + client/pkg/omnictl/root.go | 34 + client/pkg/omnictl/serviceaccount.go | 203 + client/pkg/omnictl/talosconfig.go | 149 + client/pkg/runtime/runtime.go | 25 + .../pkg/template/internal/models/cluster.go | 193 + .../template/internal/models/controlplane.go | 66 + client/pkg/template/internal/models/list.go | 196 + .../pkg/template/internal/models/machine.go | 145 + .../template/internal/models/machineset.go | 248 + client/pkg/template/internal/models/models.go | 103 + client/pkg/template/internal/models/patch.go | 163 + .../pkg/template/internal/models/workers.go | 60 + client/pkg/template/operations/delete.go | 82 + client/pkg/template/operations/diff.go | 55 + client/pkg/template/operations/export.go | 523 + client/pkg/template/operations/export_test.go | 213 + .../operations/internal/statustree/helpers.go | 204 + .../internal/statustree/statustree.go | 175 + .../operations/internal/utils/utils.go | 145 + client/pkg/template/operations/operations.go | 6 + client/pkg/template/operations/render.go | 48 + client/pkg/template/operations/status.go | 259 + client/pkg/template/operations/sync.go | 198 + .../testdata/export/cluster-resources.yaml | 548 + .../testdata/export/cluster-template.yaml | 137 + client/pkg/template/operations/validate.go | 22 + client/pkg/template/order.go | 40 + client/pkg/template/sync.go | 23 + client/pkg/template/template.go | 325 + client/pkg/template/template_test.go | 441 + .../template/testdata/cluster-bad-yaml1.yaml | 8 + .../template/testdata/cluster-bad-yaml2.yaml | 6 + .../template/testdata/cluster-bad-yaml3.yaml | 5 + .../cluster-invalid-bootstrapspec.yaml | 20 + .../template/testdata/cluster-invalid1.yaml | 41 + .../template/testdata/cluster-invalid2.yaml | 15 + .../template/testdata/cluster-invalid3.yaml | 53 + .../template/testdata/cluster-invalid4.yaml | 31 + ...cluster-valid-bootstrapspec-resources.yaml | 91 + .../testdata/cluster-valid-bootstrapspec.yaml | 17 + .../template/testdata/cluster1-resources.yaml | 238 + client/pkg/template/testdata/cluster1.yaml | 47 + .../template/testdata/cluster2-resources.yaml | 199 + client/pkg/template/testdata/cluster2.yaml | 41 + .../template/testdata/cluster3-resources.yaml | 249 + client/pkg/template/testdata/cluster3.yaml | 79 + .../template/testdata/patches/invalid.yaml | 2 + .../testdata/patches/my-cluster-patch.yaml | 4 + .../testdata/patches/my-cp-patch.yaml | 5 + .../testdata/patches/my-registry-mirrors.yaml | 7 + .../template/testdata/patches/prohibited.yaml | 2 + client/pkg/version/version.go | 32 + cmd/omni-integration-test/main.go | 15 + .../pkg/clientconfig/clientconfig.go | 199 + .../pkg/clientconfig/register_key_debug.go | 43 + .../pkg/clientconfig/register_key_no_debug.go | 20 + cmd/omni-integration-test/pkg/tests/auth.go | 1244 + cmd/omni-integration-test/pkg/tests/backup.go | 269 + cmd/omni-integration-test/pkg/tests/blocks.go | 260 + .../pkg/tests/cleanup.go | 33 + .../pkg/tests/cluster.go | 839 + cmd/omni-integration-test/pkg/tests/common.go | 183 + .../pkg/tests/config_patch.go | 437 + .../pkg/tests/extensions.go | 109 + cmd/omni-integration-test/pkg/tests/image.go | 88 + .../pkg/tests/kubernetes.go | 520 + .../pkg/tests/machines.go | 270 + .../pkg/tests/omniconfig.go | 30 + .../pkg/tests/rolling_update.go | 193 + .../pkg/tests/siderolink.go | 111 + cmd/omni-integration-test/pkg/tests/talos.go | 715 + .../pkg/tests/template.go | 188 + .../pkg/tests/testdata/cluster-1.tmpl.yaml | 29 + .../pkg/tests/testdata/cluster-2.tmpl.yaml | 37 + cmd/omni-integration-test/pkg/tests/tests.go | 1170 + cmd/omni-integration-test/pkg/tests/utils.go | 57 + cmd/omni-integration-test/root.go | 149 + cmd/omni/main.go | 424 + cmd/omnictl/main.go | 28 + docs/context.md | 105 + docs/examples/template/cluster1.yaml | 43 + frontend/.eslintrc.yaml | 20 + frontend/.gitignore | 4 + frontend/LICENSE | 373 + frontend/babel.config.js | 9 + frontend/jest.config.js | 8 + frontend/package-lock.json | 33598 ++++++++++++++++ frontend/package.json | 73 + frontend/postcss.config.js | 11 + frontend/public/favicon.ico | Bin 0 -> 15406 bytes frontend/public/index.html | 17 + frontend/src/App.vue | 46 + frontend/src/AppUnavailable.vue | 42 + frontend/src/api/common/common.pb.ts | 75 + frontend/src/api/common/common.proto | 116 + frontend/src/api/common/omni.pb.ts | 15 + frontend/src/api/fetch.pb.ts | 387 + frontend/src/api/google/protobuf/any.pb.ts | 9 + frontend/src/api/google/protobuf/any.proto | 162 + .../src/api/google/protobuf/duration.pb.ts | 6 + .../src/api/google/protobuf/duration.proto | 115 + frontend/src/api/google/protobuf/empty.pb.ts | 7 + frontend/src/api/google/protobuf/empty.proto | 51 + .../src/api/google/protobuf/timestamp.pb.ts | 6 + .../src/api/google/protobuf/timestamp.proto | 144 + frontend/src/api/google/rpc/code.pb.ts | 25 + frontend/src/api/google/rpc/code.proto | 186 + frontend/src/api/google/rpc/status.pb.ts | 12 + frontend/src/api/google/rpc/status.proto | 49 + frontend/src/api/grpc.ts | 251 + frontend/src/api/omni/auth/auth.pb.ts | 48 + frontend/src/api/omni/auth/auth.proto | 45 + frontend/src/api/omni/config/context.pb.ts | 25 + .../src/api/omni/management/management.pb.ts | 160 + frontend/src/api/omni/oidc/oidc.pb.ts | 20 + .../src/api/omni/resources/resources.pb.ts | 119 + frontend/src/api/omni/specs/auth.pb.ts | 134 + frontend/src/api/omni/specs/ephemeral.pb.ts | 13 + frontend/src/api/omni/specs/omni.pb.ts | 622 + frontend/src/api/omni/specs/siderolink.pb.ts | 36 + frontend/src/api/omni/specs/system.pb.ts | 17 + frontend/src/api/omni/specs/virtual.pb.ts | 35 + frontend/src/api/options.ts | 97 + frontend/src/api/resources.ts | 207 + frontend/src/api/talos/machine/machine.pb.ts | 1029 + frontend/src/api/talos/machine/machine.proto | 1097 + frontend/src/api/v1alpha1/resource.pb.ts | 57 + frontend/src/api/v1alpha1/resource.proto | 84 + frontend/src/api/watch.ts | 726 + frontend/src/components/SideBar/TSideBar.vue | 42 + .../src/components/SideBar/TSideBarList.vue | 50 + .../components/SideBar/TSideBarNodesLogs.vue | 110 + frontend/src/components/TAlert.vue | 137 + frontend/src/components/TBreadcrumbs.vue | 81 + frontend/src/components/THeader/THeader.vue | 62 + frontend/src/components/TModal.vue | 65 + .../common/ActionsBox/TActionsBox.vue | 60 + .../common/ActionsBox/TActionsBoxItem.vue | 54 + .../common/Animation/TAnimation.vue | 50 + .../common/Animation/TGroupAnimation.vue | 25 + .../components/common/Button/IconButton.vue | 58 + .../src/components/common/Button/TButton.vue | 235 + .../components/common/Button/TButtonGroup.vue | 77 + .../components/common/Charts/RadialBar.vue | 109 + .../components/common/Checkbox/TCheckbox.vue | 57 + .../common/CodeEditor/CodeEditor.vue | 131 + frontend/src/components/common/Icon/TIcon.vue | 144 + .../common/InfoLabel/TInfoLabel.vue | 75 + .../src/components/common/Labels/Labels.vue | 84 + frontend/src/components/common/List/TList.vue | 342 + .../src/components/common/List/TListItem.vue | 91 + .../components/common/LogViewer/LogViewer.vue | 164 + .../components/common/MenuItem/TMenuItem.vue | 61 + .../common/Notification/TNotification.vue | 148 + .../common/OngoingTasks/OngoingTasks.vue | 152 + frontend/src/components/common/PageHeader.vue | 29 + .../common/Pagination/TPagination.vue | 175 + .../common/SelectList/TSelectList.vue | 138 + .../src/components/common/Shell/TShell.vue | 47 + .../SlideDownWrapper/TSlideDownWrapper.vue | 77 + .../components/common/Spinner/TSpinner.vue | 49 + .../src/components/common/Status/TStatus.vue | 201 + .../common/Suspended/TSuspended.vue | 37 + .../src/components/common/TInput/TInput.vue | 178 + .../src/components/common/Tabs/TabButton.vue | 44 + .../src/components/common/Tabs/TabList.vue | 15 + .../src/components/common/Tabs/TabsHeader.vue | 11 + frontend/src/components/common/Tag/TTag.vue | 30 + .../src/components/common/Tooltip/Tooltip.vue | 53 + .../components/common/UserInfo/UserInfo.vue | 77 + .../src/components/common/Watch/Watch.vue | 80 + frontend/src/components/icons/IconAWS.vue | 36 + .../components/icons/IconActionHorizontal.vue | 19 + .../components/icons/IconActionVertical.vue | 23 + .../src/components/icons/IconArrowDown.vue | 17 + .../src/components/icons/IconArrowLeft.vue | 17 + .../src/components/icons/IconArrowRight.vue | 17 + .../components/icons/IconArrowRightSquare.vue | 29 + frontend/src/components/icons/IconArrowUp.vue | 17 + .../src/components/icons/IconAttention.vue | 21 + frontend/src/components/icons/IconBox.vue | 19 + frontend/src/components/icons/IconChange.vue | 24 + frontend/src/components/icons/IconCheck.vue | 19 + .../components/icons/IconCheckInCircle.vue | 15 + .../icons/IconCheckInCircleClassic.vue | 24 + frontend/src/components/icons/IconClose.vue | 20 + .../components/icons/IconCloudConnection.vue | 39 + .../src/components/icons/IconClusters.vue | 34 + .../src/components/icons/IconClustersBig.vue | 51 + .../src/components/icons/IconComplete.vue | 15 + frontend/src/components/icons/IconCopy.vue | 24 + .../src/components/icons/IconDashboard.vue | 23 + frontend/src/components/icons/IconDelete.vue | 39 + frontend/src/components/icons/IconDot.vue | 15 + .../src/components/icons/IconDropRight.vue | 15 + frontend/src/components/icons/IconDropUp.vue | 19 + .../src/components/icons/IconDropdown.vue | 19 + frontend/src/components/icons/IconEdit.vue | 23 + frontend/src/components/icons/IconError.vue | 29 + .../src/components/icons/IconExternalLink.vue | 22 + .../src/components/icons/IconFailAuth.vue | 51 + frontend/src/components/icons/IconGCP.vue | 34 + .../icons/IconHeaderDropdownLoading.vue | 65 + .../src/components/icons/IconHeaderLogo.vue | 42 + frontend/src/components/icons/IconHome.vue | 15 + .../src/components/icons/IconInProgress.vue | 72 + frontend/src/components/icons/IconInfo.vue | 29 + frontend/src/components/icons/IconKey.vue | 30 + .../src/components/icons/IconKubeConfig.vue | 26 + .../src/components/icons/IconKubernetes.vue | 59 + .../src/components/icons/IconLinkDown.vue | 22 + frontend/src/components/icons/IconLoading.vue | 55 + frontend/src/components/icons/IconLog.vue | 26 + frontend/src/components/icons/IconLogo.vue | 95 + .../components/icons/IconLongArrowDown.vue | 24 + .../components/icons/IconLongArrowLeft.vue | 24 + .../components/icons/IconLongArrowRight.vue | 24 + .../src/components/icons/IconLongArrowTop.vue | 24 + frontend/src/components/icons/IconMinus.vue | 15 + .../src/components/icons/IconNoConnection.vue | 45 + frontend/src/components/icons/IconNodes.vue | 54 + .../src/components/icons/IconOngoingTasks.vue | 26 + .../src/components/icons/IconOverview.vue | 29 + frontend/src/components/icons/IconPin.vue | 34 + frontend/src/components/icons/IconPlus.vue | 20 + frontend/src/components/icons/IconPodes.vue | 29 + .../src/components/icons/IconQuestion.vue | 27 + frontend/src/components/icons/IconReboot.vue | 29 + frontend/src/components/icons/IconRefresh.vue | 15 + frontend/src/components/icons/IconReset.vue | 23 + .../src/components/icons/IconRollback.vue | 16 + frontend/src/components/icons/IconSearch.vue | 24 + .../src/components/icons/IconSettings.vue | 24 + .../components/icons/IconSettingsToggle.vue | 17 + frontend/src/components/icons/IconSidero.vue | 95 + .../components/icons/IconSideroMonochrome.vue | 38 + .../src/components/icons/IconTalosConfig.vue | 23 + frontend/src/components/icons/IconTask.vue | 20 + .../src/components/icons/IconTerminal.vue | 24 + frontend/src/components/icons/IconTime.vue | 24 + frontend/src/components/icons/IconUnknown.vue | 31 + frontend/src/components/icons/IconUnlink.vue | 44 + .../icons/IconUpgradeEmptyState.vue | 81 + frontend/src/components/icons/IconUpload.vue | 64 + frontend/src/components/icons/IconWaiting.vue | 16 + frontend/src/components/icons/IconWarning.vue | 29 + .../src/components/icons/IconWarningClear.vue | 22 + frontend/src/constants/index.ts | 57 + frontend/src/context.ts | 55 + frontend/src/fonts.css | 583 + .../fonts/KFOlCnqEu92Fr1MmEU9fABc4EsA.woff2 | Bin 0 -> 9840 bytes .../src/fonts/KFOlCnqEu92Fr1MmEU9fBBc4.woff2 | Bin 0 -> 15920 bytes .../fonts/KFOlCnqEu92Fr1MmEU9fBxc4EsA.woff2 | Bin 0 -> 7016 bytes .../fonts/KFOlCnqEu92Fr1MmEU9fCBc4EsA.woff2 | Bin 0 -> 1500 bytes .../fonts/KFOlCnqEu92Fr1MmEU9fCRc4EsA.woff2 | Bin 0 -> 14968 bytes .../fonts/KFOlCnqEu92Fr1MmEU9fChc4EsA.woff2 | Bin 0 -> 11800 bytes .../fonts/KFOlCnqEu92Fr1MmEU9fCxc4EsA.woff2 | Bin 0 -> 5604 bytes .../fonts/KFOlCnqEu92Fr1MmSU5fABc4EsA.woff2 | Bin 0 -> 9576 bytes .../src/fonts/KFOlCnqEu92Fr1MmSU5fBBc4.woff2 | Bin 0 -> 15740 bytes .../fonts/KFOlCnqEu92Fr1MmSU5fBxc4EsA.woff2 | Bin 0 -> 7120 bytes .../fonts/KFOlCnqEu92Fr1MmSU5fCBc4EsA.woff2 | Bin 0 -> 1480 bytes .../fonts/KFOlCnqEu92Fr1MmSU5fCRc4EsA.woff2 | Bin 0 -> 15000 bytes .../fonts/KFOlCnqEu92Fr1MmSU5fChc4EsA.woff2 | Bin 0 -> 11796 bytes .../fonts/KFOlCnqEu92Fr1MmSU5fCxc4EsA.woff2 | Bin 0 -> 5468 bytes .../fonts/KFOlCnqEu92Fr1MmWUlfABc4EsA.woff2 | Bin 0 -> 9644 bytes .../src/fonts/KFOlCnqEu92Fr1MmWUlfBBc4.woff2 | Bin 0 -> 15860 bytes .../fonts/KFOlCnqEu92Fr1MmWUlfBxc4EsA.woff2 | Bin 0 -> 6936 bytes .../fonts/KFOlCnqEu92Fr1MmWUlfCBc4EsA.woff2 | Bin 0 -> 1432 bytes .../fonts/KFOlCnqEu92Fr1MmWUlfCRc4EsA.woff2 | Bin 0 -> 14684 bytes .../fonts/KFOlCnqEu92Fr1MmWUlfChc4EsA.woff2 | Bin 0 -> 11824 bytes .../fonts/KFOlCnqEu92Fr1MmWUlfCxc4EsA.woff2 | Bin 0 -> 5548 bytes .../src/fonts/KFOmCnqEu92Fr1Mu4WxKOzY.woff2 | Bin 0 -> 7112 bytes frontend/src/fonts/KFOmCnqEu92Fr1Mu4mxK.woff2 | Bin 0 -> 15744 bytes .../src/fonts/KFOmCnqEu92Fr1Mu5mxKOzY.woff2 | Bin 0 -> 9628 bytes .../src/fonts/KFOmCnqEu92Fr1Mu72xKOzY.woff2 | Bin 0 -> 15344 bytes .../src/fonts/KFOmCnqEu92Fr1Mu7GxKOzY.woff2 | Bin 0 -> 11872 bytes .../src/fonts/KFOmCnqEu92Fr1Mu7WxKOzY.woff2 | Bin 0 -> 5560 bytes .../src/fonts/KFOmCnqEu92Fr1Mu7mxKOzY.woff2 | Bin 0 -> 1484 bytes .../L0x5DF4xlVMF-BfR8bXMIjhEq3-OXg.woff2 | Bin 0 -> 10264 bytes .../L0x5DF4xlVMF-BfR8bXMIjhFq3-OXg.woff2 | Bin 0 -> 22872 bytes .../L0x5DF4xlVMF-BfR8bXMIjhGq3-OXg.woff2 | Bin 0 -> 35888 bytes .../L0x5DF4xlVMF-BfR8bXMIjhIq3-OXg.woff2 | Bin 0 -> 14092 bytes .../fonts/L0x5DF4xlVMF-BfR8bXMIjhLq38.woff2 | Bin 0 -> 32936 bytes .../L0x5DF4xlVMF-BfR8bXMIjhPq3-OXg.woff2 | Bin 0 -> 18596 bytes .../L0x7DF4xlVMF-BfR8bXMIjhOm32WWg.woff2 | Bin 0 -> 35424 bytes .../L0x7DF4xlVMF-BfR8bXMIjhOm36WWoKC.woff2 | Bin 0 -> 14844 bytes .../L0x7DF4xlVMF-BfR8bXMIjhOm3CWWoKC.woff2 | Bin 0 -> 38652 bytes .../L0x7DF4xlVMF-BfR8bXMIjhOm3KWWoKC.woff2 | Bin 0 -> 10784 bytes .../L0x7DF4xlVMF-BfR8bXMIjhOm3OWWoKC.woff2 | Bin 0 -> 24328 bytes .../L0x7DF4xlVMF-BfR8bXMIjhOm3mWWoKC.woff2 | Bin 0 -> 20468 bytes frontend/src/index.css | 164 + frontend/src/main.ts | 86 + frontend/src/methods/auth.ts | 145 + frontend/src/methods/cluster.ts | 491 + frontend/src/methods/features.ts | 28 + frontend/src/methods/index.ts | 204 + frontend/src/methods/key.ts | 334 + frontend/src/methods/labels.ts | 16 + frontend/src/methods/logs.ts | 138 + frontend/src/methods/machine.ts | 157 + frontend/src/methods/machineset.ts | 108 + frontend/src/methods/node.ts | 30 + frontend/src/methods/storage.ts | 27 + frontend/src/methods/time.ts | 92 + frontend/src/methods/title.ts | 38 + frontend/src/methods/user.ts | 81 + frontend/src/modal.ts | 24 + frontend/src/notification.ts | 40 + frontend/src/router/index.ts | 401 + frontend/src/schemas/config.schema.json | 3212 ++ frontend/src/shims-vue.d.ts | 11 + .../src/states/cluster-management/index.ts | 689 + frontend/src/theme.ts | 42 + frontend/src/vars/colors.js | 53 + .../src/views/cluster/Backups/Backups.vue | 66 + .../src/views/cluster/Backups/BackupsList.vue | 127 + .../ClusterMachines/ClusterMachine.vue | 76 + .../ClusterMachines/ClusterMachinePhase.vue | 134 + .../ClusterMachines/ClusterMachines.vue | 74 + .../cluster/ClusterMachines/MachineSet.vue | 154 + .../ClusterMachines/MachineSetPhase.vue | 105 + frontend/src/views/cluster/ClusterScoped.vue | 57 + .../src/views/cluster/Config/PatchEdit.vue | 622 + frontend/src/views/cluster/Config/Patches.vue | 312 + .../cluster/ExposedService/ExposedService.vue | 65 + .../ExposedService/ExposedServiceSideBar.vue | 96 + .../cluster/ManagedByTemplatesWarning.vue | 71 + frontend/src/views/cluster/Manifest/Sync.vue | 267 + .../src/views/cluster/Nodes/NodeConfig.vue | 51 + .../src/views/cluster/Nodes/NodeDetails.vue | 21 + frontend/src/views/cluster/Nodes/NodeLogs.vue | 156 + .../src/views/cluster/Nodes/NodeMonitor.vue | 377 + .../src/views/cluster/Nodes/NodeMounts.vue | 95 + .../src/views/cluster/Nodes/NodeOverview.vue | 408 + .../src/views/cluster/Nodes/NodesHeader.vue | 142 + .../src/views/cluster/Nodes/NodesList.vue | 156 + .../Nodes/components/NodeDetailsTabs.vue | 75 + .../cluster/Nodes/components/NodesItem.vue | 120 + .../Nodes/components/NodesMonitorChart.vue | 299 + .../src/views/cluster/Overview/Overview.vue | 25 + .../OverviewCircleChart.vue | 74 + .../OverviewCircleChartItem.vue | 55 + .../Overview/components/OverviewContent.vue | 351 + .../OverviewRightPanel/OverviewRightPanel.vue | 409 + .../OverviewRightPanelCondition.vue | 46 + .../OverviewRightPanelItem.vue | 45 + frontend/src/views/cluster/Pods/TPods.vue | 93 + .../cluster/Pods/components/TPodsItem.vue | 242 + .../cluster/Pods/components/TPodsList.vue | 86 + frontend/src/views/cluster/SideBar.vue | 125 + frontend/src/views/cluster/SideBarNode.vue | 71 + frontend/src/views/common/Forbidden.vue | 24 + frontend/src/views/common/NodeContextMenu.vue | 99 + frontend/src/views/common/PageNotFound.vue | 27 + frontend/src/views/omni/Auth/Authenticate.vue | 238 + frontend/src/views/omni/Auth/OIDC.vue | 65 + .../views/omni/Clusters/ClusterBottomMenu.vue | 64 + .../Clusters/ClusterEtcdBackupCheckbox.vue | 124 + .../src/views/omni/Clusters/ClusterItem.vue | 183 + .../src/views/omni/Clusters/ClusterMenu.vue | 81 + .../src/views/omni/Clusters/ClusterStatus.vue | 96 + .../ClusterWorkloadProxyingCheckbox.vue | 40 + frontend/src/views/omni/Clusters/Clusters.vue | 93 + .../Clusters/Management/ClusterCreate.vue | 365 + .../Management/ClusterMachineItem.vue | 278 + .../omni/Clusters/Management/ClusterScale.vue | 163 + .../Clusters/Management/MachineSetConfig.vue | 138 + .../Clusters/Management/MachineSetLabel.vue | 15 + .../Clusters/Management/MachineSetPicker.vue | 144 + .../omni/Clusters/Management/MachineSets.vue | 48 + .../src/views/omni/ItemLabels/ItemLabel.vue | 147 + .../src/views/omni/ItemLabels/ItemLabels.vue | 174 + .../omni/MachineClasses/MachineClass.vue | 373 + .../omni/MachineClasses/MachineClasses.vue | 30 + .../MachineClasses/MachineClassesList.vue | 75 + .../omni/MachineClasses/MachineMatchItem.vue | 51 + .../src/views/omni/Machines/MachineItem.vue | 211 + .../src/views/omni/Machines/MachineLogs.vue | 41 + .../omni/Machines/MachineLogsContainer.vue | 55 + frontend/src/views/omni/Machines/Machines.vue | 60 + .../src/views/omni/Modals/CloseButton.vue | 14 + .../src/views/omni/Modals/ClusterDestroy.vue | 171 + .../views/omni/Modals/ConfigPatchDestroy.vue | 80 + .../src/views/omni/Modals/ConfigPatchEdit.vue | 141 + .../omni/Modals/DownloadInstallationMedia.vue | 472 + .../src/views/omni/Modals/DownloadOmnictl.vue | 98 + .../views/omni/Modals/DownloadTalosctl.vue | 154 + .../views/omni/Modals/MachineClassDestroy.vue | 75 + .../src/views/omni/Modals/MachineRemove.vue | 87 + .../views/omni/Modals/MachineSetDestroy.vue | 93 + .../src/views/omni/Modals/NodeDestroy.vue | 185 + .../views/omni/Modals/NodeDestroyCancel.vue | 132 + frontend/src/views/omni/Modals/NodeReboot.vue | 132 + .../src/views/omni/Modals/NodeShutdown.vue | 133 + .../views/omni/Modals/UntaintSingleNode.vue | 44 + .../views/omni/Modals/UpdateKubernetes.vue | 190 + .../src/views/omni/Modals/UpdateTalos.vue | 159 + frontend/src/views/omni/Modals/UserCreate.vue | 94 + .../src/views/omni/Modals/UserDestroy.vue | 100 + frontend/src/views/omni/Modals/UserEdit.vue | 96 + frontend/src/views/omni/Overview/Overview.vue | 269 + .../src/views/omni/Settings/BackupStorage.vue | 172 + frontend/src/views/omni/SideBar.vue | 85 + frontend/src/views/omni/Users/UserItem.vue | 109 + frontend/src/views/omni/Users/Users.vue | 84 + frontend/tailwind.config.js | 63 + .../tests/unit/clusterManageState.spec.ts | 413 + frontend/tests/unit/watch.spec.ts | 276 + frontend/tsconfig.json | 27 + frontend/vue.config.js | 23 + go.mod | 251 + go.sum | 821 + hack/certs/localhost-key.pem | 28 + hack/certs/localhost.pem | 25 + hack/compose/docker-compose.yml | 117 + hack/dev-server.sh | 18 + hack/generate-certs.example.yml | 20 + hack/generate-certs/main.go | 283 + hack/release.sh | 66 + hack/release.toml | 24 + hack/test/freeze-a-vm.sh | 12 + hack/test/integration.sh | 157 + hack/test/restart-a-vm.sh | 12 + hack/test/wipe-a-vm.sh | 22 + internal/backend/debug/debug.go | 28 + internal/backend/debug/debug_disabled.go | 16 + internal/backend/debug/debug_enabled.go | 37 + internal/backend/debug/graphs.go | 178 + internal/backend/dns/service.go | 260 + internal/backend/dns/service_test.go | 162 + internal/backend/factory/export_test.go | 8 + internal/backend/factory/factory.go | 201 + internal/backend/factory/factory_test.go | 106 + internal/backend/grpc/auth.go | 286 + internal/backend/grpc/auth_debug.go | 33 + internal/backend/grpc/auth_no_debug.go | 14 + internal/backend/grpc/cosi.go | 29 + internal/backend/grpc/export_test.go | 23 + internal/backend/grpc/grpc.go | 127 + internal/backend/grpc/grpc_test.go | 303 + internal/backend/grpc/management.go | 887 + internal/backend/grpc/oidc.go | 59 + internal/backend/grpc/resource.go | 399 + internal/backend/grpc/router/omni_backend.go | 72 + internal/backend/grpc/router/resolve.go | 71 + internal/backend/grpc/router/router.go | 375 + internal/backend/grpc/router/server.go | 61 + internal/backend/grpc/router/talos_backend.go | 197 + .../backend/grpc/router/talos_backend_test.go | 211 + internal/backend/grpc/schematics.go | 126 + internal/backend/grpc/schematics_test.go | 261 + internal/backend/grpc/serviceaccount.go | 138 + internal/backend/grpc/validate.go | 72 + internal/backend/health/health.go | 67 + internal/backend/k8sproxy/export_test.go | 12 + internal/backend/k8sproxy/jwt.go | 52 + internal/backend/k8sproxy/jwt_test.go | 132 + internal/backend/k8sproxy/k8sproxy.go | 78 + internal/backend/k8sproxy/middleware.go | 125 + internal/backend/k8sproxy/middleware_test.go | 284 + internal/backend/k8sproxy/multiplex.go | 201 + internal/backend/k8sproxy/proxy.go | 67 + internal/backend/logging/handler.go | 74 + internal/backend/logging/logging.go | 16 + internal/backend/monitoring/monitoring.go | 72 + internal/backend/oidc/external/external.go | 24 + .../backend/oidc/internal/client/client.go | 121 + .../oidc/internal/models/auth_request.go | 163 + .../backend/oidc/internal/models/challenge.go | 31 + .../backend/oidc/internal/models/models.go | 7 + .../backend/oidc/internal/models/token.go | 19 + .../storage/authrequest/authrequest.go | 7 + .../internal/storage/authrequest/storage.go | 133 + .../storage/authrequest/storage_test.go | 75 + .../oidc/internal/storage/keys/keys.go | 7 + .../oidc/internal/storage/keys/storage.go | 247 + .../internal/storage/keys/storage_test.go | 161 + .../backend/oidc/internal/storage/storage.go | 213 + .../oidc/internal/storage/token/mock_test.go | 151 + .../oidc/internal/storage/token/storage.go | 374 + .../internal/storage/token/storage_test.go | 313 + .../oidc/internal/storage/token/token.go | 7 + internal/backend/oidc/oidc.go | 87 + internal/backend/proxy_server.go | 132 + .../backend/resourcelogger/resourcelogger.go | 213 + .../resourcelogger/resourcelogger_test.go | 243 + internal/backend/runtime/cosi/cosi.go | 329 + internal/backend/runtime/export_test.go | 8 + .../backend/runtime/keyprovider/storage.go | 246 + .../backend/runtime/kubernetes/cleanup.go | 36 + internal/backend/runtime/kubernetes/client.go | 253 + .../backend/runtime/kubernetes/kubernetes.go | 605 + .../runtime/kubernetes/kubernetes_test.go | 69 + .../kubernetes/testdata/oidc-kubeconfig1.yaml | 27 + .../kubernetes/testdata/oidc-kubeconfig2.yaml | 27 + .../runtime/omni/controllers/controllers.go | 7 + .../omni/controllers/omni/backup_data.go | 97 + .../controllers/omni/cert_refresh_tick.go | 73 + .../omni/cert_refresh_tick_test.go | 54 + .../runtime/omni/controllers/omni/cluster.go | 101 + .../omni/cluster_bootstrap_status.go | 247 + .../omni/cluster_bootstrap_status_test.go | 181 + .../omni/cluster_config_version.go | 44 + .../omni/cluster_destroy_status.go | 150 + .../omni/controllers/omni/cluster_endpoint.go | 70 + .../controllers/omni/cluster_endpoint_test.go | 53 + .../controllers/omni/cluster_loadbalancer.go | 192 + .../omni/cluster_loadbalancer_test.go | 114 + .../omni/controllers/omni/cluster_machine.go | 47 + .../omni/cluster_machine_config.go | 472 + .../omni/cluster_machine_config_status.go | 706 + .../cluster_machine_config_status_test.go | 604 + .../cluster_machine_config_strip_role_test.go | 117 + .../omni/cluster_machine_config_test.go | 181 + .../omni/cluster_machine_encryption.go | 136 + .../omni/cluster_machine_encryption_key.go | 58 + .../omni/cluster_machine_identity.go | 182 + .../omni/cluster_machine_status.go | 229 + .../omni/cluster_machine_status_metrics.go | 120 + .../omni/cluster_machine_status_test.go | 223 + .../omni/controllers/omni/cluster_status.go | 154 + .../omni/cluster_status_metrics.go | 116 + .../controllers/omni/cluster_status_test.go | 226 + .../omni/controllers/omni/cluster_test.go | 86 + .../omni/controllers/omni/cluster_uuid.go | 59 + .../omni/cluster_workload_proxy.go | 152 + .../omni/cluster_workload_proxy_test.go | 58 + .../controllers/omni/control_plane_status.go | 147 + .../data/kms-encryption-config-patch.yaml | 14 + ...ube-service-exposer-config-patch.tmpl.yaml | 60 + .../omni/controllers/omni/etcd_backup.go | 448 + .../omni/etcd_backup_encryption.go | 67 + .../omni/etcd_backup_overall_status.go | 104 + .../omni/controllers/omni/etcd_backup_test.go | 815 + .../controllers/omni/etcdbackup/etcdbackup.go | 80 + .../omni/etcdbackup/etcdbackup_test.go | 56 + .../omni/etcdbackup/store/disabledstore.go | 37 + .../omni/etcdbackup/store/filestore.go | 46 + .../omni/etcdbackup/store/metrics.go | 144 + .../omni/etcdbackup/store/s3store.go | 224 + .../omni/etcdbackup/store/store.go | 79 + .../omni/controllers/omni/export_test.go | 30 + .../omni/controllers/omni/image/client.go | 85 + .../omni/controllers/omni/image/image.go | 7 + .../controllers/omni/image_pull_status.go | 183 + .../omni/image_pull_status_test.go | 227 + .../controllers/omni/installation_media.go | 400 + .../omni/internal/blocks/decrypt.go | 76 + .../omni/internal/blocks/encrypt.go | 79 + .../omni/internal/blocks/encrypt_test.go | 229 + .../omni/internal/configpatch/configpatch.go | 84 + .../omni/internal/etcdbackup/crypt/crypt.go | 94 + .../omni/internal/etcdbackup/crypt/decrypt.go | 88 + .../omni/internal/etcdbackup/crypt/encrypt.go | 75 + .../internal/etcdbackup/crypt/encrypt_test.go | 342 + .../omni/internal/etcdbackup/etcdbackup.go | 7 + .../internal/etcdbackup/fstore/export_test.go | 10 + .../omni/internal/etcdbackup/fstore/fstore.go | 78 + .../internal/etcdbackup/fstore/fstore_test.go | 82 + .../internal/etcdbackup/fstore/fstore_unix.go | 94 + .../etcdbackup/fstore/fstore_windows.go | 26 + .../internal/etcdbackup/s3store/s3store.go | 125 + .../omni/internal/kubernetes/kubernetes.go | 69 + .../internal/kubernetes/kubernetes_test.go | 77 + .../omni/internal/kubernetes/machinemap.go | 53 + .../internal/kubernetes/machinemap_test.go | 66 + .../omni/internal/kubernetes/patch.go | 150 + .../omni/internal/kubernetes/upgrade.go | 186 + .../omni/internal/kubernetes/upgrade_test.go | 480 + .../omni/internal/kubernetes/versions.go | 79 + .../omni/internal/kubernetes/versions_test.go | 76 + .../internal/loadbalancer/loadbalancer.go | 41 + .../omni/internal/loadbalancer/manager.go | 140 + .../omni/internal/mappers/mappers.go | 80 + .../omni/internal/talos/schematic.go | 49 + .../omni/internal/talos/versions.go | 76 + .../task/clustermachine/clustermachine.go | 7 + .../internal/task/clustermachine/identity.go | 322 + .../omni/internal/task/image/image.go | 7 + .../omni/internal/task/image/pulltask.go | 224 + .../omni/internal/task/image/status.go | 21 + .../omni/internal/task/machine/helpers.go | 37 + .../omni/internal/task/machine/machine.go | 350 + .../omni/internal/task/machine/poll.go | 342 + .../controllers/omni/internal/task/runner.go | 73 + .../omni/internal/task/runner_test.go | 74 + .../controllers/omni/internal/task/task.go | 114 + .../omni/internal/task/task_test.go | 98 + .../omni/controllers/omni/key_pruner.go | 130 + .../omni/controllers/omni/key_pruner_test.go | 75 + .../omni/controllers/omni/kubeconfig.go | 106 + .../omni/controllers/omni/kubeconfig_test.go | 94 + .../controllers/omni/kubernetes_status.go | 751 + .../omni/kubernetes_status_test.go | 113 + .../kubernetes_upgrade_manifest_status.go | 264 + .../omni/kubernetes_upgrade_status.go | 392 + .../omni/controllers/omni/loadbalancer.go | 216 + .../controllers/omni/loadbalancer_test.go | 395 + .../runtime/omni/controllers/omni/machine.go | 56 + .../omni/machine_config_gen_options.go | 67 + .../controllers/omni/machine_labels_test.go | 73 + .../omni/controllers/omni/machine_set.go | 49 + .../omni/machine_set_destroy_status.go | 130 + .../omni/machine_set_etcd_audit.go | 571 + .../omni/machine_set_etcd_audit_test.go | 534 + .../omni/controllers/omni/machine_set_node.go | 303 + .../controllers/omni/machine_set_node_test.go | 216 + .../controllers/omni/machine_set_status.go | 1174 + .../omni/machine_set_status_test.go | 950 + .../omni/controllers/omni/machine_status.go | 411 + .../controllers/omni/machine_status_link.go | 184 + .../omni/machine_status_link_test.go | 204 + .../omni/machine_status_metrics.go | 147 + .../controllers/omni/machine_status_test.go | 310 + .../omni/controllers/omni/machine_test.go | 66 + .../runtime/omni/controllers/omni/omni.go | 252 + .../omni/controllers/omni/omni_test.go | 620 + .../omni/controllers/omni/ongoing_task.go | 155 + .../omni/redacted_cluster_machine_config.go | 63 + .../redacted_cluster_machine_config_test.go | 73 + .../omni/controllers/omni/saml_assertion.go | 79 + .../runtime/omni/controllers/omni/secrets.go | 165 + .../omni/controllers/omni/secrets_test.go | 158 + .../omni/controllers/omni/talos_extensions.go | 86 + .../controllers/omni/talos_extensions_test.go | 202 + .../omni/controllers/omni/talos_test.go | 197 + .../controllers/omni/talos_upgrade_status.go | 595 + .../omni/talos_upgrade_status_test.go | 322 + .../omni/controllers/omni/talosconfig.go | 84 + .../omni/controllers/omni/talosconfig_test.go | 100 + .../runtime/omni/controllers/omni/versions.go | 306 + .../omni/controllers/omni/versions_test.go | 103 + internal/backend/runtime/omni/export_test.go | 75 + .../backend/runtime/omni/external/state.go | 328 + .../runtime/omni/external/state_test.go | 311 + internal/backend/runtime/omni/loader.go | 280 + internal/backend/runtime/omni/loader_test.go | 181 + .../backend/runtime/omni/migration/compat.go | 90 + .../backend/runtime/omni/migration/helpers.go | 74 + .../backend/runtime/omni/migration/manager.go | 220 + .../runtime/omni/migration/migration.go | 52 + .../runtime/omni/migration/migration_test.go | 1188 + .../runtime/omni/migration/migrations.go | 1024 + internal/backend/runtime/omni/omni.go | 511 + internal/backend/runtime/omni/omni_test.go | 195 + .../backend/runtime/omni/pkg/check/check.go | 7 + .../runtime/omni/pkg/check/connection.go | 42 + .../backend/runtime/omni/pkg/check/etcd.go | 364 + .../runtime/omni/pkg/check/etcd_test.go | 93 + internal/backend/runtime/omni/state.go | 139 + internal/backend/runtime/omni/state_access.go | 525 + internal/backend/runtime/omni/state_boltdb.go | 122 + internal/backend/runtime/omni/state_etcd.go | 286 + .../runtime/omni/state_etcd_election.go | 108 + .../runtime/omni/state_etcd_election_test.go | 116 + .../backend/runtime/omni/state_etcd_test.go | 224 + .../backend/runtime/omni/state_metrics.go | 99 + .../backend/runtime/omni/state_validation.go | 699 + .../runtime/omni/state_validation_test.go | 826 + .../runtime/omni/testdata/pgp/new_key.private | 106 + .../runtime/omni/testdata/pgp/new_key.public | 52 + .../runtime/omni/testdata/pgp/old_key.private | 106 + .../runtime/omni/testdata/pgp/old_key.public | 52 + .../backend/runtime/omni/validated/errors.go | 61 + .../backend/runtime/omni/validated/options.go | 58 + .../backend/runtime/omni/validated/state.go | 208 + .../runtime/omni/validated/state_test.go | 207 + .../runtime/omni/validated/validated.go | 7 + .../runtime/omni/validated/validation.go | 126 + .../backend/runtime/omni/virtual/computed.go | 138 + .../backend/runtime/omni/virtual/deduper.go | 214 + .../backend/runtime/omni/virtual/errors.go | 47 + .../virtual/pkg/producers/kubernetes_usage.go | 264 + .../omni/virtual/pkg/producers/producers.go | 14 + .../backend/runtime/omni/virtual/state.go | 261 + .../runtime/omni/virtual/state_test.go | 243 + internal/backend/runtime/options.go | 146 + internal/backend/runtime/proxy_runtime.go | 347 + .../backend/runtime/proxy_runtime_test.go | 500 + internal/backend/runtime/resource.go | 151 + internal/backend/runtime/runtime.go | 306 + internal/backend/runtime/runtime_test.go | 45 + internal/backend/runtime/talos/clients.go | 354 + .../backend/runtime/talos/clients_test.go | 122 + internal/backend/runtime/talos/talos.go | 266 + internal/backend/runtime/utils.go | 174 + internal/backend/runtime/utils_test.go | 128 + internal/backend/runtime/watch.go | 86 + internal/backend/saml/encoder.go | 42 + internal/backend/saml/saml.go | 128 + internal/backend/saml/session.go | 407 + internal/backend/saml/session_test.go | 149 + internal/backend/saml/testdata/google_acs.xml | 20 + .../backend/saml/testdata/google_metadata.xml | 15 + .../backend/saml/testdata/microsoft_acs.xml | 1 + .../saml/testdata/microsoft_metadata.xml | 194 + internal/backend/saml/testdata/samlsp_acs.xml | 15 + .../backend/saml/testdata/samlsp_metadata.xml | 68 + internal/backend/server.go | 1104 + .../backend/workloadproxy/accessvalidator.go | 133 + .../workloadproxy/accessvalidator_test.go | 83 + internal/backend/workloadproxy/handler.go | 220 + .../backend/workloadproxy/handler_test.go | 161 + .../backend/workloadproxy/serviceregistry.go | 262 + .../workloadproxy/serviceregistry_test.go | 178 + .../backend/workloadproxy/workloadproxy.go | 24 + internal/e2e-tests/.kresignore | 0 internal/e2e-tests/Dockerfile | 12 + internal/e2e-tests/go.mod | 33 + internal/e2e-tests/go.sum | 66 + internal/e2e-tests/main_test.go | 565 + internal/frontend/dist/index.html | 2 + internal/frontend/frontend.go | 17 + internal/frontend/handler.go | 129 + internal/internal/generate.go | 9 + internal/internal/tools/tsgen/ast.go | 172 + internal/internal/tools/tsgen/main.go | 144 + internal/internal/tools/tsgen/main_test.go | 54 + .../tools/tsgen/testdata/bad/pkg/1.go | 8 + .../tsgen/testdata/good/expected/resources.ts | 41 + .../tools/tsgen/testdata/good/pkg/1.go | 12 + .../tools/tsgen/testdata/good/pkg/2.go | 13 + internal/internal/tools/tsgen/ts.template | 44 + internal/memconn/memconn.go | 37 + .../pkg/auth/accesspolicy/accesspolicy.go | 355 + .../auth/accesspolicy/accesspolicy_test.go | 181 + internal/pkg/auth/accesspolicy/cluster.go | 68 + .../testdata/acl-invalid-metadata.yaml | 9 + .../testdata/acl-valid-match-selector.yaml | 73 + .../auth/accesspolicy/testdata/acl-valid.yaml | 82 + internal/pkg/auth/actor/actor.go | 22 + internal/pkg/auth/auth.go | 34 + internal/pkg/auth/auth0/auth0.go | 7 + internal/pkg/auth/auth0/token.go | 108 + internal/pkg/auth/authenticator.go | 25 + internal/pkg/auth/check.go | 167 + internal/pkg/auth/check_test.go | 205 + internal/pkg/auth/config.go | 133 + internal/pkg/auth/config_test.go | 194 + internal/pkg/auth/constants.go | 35 + internal/pkg/auth/context.go | 24 + internal/pkg/auth/handler/auth_config.go | 38 + internal/pkg/auth/handler/handler.go | 7 + internal/pkg/auth/handler/handler_test.go | 163 + internal/pkg/auth/handler/mock_test.go | 37 + internal/pkg/auth/handler/signature.go | 110 + internal/pkg/auth/interceptor/auth_config.go | 70 + internal/pkg/auth/interceptor/interceptor.go | 7 + internal/pkg/auth/interceptor/jwt.go | 86 + internal/pkg/auth/interceptor/saml.go | 130 + internal/pkg/auth/interceptor/signature.go | 120 + .../pkg/auth/interceptor/signature_test.go | 175 + internal/pkg/auth/role/role.go | 139 + internal/pkg/auth/scope/action.go | 18 + internal/pkg/auth/scope/object.go | 21 + internal/pkg/auth/scope/perspective.go | 17 + internal/pkg/auth/scope/scope.go | 98 + internal/pkg/auth/scope/scope_test.go | 76 + internal/pkg/auth/scope/set.go | 94 + internal/pkg/auth/scope/set_test.go | 141 + internal/pkg/auth/user/user.go | 81 + internal/pkg/auth/user/user_test.go | 79 + internal/pkg/cache/cache.go | 45 + internal/pkg/cache/cache_test.go | 42 + internal/pkg/certs/certs.go | 76 + internal/pkg/certs/certs_test.go | 47 + internal/pkg/certs/kubernetes.go | 128 + internal/pkg/certs/kubernetes_test.go | 53 + internal/pkg/compress/compress.go | 112 + internal/pkg/config/auth.go | 63 + internal/pkg/config/config.go | 344 + internal/pkg/constants/talos.go | 22 + internal/pkg/constants/versions.go | 29 + internal/pkg/errgroup/errgroup.go | 81 + internal/pkg/errgroup/errgroup_test.go | 62 + internal/pkg/features/features.go | 66 + internal/pkg/grpcutil/grpcutil.go | 46 + internal/pkg/grpcutil/grpcutil_test.go | 73 + internal/pkg/grpcutil/logger.go | 247 + internal/pkg/grpcutil/logger_test.go | 168 + internal/pkg/grpcutil/server.go | 57 + internal/pkg/grpcutil/stream_interceptors.go | 89 + internal/pkg/image/image.go | 27 + internal/pkg/image/image_test.go | 65 + internal/pkg/kms/kms.go | 54 + .../pkg/kubernetes/resource/kubernetes.go | 87 + internal/pkg/logreceiver/logreceiver.go | 161 + internal/pkg/logreceiver/logreceiver_test.go | 50 + internal/pkg/registry/registry.go | 29 + internal/pkg/resetable/closer.go | 37 + internal/pkg/resetable/closer_test.go | 36 + internal/pkg/siderolink/adapter.go | 139 + internal/pkg/siderolink/export_test.go | 8 + internal/pkg/siderolink/loghandler.go | 289 + internal/pkg/siderolink/loghandler_test.go | 315 + internal/pkg/siderolink/logstorage.go | 142 + internal/pkg/siderolink/logstorage_test.go | 98 + internal/pkg/siderolink/machines.go | 313 + internal/pkg/siderolink/manager.go | 718 + internal/pkg/siderolink/siderolink.go | 7 + internal/pkg/siderolink/siderolink_test.go | 274 + internal/pkg/siderolink/trustd/server.go | 148 + internal/pkg/siderolink/trustd/trustd.go | 121 + internal/pkg/siderolink/wireguard.go | 102 + internal/pkg/test/grpc.go | 55 + internal/pkg/xmocks/xmocks.go | 57 + internal/version/api.go | 11 + internal/version/data/sha | 1 + internal/version/data/tag | 1 + internal/version/version.go | 42 + vetur.config.js | 44 + 1043 files changed, 227162 insertions(+) create mode 100644 .codecov.yml create mode 100644 .conform.yaml create mode 100644 .dockerignore create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yaml create mode 100644 .github/ISSUE_TEMPLATE/feature_request.yaml create mode 100644 .github/workflows/ci.yaml create mode 100644 .github/workflows/e2e-backups-cron.yaml create mode 100644 .github/workflows/e2e-scaling-cron.yaml create mode 100644 .github/workflows/e2e-short-cron.yaml create mode 100644 .github/workflows/e2e-templates-cron.yaml create mode 100644 .github/workflows/e2e-upgrades-cron.yaml create mode 100644 .github/workflows/slack-notify.yaml create mode 100644 .gitignore create mode 100644 .golangci.yml create mode 100644 .kres.yaml create mode 100644 .license-header.go.txt create mode 100644 .markdownlint.json create mode 100644 .vscode/settings.json create mode 100644 CHANGELOG.md create mode 100644 CONTRIBUTING.md create mode 100644 DEVELOPMENT.md create mode 100644 Dockerfile create mode 100644 LICENSE create mode 100644 Makefile create mode 100644 README.md create mode 100644 client/.golangci.yml create mode 100644 client/.license-header.go.txt create mode 100644 client/CONTRIBUTING.md create mode 100644 client/LICENSE create mode 100644 client/README.md create mode 100644 client/api/common/common.proto create mode 100644 client/api/common/omni.pb.go create mode 100644 client/api/common/omni.proto create mode 100644 client/api/common/omni_vtproto.pb.go create mode 100644 client/api/google/rpc/status.proto create mode 100644 client/api/omni/management/management.pb.go create mode 100644 client/api/omni/management/management.pb.gw.go create mode 100644 client/api/omni/management/management.proto create mode 100644 client/api/omni/management/management_grpc.pb.go create mode 100644 client/api/omni/management/management_vtproto.pb.go create mode 100644 client/api/omni/oidc/oidc.pb.go create mode 100644 client/api/omni/oidc/oidc.pb.gw.go create mode 100644 client/api/omni/oidc/oidc.proto create mode 100644 client/api/omni/oidc/oidc_grpc.pb.go create mode 100644 client/api/omni/oidc/oidc_vtproto.pb.go create mode 100644 client/api/omni/resources/resources.pb.go create mode 100644 client/api/omni/resources/resources.pb.gw.go create mode 100644 client/api/omni/resources/resources.proto create mode 100644 client/api/omni/resources/resources_grpc.pb.go create mode 100644 client/api/omni/resources/resources_vtproto.pb.go create mode 100644 client/api/omni/specs/auth.pb.go create mode 100644 client/api/omni/specs/auth.proto create mode 100644 client/api/omni/specs/auth_vtproto.pb.go create mode 100644 client/api/omni/specs/control_plane_status.go create mode 100644 client/api/omni/specs/ephemeral.pb.go create mode 100644 client/api/omni/specs/ephemeral.proto create mode 100644 client/api/omni/specs/ephemeral_vtproto.pb.go create mode 100644 client/api/omni/specs/oidc.pb.go create mode 100644 client/api/omni/specs/oidc.proto create mode 100644 client/api/omni/specs/oidc_vtproto.pb.go create mode 100644 client/api/omni/specs/omni.pb.go create mode 100644 client/api/omni/specs/omni.proto create mode 100644 client/api/omni/specs/omni_vtproto.pb.go create mode 100644 client/api/omni/specs/omni_yaml.go create mode 100644 client/api/omni/specs/siderolink.pb.go create mode 100644 client/api/omni/specs/siderolink.proto create mode 100644 client/api/omni/specs/siderolink_vtproto.pb.go create mode 100644 client/api/omni/specs/system.pb.go create mode 100644 client/api/omni/specs/system.proto create mode 100644 client/api/omni/specs/system_vtproto.pb.go create mode 100644 client/api/omni/specs/virtual.pb.go create mode 100644 client/api/omni/specs/virtual.proto create mode 100644 client/api/omni/specs/virtual_vtproto.pb.go create mode 100644 client/api/talos/machine/machine.pb.gw.go create mode 100644 client/api/talos/machine/machine.proto create mode 100644 client/api/v1alpha1/resource.proto create mode 100644 client/go.mod create mode 100644 client/go.sum create mode 100644 client/pkg/access/access.go create mode 100644 client/pkg/client/client.go create mode 100644 client/pkg/client/example_test.go create mode 100644 client/pkg/client/management/management.go create mode 100644 client/pkg/client/oidc/oidc.go create mode 100644 client/pkg/client/omni/omni.go create mode 100644 client/pkg/client/options.go create mode 100644 client/pkg/client/talos/talos.go create mode 100644 client/pkg/constants/constants.go create mode 100644 client/pkg/constants/debug_disabled.go create mode 100644 client/pkg/constants/debug_enabled.go create mode 100644 client/pkg/constants/talos.go create mode 100644 client/pkg/cosi/labels/labels.go create mode 100644 client/pkg/cosi/labels/labels_test.go create mode 100644 client/pkg/cosi/labels/lexer.go create mode 100644 client/pkg/cosi/labels/parser.go create mode 100644 client/pkg/example_test.go create mode 100644 client/pkg/meta/labels.go create mode 100644 client/pkg/meta/meta.go create mode 100644 client/pkg/omni/resources/auth/access_policy.go create mode 100644 client/pkg/omni/resources/auth/auth.go create mode 100644 client/pkg/omni/resources/auth/config.go create mode 100644 client/pkg/omni/resources/auth/identity.go create mode 100644 client/pkg/omni/resources/auth/labels.go create mode 100644 client/pkg/omni/resources/auth/public_key.go create mode 100644 client/pkg/omni/resources/auth/saml_assertion.go create mode 100644 client/pkg/omni/resources/auth/saml_label_rule.go create mode 100644 client/pkg/omni/resources/auth/user.go create mode 100644 client/pkg/omni/resources/common/common.go create mode 100644 client/pkg/omni/resources/k8s/k8s.go create mode 100644 client/pkg/omni/resources/k8s/kubernetes_resource.go create mode 100644 client/pkg/omni/resources/oidc/jwt_public_key.go create mode 100644 client/pkg/omni/resources/oidc/oidc.go create mode 100644 client/pkg/omni/resources/omni/annotations.go create mode 100644 client/pkg/omni/resources/omni/backup_conf.go create mode 100644 client/pkg/omni/resources/omni/backup_data.go create mode 100644 client/pkg/omni/resources/omni/cluster.go create mode 100644 client/pkg/omni/resources/omni/cluster_bootstrap_status.go create mode 100644 client/pkg/omni/resources/omni/cluster_config_version.go create mode 100644 client/pkg/omni/resources/omni/cluster_destroy_status.go create mode 100644 client/pkg/omni/resources/omni/cluster_endpoint.go create mode 100644 client/pkg/omni/resources/omni/cluster_machine.go create mode 100644 client/pkg/omni/resources/omni/cluster_machine_config.go create mode 100644 client/pkg/omni/resources/omni/cluster_machine_config_patches.go create mode 100644 client/pkg/omni/resources/omni/cluster_machine_config_patches_test.go create mode 100644 client/pkg/omni/resources/omni/cluster_machine_config_status.go create mode 100644 client/pkg/omni/resources/omni/cluster_machine_encryption_key.go create mode 100644 client/pkg/omni/resources/omni/cluster_machine_identity.go create mode 100644 client/pkg/omni/resources/omni/cluster_machine_installer_options.go create mode 100644 client/pkg/omni/resources/omni/cluster_machine_status.go create mode 100644 client/pkg/omni/resources/omni/cluster_machine_template.go create mode 100644 client/pkg/omni/resources/omni/cluster_status.go create mode 100644 client/pkg/omni/resources/omni/cluster_uuid.go create mode 100644 client/pkg/omni/resources/omni/config_patch.go create mode 100644 client/pkg/omni/resources/omni/config_patch_test.go create mode 100644 client/pkg/omni/resources/omni/control_plane_status.go create mode 100644 client/pkg/omni/resources/omni/etcd_audit_result.go create mode 100644 client/pkg/omni/resources/omni/etcd_backup.go create mode 100644 client/pkg/omni/resources/omni/etcd_backup_conf_status.go create mode 100644 client/pkg/omni/resources/omni/etcd_backup_encryption.go create mode 100644 client/pkg/omni/resources/omni/etcd_backup_overall_status.go create mode 100644 client/pkg/omni/resources/omni/etcd_backup_status.go create mode 100644 client/pkg/omni/resources/omni/etcd_manual_backup.go create mode 100644 client/pkg/omni/resources/omni/exposed_service.go create mode 100644 client/pkg/omni/resources/omni/features_config.go create mode 100644 client/pkg/omni/resources/omni/image_pull_request.go create mode 100644 client/pkg/omni/resources/omni/image_pull_status.go create mode 100644 client/pkg/omni/resources/omni/installation_media.go create mode 100644 client/pkg/omni/resources/omni/kubeconfig.go create mode 100644 client/pkg/omni/resources/omni/kubernetes_status.go create mode 100644 client/pkg/omni/resources/omni/kubernetes_upgrade_manifest_status.go create mode 100644 client/pkg/omni/resources/omni/kubernetes_upgrade_status.go create mode 100644 client/pkg/omni/resources/omni/kubernetes_version.go create mode 100644 client/pkg/omni/resources/omni/labels.go create mode 100644 client/pkg/omni/resources/omni/loadbalancer_config.go create mode 100644 client/pkg/omni/resources/omni/loadbalancer_status.go create mode 100644 client/pkg/omni/resources/omni/machine.go create mode 100644 client/pkg/omni/resources/omni/machine_class.go create mode 100644 client/pkg/omni/resources/omni/machine_config_gen_options.go create mode 100644 client/pkg/omni/resources/omni/machine_labels.go create mode 100644 client/pkg/omni/resources/omni/machine_set.go create mode 100644 client/pkg/omni/resources/omni/machine_set_destroy_status.go create mode 100644 client/pkg/omni/resources/omni/machine_set_node.go create mode 100644 client/pkg/omni/resources/omni/machine_set_status.go create mode 100644 client/pkg/omni/resources/omni/machine_status.go create mode 100644 client/pkg/omni/resources/omni/machine_status_link.go create mode 100644 client/pkg/omni/resources/omni/machine_status_snapshot.go create mode 100644 client/pkg/omni/resources/omni/machine_status_test.go create mode 100644 client/pkg/omni/resources/omni/omni.go create mode 100644 client/pkg/omni/resources/omni/ongoing_task.go create mode 100644 client/pkg/omni/resources/omni/redacted_cluster_machine_config.go create mode 100644 client/pkg/omni/resources/omni/schematic.go create mode 100644 client/pkg/omni/resources/omni/schematic_configuration.go create mode 100644 client/pkg/omni/resources/omni/secrets.go create mode 100644 client/pkg/omni/resources/omni/talos_extensions.go create mode 100644 client/pkg/omni/resources/omni/talos_upgrade_status.go create mode 100644 client/pkg/omni/resources/omni/talos_version.go create mode 100644 client/pkg/omni/resources/omni/talosconfig.go create mode 100644 client/pkg/omni/resources/registry/registry.go create mode 100644 client/pkg/omni/resources/resources.go create mode 100644 client/pkg/omni/resources/siderolink/config.go create mode 100644 client/pkg/omni/resources/siderolink/connection_params.go create mode 100644 client/pkg/omni/resources/siderolink/link.go create mode 100644 client/pkg/omni/resources/siderolink/linkcounter.go create mode 100644 client/pkg/omni/resources/siderolink/siderolink.go create mode 100644 client/pkg/omni/resources/system/cert_refresh_tick.go create mode 100644 client/pkg/omni/resources/system/dbversion.go create mode 100644 client/pkg/omni/resources/system/system.go create mode 100644 client/pkg/omni/resources/system/sysversion.go create mode 100644 client/pkg/omni/resources/virtual/cluster_permissions.go create mode 100644 client/pkg/omni/resources/virtual/current_user.go create mode 100644 client/pkg/omni/resources/virtual/kubernetes_usage.go create mode 100644 client/pkg/omni/resources/virtual/permissions.go create mode 100644 client/pkg/omni/resources/virtual/virtual.go create mode 100644 client/pkg/omnictl/apply.go create mode 100644 client/pkg/omnictl/cluster.go create mode 100644 client/pkg/omnictl/cluster/cluster.go create mode 100644 client/pkg/omnictl/cluster/delete.go create mode 100644 client/pkg/omnictl/cluster/kubernetes/kubernetes.go create mode 100644 client/pkg/omnictl/cluster/kubernetes/manifest-sync.go create mode 100644 client/pkg/omnictl/cluster/kubernetes/upgrade-pre-checks.go create mode 100644 client/pkg/omnictl/cluster/machine.go create mode 100644 client/pkg/omnictl/cluster/status.go create mode 100644 client/pkg/omnictl/cluster/template/delete.go create mode 100644 client/pkg/omnictl/cluster/template/diff.go create mode 100644 client/pkg/omnictl/cluster/template/export.go create mode 100644 client/pkg/omnictl/cluster/template/render.go create mode 100644 client/pkg/omnictl/cluster/template/status.go create mode 100644 client/pkg/omnictl/cluster/template/sync.go create mode 100644 client/pkg/omnictl/cluster/template/template.go create mode 100644 client/pkg/omnictl/cluster/template/validate.go create mode 100644 client/pkg/omnictl/common.go create mode 100644 client/pkg/omnictl/config.go create mode 100644 client/pkg/omnictl/config/config.go create mode 100644 client/pkg/omnictl/config/rename.go create mode 100644 client/pkg/omnictl/config/types.go create mode 100644 client/pkg/omnictl/delete.go create mode 100644 client/pkg/omnictl/docs.go create mode 100644 client/pkg/omnictl/download.go create mode 100644 client/pkg/omnictl/get.go create mode 100644 client/pkg/omnictl/internal/access/access.go create mode 100644 client/pkg/omnictl/internal/access/client.go create mode 100644 client/pkg/omnictl/internal/access/context.go create mode 100644 client/pkg/omnictl/internal/access/flags.go create mode 100644 client/pkg/omnictl/kubeconfig.go create mode 100644 client/pkg/omnictl/logformat/dmesg.go create mode 100644 client/pkg/omnictl/logformat/omni.go create mode 100644 client/pkg/omnictl/logformat/raw.go create mode 100644 client/pkg/omnictl/machine-logs.go create mode 100644 client/pkg/omnictl/output/json.go create mode 100644 client/pkg/omnictl/output/jsonpath.go create mode 100644 client/pkg/omnictl/output/output.go create mode 100644 client/pkg/omnictl/output/table.go create mode 100644 client/pkg/omnictl/output/yaml.go create mode 100644 client/pkg/omnictl/root.go create mode 100644 client/pkg/omnictl/serviceaccount.go create mode 100644 client/pkg/omnictl/talosconfig.go create mode 100644 client/pkg/runtime/runtime.go create mode 100644 client/pkg/template/internal/models/cluster.go create mode 100644 client/pkg/template/internal/models/controlplane.go create mode 100644 client/pkg/template/internal/models/list.go create mode 100644 client/pkg/template/internal/models/machine.go create mode 100644 client/pkg/template/internal/models/machineset.go create mode 100644 client/pkg/template/internal/models/models.go create mode 100644 client/pkg/template/internal/models/patch.go create mode 100644 client/pkg/template/internal/models/workers.go create mode 100644 client/pkg/template/operations/delete.go create mode 100644 client/pkg/template/operations/diff.go create mode 100644 client/pkg/template/operations/export.go create mode 100644 client/pkg/template/operations/export_test.go create mode 100644 client/pkg/template/operations/internal/statustree/helpers.go create mode 100644 client/pkg/template/operations/internal/statustree/statustree.go create mode 100644 client/pkg/template/operations/internal/utils/utils.go create mode 100644 client/pkg/template/operations/operations.go create mode 100644 client/pkg/template/operations/render.go create mode 100644 client/pkg/template/operations/status.go create mode 100644 client/pkg/template/operations/sync.go create mode 100644 client/pkg/template/operations/testdata/export/cluster-resources.yaml create mode 100644 client/pkg/template/operations/testdata/export/cluster-template.yaml create mode 100644 client/pkg/template/operations/validate.go create mode 100644 client/pkg/template/order.go create mode 100644 client/pkg/template/sync.go create mode 100644 client/pkg/template/template.go create mode 100644 client/pkg/template/template_test.go create mode 100644 client/pkg/template/testdata/cluster-bad-yaml1.yaml create mode 100644 client/pkg/template/testdata/cluster-bad-yaml2.yaml create mode 100644 client/pkg/template/testdata/cluster-bad-yaml3.yaml create mode 100644 client/pkg/template/testdata/cluster-invalid-bootstrapspec.yaml create mode 100644 client/pkg/template/testdata/cluster-invalid1.yaml create mode 100644 client/pkg/template/testdata/cluster-invalid2.yaml create mode 100644 client/pkg/template/testdata/cluster-invalid3.yaml create mode 100644 client/pkg/template/testdata/cluster-invalid4.yaml create mode 100644 client/pkg/template/testdata/cluster-valid-bootstrapspec-resources.yaml create mode 100644 client/pkg/template/testdata/cluster-valid-bootstrapspec.yaml create mode 100644 client/pkg/template/testdata/cluster1-resources.yaml create mode 100644 client/pkg/template/testdata/cluster1.yaml create mode 100644 client/pkg/template/testdata/cluster2-resources.yaml create mode 100644 client/pkg/template/testdata/cluster2.yaml create mode 100644 client/pkg/template/testdata/cluster3-resources.yaml create mode 100644 client/pkg/template/testdata/cluster3.yaml create mode 100644 client/pkg/template/testdata/patches/invalid.yaml create mode 100644 client/pkg/template/testdata/patches/my-cluster-patch.yaml create mode 100644 client/pkg/template/testdata/patches/my-cp-patch.yaml create mode 100644 client/pkg/template/testdata/patches/my-registry-mirrors.yaml create mode 100644 client/pkg/template/testdata/patches/prohibited.yaml create mode 100644 client/pkg/version/version.go create mode 100644 cmd/omni-integration-test/main.go create mode 100644 cmd/omni-integration-test/pkg/clientconfig/clientconfig.go create mode 100644 cmd/omni-integration-test/pkg/clientconfig/register_key_debug.go create mode 100644 cmd/omni-integration-test/pkg/clientconfig/register_key_no_debug.go create mode 100644 cmd/omni-integration-test/pkg/tests/auth.go create mode 100644 cmd/omni-integration-test/pkg/tests/backup.go create mode 100644 cmd/omni-integration-test/pkg/tests/blocks.go create mode 100644 cmd/omni-integration-test/pkg/tests/cleanup.go create mode 100644 cmd/omni-integration-test/pkg/tests/cluster.go create mode 100644 cmd/omni-integration-test/pkg/tests/common.go create mode 100644 cmd/omni-integration-test/pkg/tests/config_patch.go create mode 100644 cmd/omni-integration-test/pkg/tests/extensions.go create mode 100644 cmd/omni-integration-test/pkg/tests/image.go create mode 100644 cmd/omni-integration-test/pkg/tests/kubernetes.go create mode 100644 cmd/omni-integration-test/pkg/tests/machines.go create mode 100644 cmd/omni-integration-test/pkg/tests/omniconfig.go create mode 100644 cmd/omni-integration-test/pkg/tests/rolling_update.go create mode 100644 cmd/omni-integration-test/pkg/tests/siderolink.go create mode 100644 cmd/omni-integration-test/pkg/tests/talos.go create mode 100644 cmd/omni-integration-test/pkg/tests/template.go create mode 100644 cmd/omni-integration-test/pkg/tests/testdata/cluster-1.tmpl.yaml create mode 100644 cmd/omni-integration-test/pkg/tests/testdata/cluster-2.tmpl.yaml create mode 100644 cmd/omni-integration-test/pkg/tests/tests.go create mode 100644 cmd/omni-integration-test/pkg/tests/utils.go create mode 100644 cmd/omni-integration-test/root.go create mode 100644 cmd/omni/main.go create mode 100644 cmd/omnictl/main.go create mode 100644 docs/context.md create mode 100644 docs/examples/template/cluster1.yaml create mode 100644 frontend/.eslintrc.yaml create mode 100644 frontend/.gitignore create mode 100644 frontend/LICENSE create mode 100644 frontend/babel.config.js create mode 100644 frontend/jest.config.js create mode 100644 frontend/package-lock.json create mode 100644 frontend/package.json create mode 100644 frontend/postcss.config.js create mode 100644 frontend/public/favicon.ico create mode 100644 frontend/public/index.html create mode 100644 frontend/src/App.vue create mode 100644 frontend/src/AppUnavailable.vue create mode 100644 frontend/src/api/common/common.pb.ts create mode 100644 frontend/src/api/common/common.proto create mode 100644 frontend/src/api/common/omni.pb.ts create mode 100644 frontend/src/api/fetch.pb.ts create mode 100644 frontend/src/api/google/protobuf/any.pb.ts create mode 100644 frontend/src/api/google/protobuf/any.proto create mode 100644 frontend/src/api/google/protobuf/duration.pb.ts create mode 100644 frontend/src/api/google/protobuf/duration.proto create mode 100644 frontend/src/api/google/protobuf/empty.pb.ts create mode 100644 frontend/src/api/google/protobuf/empty.proto create mode 100644 frontend/src/api/google/protobuf/timestamp.pb.ts create mode 100644 frontend/src/api/google/protobuf/timestamp.proto create mode 100644 frontend/src/api/google/rpc/code.pb.ts create mode 100644 frontend/src/api/google/rpc/code.proto create mode 100644 frontend/src/api/google/rpc/status.pb.ts create mode 100644 frontend/src/api/google/rpc/status.proto create mode 100644 frontend/src/api/grpc.ts create mode 100644 frontend/src/api/omni/auth/auth.pb.ts create mode 100644 frontend/src/api/omni/auth/auth.proto create mode 100644 frontend/src/api/omni/config/context.pb.ts create mode 100644 frontend/src/api/omni/management/management.pb.ts create mode 100644 frontend/src/api/omni/oidc/oidc.pb.ts create mode 100644 frontend/src/api/omni/resources/resources.pb.ts create mode 100644 frontend/src/api/omni/specs/auth.pb.ts create mode 100644 frontend/src/api/omni/specs/ephemeral.pb.ts create mode 100644 frontend/src/api/omni/specs/omni.pb.ts create mode 100644 frontend/src/api/omni/specs/siderolink.pb.ts create mode 100644 frontend/src/api/omni/specs/system.pb.ts create mode 100644 frontend/src/api/omni/specs/virtual.pb.ts create mode 100644 frontend/src/api/options.ts create mode 100644 frontend/src/api/resources.ts create mode 100644 frontend/src/api/talos/machine/machine.pb.ts create mode 100644 frontend/src/api/talos/machine/machine.proto create mode 100644 frontend/src/api/v1alpha1/resource.pb.ts create mode 100644 frontend/src/api/v1alpha1/resource.proto create mode 100644 frontend/src/api/watch.ts create mode 100644 frontend/src/components/SideBar/TSideBar.vue create mode 100644 frontend/src/components/SideBar/TSideBarList.vue create mode 100644 frontend/src/components/SideBar/TSideBarNodesLogs.vue create mode 100644 frontend/src/components/TAlert.vue create mode 100644 frontend/src/components/TBreadcrumbs.vue create mode 100644 frontend/src/components/THeader/THeader.vue create mode 100644 frontend/src/components/TModal.vue create mode 100644 frontend/src/components/common/ActionsBox/TActionsBox.vue create mode 100644 frontend/src/components/common/ActionsBox/TActionsBoxItem.vue create mode 100644 frontend/src/components/common/Animation/TAnimation.vue create mode 100644 frontend/src/components/common/Animation/TGroupAnimation.vue create mode 100644 frontend/src/components/common/Button/IconButton.vue create mode 100644 frontend/src/components/common/Button/TButton.vue create mode 100644 frontend/src/components/common/Button/TButtonGroup.vue create mode 100644 frontend/src/components/common/Charts/RadialBar.vue create mode 100644 frontend/src/components/common/Checkbox/TCheckbox.vue create mode 100644 frontend/src/components/common/CodeEditor/CodeEditor.vue create mode 100644 frontend/src/components/common/Icon/TIcon.vue create mode 100644 frontend/src/components/common/InfoLabel/TInfoLabel.vue create mode 100644 frontend/src/components/common/Labels/Labels.vue create mode 100644 frontend/src/components/common/List/TList.vue create mode 100644 frontend/src/components/common/List/TListItem.vue create mode 100644 frontend/src/components/common/LogViewer/LogViewer.vue create mode 100644 frontend/src/components/common/MenuItem/TMenuItem.vue create mode 100644 frontend/src/components/common/Notification/TNotification.vue create mode 100644 frontend/src/components/common/OngoingTasks/OngoingTasks.vue create mode 100644 frontend/src/components/common/PageHeader.vue create mode 100644 frontend/src/components/common/Pagination/TPagination.vue create mode 100644 frontend/src/components/common/SelectList/TSelectList.vue create mode 100644 frontend/src/components/common/Shell/TShell.vue create mode 100644 frontend/src/components/common/SlideDownWrapper/TSlideDownWrapper.vue create mode 100644 frontend/src/components/common/Spinner/TSpinner.vue create mode 100644 frontend/src/components/common/Status/TStatus.vue create mode 100644 frontend/src/components/common/Suspended/TSuspended.vue create mode 100644 frontend/src/components/common/TInput/TInput.vue create mode 100644 frontend/src/components/common/Tabs/TabButton.vue create mode 100644 frontend/src/components/common/Tabs/TabList.vue create mode 100644 frontend/src/components/common/Tabs/TabsHeader.vue create mode 100644 frontend/src/components/common/Tag/TTag.vue create mode 100644 frontend/src/components/common/Tooltip/Tooltip.vue create mode 100644 frontend/src/components/common/UserInfo/UserInfo.vue create mode 100644 frontend/src/components/common/Watch/Watch.vue create mode 100644 frontend/src/components/icons/IconAWS.vue create mode 100644 frontend/src/components/icons/IconActionHorizontal.vue create mode 100644 frontend/src/components/icons/IconActionVertical.vue create mode 100644 frontend/src/components/icons/IconArrowDown.vue create mode 100644 frontend/src/components/icons/IconArrowLeft.vue create mode 100644 frontend/src/components/icons/IconArrowRight.vue create mode 100644 frontend/src/components/icons/IconArrowRightSquare.vue create mode 100644 frontend/src/components/icons/IconArrowUp.vue create mode 100644 frontend/src/components/icons/IconAttention.vue create mode 100644 frontend/src/components/icons/IconBox.vue create mode 100644 frontend/src/components/icons/IconChange.vue create mode 100644 frontend/src/components/icons/IconCheck.vue create mode 100644 frontend/src/components/icons/IconCheckInCircle.vue create mode 100644 frontend/src/components/icons/IconCheckInCircleClassic.vue create mode 100644 frontend/src/components/icons/IconClose.vue create mode 100644 frontend/src/components/icons/IconCloudConnection.vue create mode 100644 frontend/src/components/icons/IconClusters.vue create mode 100644 frontend/src/components/icons/IconClustersBig.vue create mode 100644 frontend/src/components/icons/IconComplete.vue create mode 100644 frontend/src/components/icons/IconCopy.vue create mode 100644 frontend/src/components/icons/IconDashboard.vue create mode 100644 frontend/src/components/icons/IconDelete.vue create mode 100644 frontend/src/components/icons/IconDot.vue create mode 100644 frontend/src/components/icons/IconDropRight.vue create mode 100644 frontend/src/components/icons/IconDropUp.vue create mode 100644 frontend/src/components/icons/IconDropdown.vue create mode 100644 frontend/src/components/icons/IconEdit.vue create mode 100644 frontend/src/components/icons/IconError.vue create mode 100644 frontend/src/components/icons/IconExternalLink.vue create mode 100644 frontend/src/components/icons/IconFailAuth.vue create mode 100644 frontend/src/components/icons/IconGCP.vue create mode 100644 frontend/src/components/icons/IconHeaderDropdownLoading.vue create mode 100644 frontend/src/components/icons/IconHeaderLogo.vue create mode 100644 frontend/src/components/icons/IconHome.vue create mode 100644 frontend/src/components/icons/IconInProgress.vue create mode 100644 frontend/src/components/icons/IconInfo.vue create mode 100644 frontend/src/components/icons/IconKey.vue create mode 100644 frontend/src/components/icons/IconKubeConfig.vue create mode 100644 frontend/src/components/icons/IconKubernetes.vue create mode 100644 frontend/src/components/icons/IconLinkDown.vue create mode 100644 frontend/src/components/icons/IconLoading.vue create mode 100644 frontend/src/components/icons/IconLog.vue create mode 100644 frontend/src/components/icons/IconLogo.vue create mode 100644 frontend/src/components/icons/IconLongArrowDown.vue create mode 100644 frontend/src/components/icons/IconLongArrowLeft.vue create mode 100644 frontend/src/components/icons/IconLongArrowRight.vue create mode 100644 frontend/src/components/icons/IconLongArrowTop.vue create mode 100644 frontend/src/components/icons/IconMinus.vue create mode 100644 frontend/src/components/icons/IconNoConnection.vue create mode 100644 frontend/src/components/icons/IconNodes.vue create mode 100644 frontend/src/components/icons/IconOngoingTasks.vue create mode 100644 frontend/src/components/icons/IconOverview.vue create mode 100644 frontend/src/components/icons/IconPin.vue create mode 100644 frontend/src/components/icons/IconPlus.vue create mode 100644 frontend/src/components/icons/IconPodes.vue create mode 100644 frontend/src/components/icons/IconQuestion.vue create mode 100644 frontend/src/components/icons/IconReboot.vue create mode 100644 frontend/src/components/icons/IconRefresh.vue create mode 100644 frontend/src/components/icons/IconReset.vue create mode 100644 frontend/src/components/icons/IconRollback.vue create mode 100644 frontend/src/components/icons/IconSearch.vue create mode 100644 frontend/src/components/icons/IconSettings.vue create mode 100644 frontend/src/components/icons/IconSettingsToggle.vue create mode 100644 frontend/src/components/icons/IconSidero.vue create mode 100644 frontend/src/components/icons/IconSideroMonochrome.vue create mode 100644 frontend/src/components/icons/IconTalosConfig.vue create mode 100644 frontend/src/components/icons/IconTask.vue create mode 100644 frontend/src/components/icons/IconTerminal.vue create mode 100644 frontend/src/components/icons/IconTime.vue create mode 100644 frontend/src/components/icons/IconUnknown.vue create mode 100644 frontend/src/components/icons/IconUnlink.vue create mode 100644 frontend/src/components/icons/IconUpgradeEmptyState.vue create mode 100644 frontend/src/components/icons/IconUpload.vue create mode 100644 frontend/src/components/icons/IconWaiting.vue create mode 100644 frontend/src/components/icons/IconWarning.vue create mode 100644 frontend/src/components/icons/IconWarningClear.vue create mode 100644 frontend/src/constants/index.ts create mode 100644 frontend/src/context.ts create mode 100644 frontend/src/fonts.css create mode 100644 frontend/src/fonts/KFOlCnqEu92Fr1MmEU9fABc4EsA.woff2 create mode 100644 frontend/src/fonts/KFOlCnqEu92Fr1MmEU9fBBc4.woff2 create mode 100644 frontend/src/fonts/KFOlCnqEu92Fr1MmEU9fBxc4EsA.woff2 create mode 100644 frontend/src/fonts/KFOlCnqEu92Fr1MmEU9fCBc4EsA.woff2 create mode 100644 frontend/src/fonts/KFOlCnqEu92Fr1MmEU9fCRc4EsA.woff2 create mode 100644 frontend/src/fonts/KFOlCnqEu92Fr1MmEU9fChc4EsA.woff2 create mode 100644 frontend/src/fonts/KFOlCnqEu92Fr1MmEU9fCxc4EsA.woff2 create mode 100644 frontend/src/fonts/KFOlCnqEu92Fr1MmSU5fABc4EsA.woff2 create mode 100644 frontend/src/fonts/KFOlCnqEu92Fr1MmSU5fBBc4.woff2 create mode 100644 frontend/src/fonts/KFOlCnqEu92Fr1MmSU5fBxc4EsA.woff2 create mode 100644 frontend/src/fonts/KFOlCnqEu92Fr1MmSU5fCBc4EsA.woff2 create mode 100644 frontend/src/fonts/KFOlCnqEu92Fr1MmSU5fCRc4EsA.woff2 create mode 100644 frontend/src/fonts/KFOlCnqEu92Fr1MmSU5fChc4EsA.woff2 create mode 100644 frontend/src/fonts/KFOlCnqEu92Fr1MmSU5fCxc4EsA.woff2 create mode 100644 frontend/src/fonts/KFOlCnqEu92Fr1MmWUlfABc4EsA.woff2 create mode 100644 frontend/src/fonts/KFOlCnqEu92Fr1MmWUlfBBc4.woff2 create mode 100644 frontend/src/fonts/KFOlCnqEu92Fr1MmWUlfBxc4EsA.woff2 create mode 100644 frontend/src/fonts/KFOlCnqEu92Fr1MmWUlfCBc4EsA.woff2 create mode 100644 frontend/src/fonts/KFOlCnqEu92Fr1MmWUlfCRc4EsA.woff2 create mode 100644 frontend/src/fonts/KFOlCnqEu92Fr1MmWUlfChc4EsA.woff2 create mode 100644 frontend/src/fonts/KFOlCnqEu92Fr1MmWUlfCxc4EsA.woff2 create mode 100644 frontend/src/fonts/KFOmCnqEu92Fr1Mu4WxKOzY.woff2 create mode 100644 frontend/src/fonts/KFOmCnqEu92Fr1Mu4mxK.woff2 create mode 100644 frontend/src/fonts/KFOmCnqEu92Fr1Mu5mxKOzY.woff2 create mode 100644 frontend/src/fonts/KFOmCnqEu92Fr1Mu72xKOzY.woff2 create mode 100644 frontend/src/fonts/KFOmCnqEu92Fr1Mu7GxKOzY.woff2 create mode 100644 frontend/src/fonts/KFOmCnqEu92Fr1Mu7WxKOzY.woff2 create mode 100644 frontend/src/fonts/KFOmCnqEu92Fr1Mu7mxKOzY.woff2 create mode 100644 frontend/src/fonts/L0x5DF4xlVMF-BfR8bXMIjhEq3-OXg.woff2 create mode 100644 frontend/src/fonts/L0x5DF4xlVMF-BfR8bXMIjhFq3-OXg.woff2 create mode 100644 frontend/src/fonts/L0x5DF4xlVMF-BfR8bXMIjhGq3-OXg.woff2 create mode 100644 frontend/src/fonts/L0x5DF4xlVMF-BfR8bXMIjhIq3-OXg.woff2 create mode 100644 frontend/src/fonts/L0x5DF4xlVMF-BfR8bXMIjhLq38.woff2 create mode 100644 frontend/src/fonts/L0x5DF4xlVMF-BfR8bXMIjhPq3-OXg.woff2 create mode 100644 frontend/src/fonts/L0x7DF4xlVMF-BfR8bXMIjhOm32WWg.woff2 create mode 100644 frontend/src/fonts/L0x7DF4xlVMF-BfR8bXMIjhOm36WWoKC.woff2 create mode 100644 frontend/src/fonts/L0x7DF4xlVMF-BfR8bXMIjhOm3CWWoKC.woff2 create mode 100644 frontend/src/fonts/L0x7DF4xlVMF-BfR8bXMIjhOm3KWWoKC.woff2 create mode 100644 frontend/src/fonts/L0x7DF4xlVMF-BfR8bXMIjhOm3OWWoKC.woff2 create mode 100644 frontend/src/fonts/L0x7DF4xlVMF-BfR8bXMIjhOm3mWWoKC.woff2 create mode 100644 frontend/src/index.css create mode 100644 frontend/src/main.ts create mode 100644 frontend/src/methods/auth.ts create mode 100644 frontend/src/methods/cluster.ts create mode 100644 frontend/src/methods/features.ts create mode 100644 frontend/src/methods/index.ts create mode 100644 frontend/src/methods/key.ts create mode 100644 frontend/src/methods/labels.ts create mode 100644 frontend/src/methods/logs.ts create mode 100644 frontend/src/methods/machine.ts create mode 100644 frontend/src/methods/machineset.ts create mode 100644 frontend/src/methods/node.ts create mode 100644 frontend/src/methods/storage.ts create mode 100644 frontend/src/methods/time.ts create mode 100644 frontend/src/methods/title.ts create mode 100644 frontend/src/methods/user.ts create mode 100644 frontend/src/modal.ts create mode 100644 frontend/src/notification.ts create mode 100644 frontend/src/router/index.ts create mode 100644 frontend/src/schemas/config.schema.json create mode 100644 frontend/src/shims-vue.d.ts create mode 100644 frontend/src/states/cluster-management/index.ts create mode 100644 frontend/src/theme.ts create mode 100644 frontend/src/vars/colors.js create mode 100644 frontend/src/views/cluster/Backups/Backups.vue create mode 100644 frontend/src/views/cluster/Backups/BackupsList.vue create mode 100644 frontend/src/views/cluster/ClusterMachines/ClusterMachine.vue create mode 100644 frontend/src/views/cluster/ClusterMachines/ClusterMachinePhase.vue create mode 100644 frontend/src/views/cluster/ClusterMachines/ClusterMachines.vue create mode 100644 frontend/src/views/cluster/ClusterMachines/MachineSet.vue create mode 100644 frontend/src/views/cluster/ClusterMachines/MachineSetPhase.vue create mode 100644 frontend/src/views/cluster/ClusterScoped.vue create mode 100644 frontend/src/views/cluster/Config/PatchEdit.vue create mode 100644 frontend/src/views/cluster/Config/Patches.vue create mode 100644 frontend/src/views/cluster/ExposedService/ExposedService.vue create mode 100644 frontend/src/views/cluster/ExposedService/ExposedServiceSideBar.vue create mode 100644 frontend/src/views/cluster/ManagedByTemplatesWarning.vue create mode 100644 frontend/src/views/cluster/Manifest/Sync.vue create mode 100644 frontend/src/views/cluster/Nodes/NodeConfig.vue create mode 100644 frontend/src/views/cluster/Nodes/NodeDetails.vue create mode 100644 frontend/src/views/cluster/Nodes/NodeLogs.vue create mode 100644 frontend/src/views/cluster/Nodes/NodeMonitor.vue create mode 100644 frontend/src/views/cluster/Nodes/NodeMounts.vue create mode 100644 frontend/src/views/cluster/Nodes/NodeOverview.vue create mode 100644 frontend/src/views/cluster/Nodes/NodesHeader.vue create mode 100644 frontend/src/views/cluster/Nodes/NodesList.vue create mode 100644 frontend/src/views/cluster/Nodes/components/NodeDetailsTabs.vue create mode 100644 frontend/src/views/cluster/Nodes/components/NodesItem.vue create mode 100644 frontend/src/views/cluster/Nodes/components/NodesMonitorChart.vue create mode 100644 frontend/src/views/cluster/Overview/Overview.vue create mode 100644 frontend/src/views/cluster/Overview/components/OverviewCircleChart/OverviewCircleChart.vue create mode 100644 frontend/src/views/cluster/Overview/components/OverviewCircleChart/OverviewCircleChartItem.vue create mode 100644 frontend/src/views/cluster/Overview/components/OverviewContent.vue create mode 100644 frontend/src/views/cluster/Overview/components/OverviewRightPanel/OverviewRightPanel.vue create mode 100644 frontend/src/views/cluster/Overview/components/OverviewRightPanel/OverviewRightPanelCondition.vue create mode 100644 frontend/src/views/cluster/Overview/components/OverviewRightPanel/OverviewRightPanelItem.vue create mode 100644 frontend/src/views/cluster/Pods/TPods.vue create mode 100644 frontend/src/views/cluster/Pods/components/TPodsItem.vue create mode 100644 frontend/src/views/cluster/Pods/components/TPodsList.vue create mode 100644 frontend/src/views/cluster/SideBar.vue create mode 100644 frontend/src/views/cluster/SideBarNode.vue create mode 100644 frontend/src/views/common/Forbidden.vue create mode 100644 frontend/src/views/common/NodeContextMenu.vue create mode 100644 frontend/src/views/common/PageNotFound.vue create mode 100644 frontend/src/views/omni/Auth/Authenticate.vue create mode 100644 frontend/src/views/omni/Auth/OIDC.vue create mode 100644 frontend/src/views/omni/Clusters/ClusterBottomMenu.vue create mode 100644 frontend/src/views/omni/Clusters/ClusterEtcdBackupCheckbox.vue create mode 100644 frontend/src/views/omni/Clusters/ClusterItem.vue create mode 100644 frontend/src/views/omni/Clusters/ClusterMenu.vue create mode 100644 frontend/src/views/omni/Clusters/ClusterStatus.vue create mode 100644 frontend/src/views/omni/Clusters/ClusterWorkloadProxyingCheckbox.vue create mode 100644 frontend/src/views/omni/Clusters/Clusters.vue create mode 100644 frontend/src/views/omni/Clusters/Management/ClusterCreate.vue create mode 100644 frontend/src/views/omni/Clusters/Management/ClusterMachineItem.vue create mode 100644 frontend/src/views/omni/Clusters/Management/ClusterScale.vue create mode 100644 frontend/src/views/omni/Clusters/Management/MachineSetConfig.vue create mode 100644 frontend/src/views/omni/Clusters/Management/MachineSetLabel.vue create mode 100644 frontend/src/views/omni/Clusters/Management/MachineSetPicker.vue create mode 100644 frontend/src/views/omni/Clusters/Management/MachineSets.vue create mode 100644 frontend/src/views/omni/ItemLabels/ItemLabel.vue create mode 100644 frontend/src/views/omni/ItemLabels/ItemLabels.vue create mode 100644 frontend/src/views/omni/MachineClasses/MachineClass.vue create mode 100644 frontend/src/views/omni/MachineClasses/MachineClasses.vue create mode 100644 frontend/src/views/omni/MachineClasses/MachineClassesList.vue create mode 100644 frontend/src/views/omni/MachineClasses/MachineMatchItem.vue create mode 100644 frontend/src/views/omni/Machines/MachineItem.vue create mode 100644 frontend/src/views/omni/Machines/MachineLogs.vue create mode 100644 frontend/src/views/omni/Machines/MachineLogsContainer.vue create mode 100644 frontend/src/views/omni/Machines/Machines.vue create mode 100644 frontend/src/views/omni/Modals/CloseButton.vue create mode 100644 frontend/src/views/omni/Modals/ClusterDestroy.vue create mode 100644 frontend/src/views/omni/Modals/ConfigPatchDestroy.vue create mode 100644 frontend/src/views/omni/Modals/ConfigPatchEdit.vue create mode 100644 frontend/src/views/omni/Modals/DownloadInstallationMedia.vue create mode 100644 frontend/src/views/omni/Modals/DownloadOmnictl.vue create mode 100644 frontend/src/views/omni/Modals/DownloadTalosctl.vue create mode 100644 frontend/src/views/omni/Modals/MachineClassDestroy.vue create mode 100644 frontend/src/views/omni/Modals/MachineRemove.vue create mode 100644 frontend/src/views/omni/Modals/MachineSetDestroy.vue create mode 100644 frontend/src/views/omni/Modals/NodeDestroy.vue create mode 100644 frontend/src/views/omni/Modals/NodeDestroyCancel.vue create mode 100644 frontend/src/views/omni/Modals/NodeReboot.vue create mode 100644 frontend/src/views/omni/Modals/NodeShutdown.vue create mode 100644 frontend/src/views/omni/Modals/UntaintSingleNode.vue create mode 100644 frontend/src/views/omni/Modals/UpdateKubernetes.vue create mode 100644 frontend/src/views/omni/Modals/UpdateTalos.vue create mode 100644 frontend/src/views/omni/Modals/UserCreate.vue create mode 100644 frontend/src/views/omni/Modals/UserDestroy.vue create mode 100644 frontend/src/views/omni/Modals/UserEdit.vue create mode 100644 frontend/src/views/omni/Overview/Overview.vue create mode 100644 frontend/src/views/omni/Settings/BackupStorage.vue create mode 100644 frontend/src/views/omni/SideBar.vue create mode 100644 frontend/src/views/omni/Users/UserItem.vue create mode 100644 frontend/src/views/omni/Users/Users.vue create mode 100644 frontend/tailwind.config.js create mode 100644 frontend/tests/unit/clusterManageState.spec.ts create mode 100644 frontend/tests/unit/watch.spec.ts create mode 100644 frontend/tsconfig.json create mode 100644 frontend/vue.config.js create mode 100644 go.mod create mode 100644 go.sum create mode 100644 hack/certs/localhost-key.pem create mode 100644 hack/certs/localhost.pem create mode 100644 hack/compose/docker-compose.yml create mode 100755 hack/dev-server.sh create mode 100644 hack/generate-certs.example.yml create mode 100644 hack/generate-certs/main.go create mode 100755 hack/release.sh create mode 100644 hack/release.toml create mode 100755 hack/test/freeze-a-vm.sh create mode 100755 hack/test/integration.sh create mode 100755 hack/test/restart-a-vm.sh create mode 100755 hack/test/wipe-a-vm.sh create mode 100644 internal/backend/debug/debug.go create mode 100644 internal/backend/debug/debug_disabled.go create mode 100644 internal/backend/debug/debug_enabled.go create mode 100644 internal/backend/debug/graphs.go create mode 100644 internal/backend/dns/service.go create mode 100644 internal/backend/dns/service_test.go create mode 100644 internal/backend/factory/export_test.go create mode 100644 internal/backend/factory/factory.go create mode 100644 internal/backend/factory/factory_test.go create mode 100644 internal/backend/grpc/auth.go create mode 100644 internal/backend/grpc/auth_debug.go create mode 100644 internal/backend/grpc/auth_no_debug.go create mode 100644 internal/backend/grpc/cosi.go create mode 100644 internal/backend/grpc/export_test.go create mode 100644 internal/backend/grpc/grpc.go create mode 100644 internal/backend/grpc/grpc_test.go create mode 100644 internal/backend/grpc/management.go create mode 100644 internal/backend/grpc/oidc.go create mode 100644 internal/backend/grpc/resource.go create mode 100644 internal/backend/grpc/router/omni_backend.go create mode 100644 internal/backend/grpc/router/resolve.go create mode 100644 internal/backend/grpc/router/router.go create mode 100644 internal/backend/grpc/router/server.go create mode 100644 internal/backend/grpc/router/talos_backend.go create mode 100644 internal/backend/grpc/router/talos_backend_test.go create mode 100644 internal/backend/grpc/schematics.go create mode 100644 internal/backend/grpc/schematics_test.go create mode 100644 internal/backend/grpc/serviceaccount.go create mode 100644 internal/backend/grpc/validate.go create mode 100644 internal/backend/health/health.go create mode 100644 internal/backend/k8sproxy/export_test.go create mode 100644 internal/backend/k8sproxy/jwt.go create mode 100644 internal/backend/k8sproxy/jwt_test.go create mode 100644 internal/backend/k8sproxy/k8sproxy.go create mode 100644 internal/backend/k8sproxy/middleware.go create mode 100644 internal/backend/k8sproxy/middleware_test.go create mode 100644 internal/backend/k8sproxy/multiplex.go create mode 100644 internal/backend/k8sproxy/proxy.go create mode 100644 internal/backend/logging/handler.go create mode 100644 internal/backend/logging/logging.go create mode 100644 internal/backend/monitoring/monitoring.go create mode 100644 internal/backend/oidc/external/external.go create mode 100644 internal/backend/oidc/internal/client/client.go create mode 100644 internal/backend/oidc/internal/models/auth_request.go create mode 100644 internal/backend/oidc/internal/models/challenge.go create mode 100644 internal/backend/oidc/internal/models/models.go create mode 100644 internal/backend/oidc/internal/models/token.go create mode 100644 internal/backend/oidc/internal/storage/authrequest/authrequest.go create mode 100644 internal/backend/oidc/internal/storage/authrequest/storage.go create mode 100644 internal/backend/oidc/internal/storage/authrequest/storage_test.go create mode 100644 internal/backend/oidc/internal/storage/keys/keys.go create mode 100644 internal/backend/oidc/internal/storage/keys/storage.go create mode 100644 internal/backend/oidc/internal/storage/keys/storage_test.go create mode 100644 internal/backend/oidc/internal/storage/storage.go create mode 100644 internal/backend/oidc/internal/storage/token/mock_test.go create mode 100644 internal/backend/oidc/internal/storage/token/storage.go create mode 100644 internal/backend/oidc/internal/storage/token/storage_test.go create mode 100644 internal/backend/oidc/internal/storage/token/token.go create mode 100644 internal/backend/oidc/oidc.go create mode 100644 internal/backend/proxy_server.go create mode 100644 internal/backend/resourcelogger/resourcelogger.go create mode 100644 internal/backend/resourcelogger/resourcelogger_test.go create mode 100644 internal/backend/runtime/cosi/cosi.go create mode 100644 internal/backend/runtime/export_test.go create mode 100644 internal/backend/runtime/keyprovider/storage.go create mode 100644 internal/backend/runtime/kubernetes/cleanup.go create mode 100644 internal/backend/runtime/kubernetes/client.go create mode 100644 internal/backend/runtime/kubernetes/kubernetes.go create mode 100644 internal/backend/runtime/kubernetes/kubernetes_test.go create mode 100644 internal/backend/runtime/kubernetes/testdata/oidc-kubeconfig1.yaml create mode 100644 internal/backend/runtime/kubernetes/testdata/oidc-kubeconfig2.yaml create mode 100644 internal/backend/runtime/omni/controllers/controllers.go create mode 100644 internal/backend/runtime/omni/controllers/omni/backup_data.go create mode 100644 internal/backend/runtime/omni/controllers/omni/cert_refresh_tick.go create mode 100644 internal/backend/runtime/omni/controllers/omni/cert_refresh_tick_test.go create mode 100644 internal/backend/runtime/omni/controllers/omni/cluster.go create mode 100644 internal/backend/runtime/omni/controllers/omni/cluster_bootstrap_status.go create mode 100644 internal/backend/runtime/omni/controllers/omni/cluster_bootstrap_status_test.go create mode 100644 internal/backend/runtime/omni/controllers/omni/cluster_config_version.go create mode 100644 internal/backend/runtime/omni/controllers/omni/cluster_destroy_status.go create mode 100644 internal/backend/runtime/omni/controllers/omni/cluster_endpoint.go create mode 100644 internal/backend/runtime/omni/controllers/omni/cluster_endpoint_test.go create mode 100644 internal/backend/runtime/omni/controllers/omni/cluster_loadbalancer.go create mode 100644 internal/backend/runtime/omni/controllers/omni/cluster_loadbalancer_test.go create mode 100644 internal/backend/runtime/omni/controllers/omni/cluster_machine.go create mode 100644 internal/backend/runtime/omni/controllers/omni/cluster_machine_config.go create mode 100644 internal/backend/runtime/omni/controllers/omni/cluster_machine_config_status.go create mode 100644 internal/backend/runtime/omni/controllers/omni/cluster_machine_config_status_test.go create mode 100644 internal/backend/runtime/omni/controllers/omni/cluster_machine_config_strip_role_test.go create mode 100644 internal/backend/runtime/omni/controllers/omni/cluster_machine_config_test.go create mode 100644 internal/backend/runtime/omni/controllers/omni/cluster_machine_encryption.go create mode 100644 internal/backend/runtime/omni/controllers/omni/cluster_machine_encryption_key.go create mode 100644 internal/backend/runtime/omni/controllers/omni/cluster_machine_identity.go create mode 100644 internal/backend/runtime/omni/controllers/omni/cluster_machine_status.go create mode 100644 internal/backend/runtime/omni/controllers/omni/cluster_machine_status_metrics.go create mode 100644 internal/backend/runtime/omni/controllers/omni/cluster_machine_status_test.go create mode 100644 internal/backend/runtime/omni/controllers/omni/cluster_status.go create mode 100644 internal/backend/runtime/omni/controllers/omni/cluster_status_metrics.go create mode 100644 internal/backend/runtime/omni/controllers/omni/cluster_status_test.go create mode 100644 internal/backend/runtime/omni/controllers/omni/cluster_test.go create mode 100644 internal/backend/runtime/omni/controllers/omni/cluster_uuid.go create mode 100644 internal/backend/runtime/omni/controllers/omni/cluster_workload_proxy.go create mode 100644 internal/backend/runtime/omni/controllers/omni/cluster_workload_proxy_test.go create mode 100644 internal/backend/runtime/omni/controllers/omni/control_plane_status.go create mode 100644 internal/backend/runtime/omni/controllers/omni/data/kms-encryption-config-patch.yaml create mode 100644 internal/backend/runtime/omni/controllers/omni/data/kube-service-exposer-config-patch.tmpl.yaml create mode 100644 internal/backend/runtime/omni/controllers/omni/etcd_backup.go create mode 100644 internal/backend/runtime/omni/controllers/omni/etcd_backup_encryption.go create mode 100644 internal/backend/runtime/omni/controllers/omni/etcd_backup_overall_status.go create mode 100644 internal/backend/runtime/omni/controllers/omni/etcd_backup_test.go create mode 100644 internal/backend/runtime/omni/controllers/omni/etcdbackup/etcdbackup.go create mode 100644 internal/backend/runtime/omni/controllers/omni/etcdbackup/etcdbackup_test.go create mode 100644 internal/backend/runtime/omni/controllers/omni/etcdbackup/store/disabledstore.go create mode 100644 internal/backend/runtime/omni/controllers/omni/etcdbackup/store/filestore.go create mode 100644 internal/backend/runtime/omni/controllers/omni/etcdbackup/store/metrics.go create mode 100644 internal/backend/runtime/omni/controllers/omni/etcdbackup/store/s3store.go create mode 100644 internal/backend/runtime/omni/controllers/omni/etcdbackup/store/store.go create mode 100644 internal/backend/runtime/omni/controllers/omni/export_test.go create mode 100644 internal/backend/runtime/omni/controllers/omni/image/client.go create mode 100644 internal/backend/runtime/omni/controllers/omni/image/image.go create mode 100644 internal/backend/runtime/omni/controllers/omni/image_pull_status.go create mode 100644 internal/backend/runtime/omni/controllers/omni/image_pull_status_test.go create mode 100644 internal/backend/runtime/omni/controllers/omni/installation_media.go create mode 100644 internal/backend/runtime/omni/controllers/omni/internal/blocks/decrypt.go create mode 100644 internal/backend/runtime/omni/controllers/omni/internal/blocks/encrypt.go create mode 100644 internal/backend/runtime/omni/controllers/omni/internal/blocks/encrypt_test.go create mode 100644 internal/backend/runtime/omni/controllers/omni/internal/configpatch/configpatch.go create mode 100644 internal/backend/runtime/omni/controllers/omni/internal/etcdbackup/crypt/crypt.go create mode 100644 internal/backend/runtime/omni/controllers/omni/internal/etcdbackup/crypt/decrypt.go create mode 100644 internal/backend/runtime/omni/controllers/omni/internal/etcdbackup/crypt/encrypt.go create mode 100644 internal/backend/runtime/omni/controllers/omni/internal/etcdbackup/crypt/encrypt_test.go create mode 100644 internal/backend/runtime/omni/controllers/omni/internal/etcdbackup/etcdbackup.go create mode 100644 internal/backend/runtime/omni/controllers/omni/internal/etcdbackup/fstore/export_test.go create mode 100644 internal/backend/runtime/omni/controllers/omni/internal/etcdbackup/fstore/fstore.go create mode 100644 internal/backend/runtime/omni/controllers/omni/internal/etcdbackup/fstore/fstore_test.go create mode 100644 internal/backend/runtime/omni/controllers/omni/internal/etcdbackup/fstore/fstore_unix.go create mode 100644 internal/backend/runtime/omni/controllers/omni/internal/etcdbackup/fstore/fstore_windows.go create mode 100644 internal/backend/runtime/omni/controllers/omni/internal/etcdbackup/s3store/s3store.go create mode 100644 internal/backend/runtime/omni/controllers/omni/internal/kubernetes/kubernetes.go create mode 100644 internal/backend/runtime/omni/controllers/omni/internal/kubernetes/kubernetes_test.go create mode 100644 internal/backend/runtime/omni/controllers/omni/internal/kubernetes/machinemap.go create mode 100644 internal/backend/runtime/omni/controllers/omni/internal/kubernetes/machinemap_test.go create mode 100644 internal/backend/runtime/omni/controllers/omni/internal/kubernetes/patch.go create mode 100644 internal/backend/runtime/omni/controllers/omni/internal/kubernetes/upgrade.go create mode 100644 internal/backend/runtime/omni/controllers/omni/internal/kubernetes/upgrade_test.go create mode 100644 internal/backend/runtime/omni/controllers/omni/internal/kubernetes/versions.go create mode 100644 internal/backend/runtime/omni/controllers/omni/internal/kubernetes/versions_test.go create mode 100644 internal/backend/runtime/omni/controllers/omni/internal/loadbalancer/loadbalancer.go create mode 100644 internal/backend/runtime/omni/controllers/omni/internal/loadbalancer/manager.go create mode 100644 internal/backend/runtime/omni/controllers/omni/internal/mappers/mappers.go create mode 100644 internal/backend/runtime/omni/controllers/omni/internal/talos/schematic.go create mode 100644 internal/backend/runtime/omni/controllers/omni/internal/talos/versions.go create mode 100644 internal/backend/runtime/omni/controllers/omni/internal/task/clustermachine/clustermachine.go create mode 100644 internal/backend/runtime/omni/controllers/omni/internal/task/clustermachine/identity.go create mode 100644 internal/backend/runtime/omni/controllers/omni/internal/task/image/image.go create mode 100644 internal/backend/runtime/omni/controllers/omni/internal/task/image/pulltask.go create mode 100644 internal/backend/runtime/omni/controllers/omni/internal/task/image/status.go create mode 100644 internal/backend/runtime/omni/controllers/omni/internal/task/machine/helpers.go create mode 100644 internal/backend/runtime/omni/controllers/omni/internal/task/machine/machine.go create mode 100644 internal/backend/runtime/omni/controllers/omni/internal/task/machine/poll.go create mode 100644 internal/backend/runtime/omni/controllers/omni/internal/task/runner.go create mode 100644 internal/backend/runtime/omni/controllers/omni/internal/task/runner_test.go create mode 100644 internal/backend/runtime/omni/controllers/omni/internal/task/task.go create mode 100644 internal/backend/runtime/omni/controllers/omni/internal/task/task_test.go create mode 100644 internal/backend/runtime/omni/controllers/omni/key_pruner.go create mode 100644 internal/backend/runtime/omni/controllers/omni/key_pruner_test.go create mode 100644 internal/backend/runtime/omni/controllers/omni/kubeconfig.go create mode 100644 internal/backend/runtime/omni/controllers/omni/kubeconfig_test.go create mode 100644 internal/backend/runtime/omni/controllers/omni/kubernetes_status.go create mode 100644 internal/backend/runtime/omni/controllers/omni/kubernetes_status_test.go create mode 100644 internal/backend/runtime/omni/controllers/omni/kubernetes_upgrade_manifest_status.go create mode 100644 internal/backend/runtime/omni/controllers/omni/kubernetes_upgrade_status.go create mode 100644 internal/backend/runtime/omni/controllers/omni/loadbalancer.go create mode 100644 internal/backend/runtime/omni/controllers/omni/loadbalancer_test.go create mode 100644 internal/backend/runtime/omni/controllers/omni/machine.go create mode 100644 internal/backend/runtime/omni/controllers/omni/machine_config_gen_options.go create mode 100644 internal/backend/runtime/omni/controllers/omni/machine_labels_test.go create mode 100644 internal/backend/runtime/omni/controllers/omni/machine_set.go create mode 100644 internal/backend/runtime/omni/controllers/omni/machine_set_destroy_status.go create mode 100644 internal/backend/runtime/omni/controllers/omni/machine_set_etcd_audit.go create mode 100644 internal/backend/runtime/omni/controllers/omni/machine_set_etcd_audit_test.go create mode 100644 internal/backend/runtime/omni/controllers/omni/machine_set_node.go create mode 100644 internal/backend/runtime/omni/controllers/omni/machine_set_node_test.go create mode 100644 internal/backend/runtime/omni/controllers/omni/machine_set_status.go create mode 100644 internal/backend/runtime/omni/controllers/omni/machine_set_status_test.go create mode 100644 internal/backend/runtime/omni/controllers/omni/machine_status.go create mode 100644 internal/backend/runtime/omni/controllers/omni/machine_status_link.go create mode 100644 internal/backend/runtime/omni/controllers/omni/machine_status_link_test.go create mode 100644 internal/backend/runtime/omni/controllers/omni/machine_status_metrics.go create mode 100644 internal/backend/runtime/omni/controllers/omni/machine_status_test.go create mode 100644 internal/backend/runtime/omni/controllers/omni/machine_test.go create mode 100644 internal/backend/runtime/omni/controllers/omni/omni.go create mode 100644 internal/backend/runtime/omni/controllers/omni/omni_test.go create mode 100644 internal/backend/runtime/omni/controllers/omni/ongoing_task.go create mode 100644 internal/backend/runtime/omni/controllers/omni/redacted_cluster_machine_config.go create mode 100644 internal/backend/runtime/omni/controllers/omni/redacted_cluster_machine_config_test.go create mode 100644 internal/backend/runtime/omni/controllers/omni/saml_assertion.go create mode 100644 internal/backend/runtime/omni/controllers/omni/secrets.go create mode 100644 internal/backend/runtime/omni/controllers/omni/secrets_test.go create mode 100644 internal/backend/runtime/omni/controllers/omni/talos_extensions.go create mode 100644 internal/backend/runtime/omni/controllers/omni/talos_extensions_test.go create mode 100644 internal/backend/runtime/omni/controllers/omni/talos_test.go create mode 100644 internal/backend/runtime/omni/controllers/omni/talos_upgrade_status.go create mode 100644 internal/backend/runtime/omni/controllers/omni/talos_upgrade_status_test.go create mode 100644 internal/backend/runtime/omni/controllers/omni/talosconfig.go create mode 100644 internal/backend/runtime/omni/controllers/omni/talosconfig_test.go create mode 100644 internal/backend/runtime/omni/controllers/omni/versions.go create mode 100644 internal/backend/runtime/omni/controllers/omni/versions_test.go create mode 100644 internal/backend/runtime/omni/export_test.go create mode 100644 internal/backend/runtime/omni/external/state.go create mode 100644 internal/backend/runtime/omni/external/state_test.go create mode 100644 internal/backend/runtime/omni/loader.go create mode 100644 internal/backend/runtime/omni/loader_test.go create mode 100644 internal/backend/runtime/omni/migration/compat.go create mode 100644 internal/backend/runtime/omni/migration/helpers.go create mode 100644 internal/backend/runtime/omni/migration/manager.go create mode 100644 internal/backend/runtime/omni/migration/migration.go create mode 100644 internal/backend/runtime/omni/migration/migration_test.go create mode 100644 internal/backend/runtime/omni/migration/migrations.go create mode 100644 internal/backend/runtime/omni/omni.go create mode 100644 internal/backend/runtime/omni/omni_test.go create mode 100644 internal/backend/runtime/omni/pkg/check/check.go create mode 100644 internal/backend/runtime/omni/pkg/check/connection.go create mode 100644 internal/backend/runtime/omni/pkg/check/etcd.go create mode 100644 internal/backend/runtime/omni/pkg/check/etcd_test.go create mode 100644 internal/backend/runtime/omni/state.go create mode 100644 internal/backend/runtime/omni/state_access.go create mode 100644 internal/backend/runtime/omni/state_boltdb.go create mode 100644 internal/backend/runtime/omni/state_etcd.go create mode 100644 internal/backend/runtime/omni/state_etcd_election.go create mode 100644 internal/backend/runtime/omni/state_etcd_election_test.go create mode 100644 internal/backend/runtime/omni/state_etcd_test.go create mode 100644 internal/backend/runtime/omni/state_metrics.go create mode 100644 internal/backend/runtime/omni/state_validation.go create mode 100644 internal/backend/runtime/omni/state_validation_test.go create mode 100644 internal/backend/runtime/omni/testdata/pgp/new_key.private create mode 100644 internal/backend/runtime/omni/testdata/pgp/new_key.public create mode 100644 internal/backend/runtime/omni/testdata/pgp/old_key.private create mode 100644 internal/backend/runtime/omni/testdata/pgp/old_key.public create mode 100644 internal/backend/runtime/omni/validated/errors.go create mode 100644 internal/backend/runtime/omni/validated/options.go create mode 100644 internal/backend/runtime/omni/validated/state.go create mode 100644 internal/backend/runtime/omni/validated/state_test.go create mode 100644 internal/backend/runtime/omni/validated/validated.go create mode 100644 internal/backend/runtime/omni/validated/validation.go create mode 100644 internal/backend/runtime/omni/virtual/computed.go create mode 100644 internal/backend/runtime/omni/virtual/deduper.go create mode 100644 internal/backend/runtime/omni/virtual/errors.go create mode 100644 internal/backend/runtime/omni/virtual/pkg/producers/kubernetes_usage.go create mode 100644 internal/backend/runtime/omni/virtual/pkg/producers/producers.go create mode 100644 internal/backend/runtime/omni/virtual/state.go create mode 100644 internal/backend/runtime/omni/virtual/state_test.go create mode 100644 internal/backend/runtime/options.go create mode 100644 internal/backend/runtime/proxy_runtime.go create mode 100644 internal/backend/runtime/proxy_runtime_test.go create mode 100644 internal/backend/runtime/resource.go create mode 100644 internal/backend/runtime/runtime.go create mode 100644 internal/backend/runtime/runtime_test.go create mode 100644 internal/backend/runtime/talos/clients.go create mode 100644 internal/backend/runtime/talos/clients_test.go create mode 100644 internal/backend/runtime/talos/talos.go create mode 100644 internal/backend/runtime/utils.go create mode 100644 internal/backend/runtime/utils_test.go create mode 100644 internal/backend/runtime/watch.go create mode 100644 internal/backend/saml/encoder.go create mode 100644 internal/backend/saml/saml.go create mode 100644 internal/backend/saml/session.go create mode 100644 internal/backend/saml/session_test.go create mode 100644 internal/backend/saml/testdata/google_acs.xml create mode 100644 internal/backend/saml/testdata/google_metadata.xml create mode 100644 internal/backend/saml/testdata/microsoft_acs.xml create mode 100644 internal/backend/saml/testdata/microsoft_metadata.xml create mode 100644 internal/backend/saml/testdata/samlsp_acs.xml create mode 100644 internal/backend/saml/testdata/samlsp_metadata.xml create mode 100644 internal/backend/server.go create mode 100644 internal/backend/workloadproxy/accessvalidator.go create mode 100644 internal/backend/workloadproxy/accessvalidator_test.go create mode 100644 internal/backend/workloadproxy/handler.go create mode 100644 internal/backend/workloadproxy/handler_test.go create mode 100644 internal/backend/workloadproxy/serviceregistry.go create mode 100644 internal/backend/workloadproxy/serviceregistry_test.go create mode 100644 internal/backend/workloadproxy/workloadproxy.go create mode 100644 internal/e2e-tests/.kresignore create mode 100644 internal/e2e-tests/Dockerfile create mode 100644 internal/e2e-tests/go.mod create mode 100644 internal/e2e-tests/go.sum create mode 100644 internal/e2e-tests/main_test.go create mode 100644 internal/frontend/dist/index.html create mode 100644 internal/frontend/frontend.go create mode 100644 internal/frontend/handler.go create mode 100644 internal/internal/generate.go create mode 100644 internal/internal/tools/tsgen/ast.go create mode 100644 internal/internal/tools/tsgen/main.go create mode 100644 internal/internal/tools/tsgen/main_test.go create mode 100644 internal/internal/tools/tsgen/testdata/bad/pkg/1.go create mode 100644 internal/internal/tools/tsgen/testdata/good/expected/resources.ts create mode 100644 internal/internal/tools/tsgen/testdata/good/pkg/1.go create mode 100644 internal/internal/tools/tsgen/testdata/good/pkg/2.go create mode 100644 internal/internal/tools/tsgen/ts.template create mode 100644 internal/memconn/memconn.go create mode 100644 internal/pkg/auth/accesspolicy/accesspolicy.go create mode 100644 internal/pkg/auth/accesspolicy/accesspolicy_test.go create mode 100644 internal/pkg/auth/accesspolicy/cluster.go create mode 100644 internal/pkg/auth/accesspolicy/testdata/acl-invalid-metadata.yaml create mode 100644 internal/pkg/auth/accesspolicy/testdata/acl-valid-match-selector.yaml create mode 100644 internal/pkg/auth/accesspolicy/testdata/acl-valid.yaml create mode 100644 internal/pkg/auth/actor/actor.go create mode 100644 internal/pkg/auth/auth.go create mode 100644 internal/pkg/auth/auth0/auth0.go create mode 100644 internal/pkg/auth/auth0/token.go create mode 100644 internal/pkg/auth/authenticator.go create mode 100644 internal/pkg/auth/check.go create mode 100644 internal/pkg/auth/check_test.go create mode 100644 internal/pkg/auth/config.go create mode 100644 internal/pkg/auth/config_test.go create mode 100644 internal/pkg/auth/constants.go create mode 100644 internal/pkg/auth/context.go create mode 100644 internal/pkg/auth/handler/auth_config.go create mode 100644 internal/pkg/auth/handler/handler.go create mode 100644 internal/pkg/auth/handler/handler_test.go create mode 100644 internal/pkg/auth/handler/mock_test.go create mode 100644 internal/pkg/auth/handler/signature.go create mode 100644 internal/pkg/auth/interceptor/auth_config.go create mode 100644 internal/pkg/auth/interceptor/interceptor.go create mode 100644 internal/pkg/auth/interceptor/jwt.go create mode 100644 internal/pkg/auth/interceptor/saml.go create mode 100644 internal/pkg/auth/interceptor/signature.go create mode 100644 internal/pkg/auth/interceptor/signature_test.go create mode 100644 internal/pkg/auth/role/role.go create mode 100644 internal/pkg/auth/scope/action.go create mode 100644 internal/pkg/auth/scope/object.go create mode 100644 internal/pkg/auth/scope/perspective.go create mode 100644 internal/pkg/auth/scope/scope.go create mode 100644 internal/pkg/auth/scope/scope_test.go create mode 100644 internal/pkg/auth/scope/set.go create mode 100644 internal/pkg/auth/scope/set_test.go create mode 100644 internal/pkg/auth/user/user.go create mode 100644 internal/pkg/auth/user/user_test.go create mode 100644 internal/pkg/cache/cache.go create mode 100644 internal/pkg/cache/cache_test.go create mode 100644 internal/pkg/certs/certs.go create mode 100644 internal/pkg/certs/certs_test.go create mode 100644 internal/pkg/certs/kubernetes.go create mode 100644 internal/pkg/certs/kubernetes_test.go create mode 100644 internal/pkg/compress/compress.go create mode 100644 internal/pkg/config/auth.go create mode 100644 internal/pkg/config/config.go create mode 100644 internal/pkg/constants/talos.go create mode 100644 internal/pkg/constants/versions.go create mode 100644 internal/pkg/errgroup/errgroup.go create mode 100644 internal/pkg/errgroup/errgroup_test.go create mode 100644 internal/pkg/features/features.go create mode 100644 internal/pkg/grpcutil/grpcutil.go create mode 100644 internal/pkg/grpcutil/grpcutil_test.go create mode 100644 internal/pkg/grpcutil/logger.go create mode 100644 internal/pkg/grpcutil/logger_test.go create mode 100644 internal/pkg/grpcutil/server.go create mode 100644 internal/pkg/grpcutil/stream_interceptors.go create mode 100644 internal/pkg/image/image.go create mode 100644 internal/pkg/image/image_test.go create mode 100644 internal/pkg/kms/kms.go create mode 100644 internal/pkg/kubernetes/resource/kubernetes.go create mode 100644 internal/pkg/logreceiver/logreceiver.go create mode 100644 internal/pkg/logreceiver/logreceiver_test.go create mode 100644 internal/pkg/registry/registry.go create mode 100644 internal/pkg/resetable/closer.go create mode 100644 internal/pkg/resetable/closer_test.go create mode 100644 internal/pkg/siderolink/adapter.go create mode 100644 internal/pkg/siderolink/export_test.go create mode 100644 internal/pkg/siderolink/loghandler.go create mode 100644 internal/pkg/siderolink/loghandler_test.go create mode 100644 internal/pkg/siderolink/logstorage.go create mode 100644 internal/pkg/siderolink/logstorage_test.go create mode 100644 internal/pkg/siderolink/machines.go create mode 100644 internal/pkg/siderolink/manager.go create mode 100644 internal/pkg/siderolink/siderolink.go create mode 100644 internal/pkg/siderolink/siderolink_test.go create mode 100644 internal/pkg/siderolink/trustd/server.go create mode 100644 internal/pkg/siderolink/trustd/trustd.go create mode 100644 internal/pkg/siderolink/wireguard.go create mode 100644 internal/pkg/test/grpc.go create mode 100644 internal/pkg/xmocks/xmocks.go create mode 100644 internal/version/api.go create mode 100644 internal/version/data/sha create mode 100644 internal/version/data/tag create mode 100644 internal/version/version.go create mode 100644 vetur.config.js diff --git a/.codecov.yml b/.codecov.yml new file mode 100644 index 00000000..704499c3 --- /dev/null +++ b/.codecov.yml @@ -0,0 +1,18 @@ +# THIS FILE WAS AUTOMATICALLY GENERATED, PLEASE DO NOT EDIT. +# +# Generated on 2021-05-20T15:00:42Z by kres adb52e5-dirty. + +codecov: + require_ci_to_pass: false + +coverage: + status: + project: + default: + target: 50% + threshold: 0.5% + base: auto + if_ci_failed: success + patch: off + +comment: false diff --git a/.conform.yaml b/.conform.yaml new file mode 100644 index 00000000..eca30dab --- /dev/null +++ b/.conform.yaml @@ -0,0 +1,88 @@ +# THIS FILE WAS AUTOMATICALLY GENERATED, PLEASE DO NOT EDIT. +# +# Generated on 2024-02-23T20:48:03Z by kres 38f172c. + +policies: + - type: commit + spec: + dco: true + gpg: + required: true + identity: + gitHubOrganization: siderolabs + spellcheck: + locale: US + maximumOfOneCommit: true + header: + length: 89 + imperative: true + case: lower + invalidLastCharacters: . + body: + required: true + conventional: + types: + - chore + - docs + - perf + - refactor + - style + - test + - release + scopes: + - .* + - type: license + spec: + root: . + skipPaths: + - .git + - testdata/ + - client/ + - frontend/node_modules/ + - internal/pkg/kubernetes/resource/ + includeSuffixes: + - .go + - .ts + - .js + excludeSuffixes: + - .pb.go + - .pb.gw.go + - .pb.ts + - babel.config.js + header: | + // Copyright (c) 2024 Sidero Labs, Inc. + // + // Use of this software is governed by the Business Source License + // included in the LICENSE file. + - type: license + spec: + root: client + skipPaths: + - .git/ + - testdata/ + includeSuffixes: + - .go + excludeSuffixes: + - .pb.go + - .pb.gw.go + header: | + // This Source Code Form is subject to the terms of the Mozilla Public + // License, v. 2.0. If a copy of the MPL was not distributed with this + // file, You can obtain one at http://mozilla.org/MPL/2.0/ + - type: license + spec: + root: frontend/ + skipPaths: + - node_modules/ + includeSuffixes: + - .vue + excludeSuffixes: + - .pb.go + - .pb.gw.go + header: | + diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..20d3edba --- /dev/null +++ b/.dockerignore @@ -0,0 +1,29 @@ +# THIS FILE WAS AUTOMATICALLY GENERATED, PLEASE DO NOT EDIT. +# +# Generated on 2024-02-26T21:35:48Z by kres latest. + +* +!frontend/src +!frontend/tests +!frontend/public +!client/api +!client/pkg +!cmd +!internal +!docs +!frontend/*.json +!frontend/*.js +!frontend/.eslintrc.yaml +!internal/frontend/frontend.go +!client/go.mod +!client/go.sum +!go.mod +!go.sum +!client/.golangci.yml +!.golangci.yml +!CHANGELOG.md +!CONTRIBUTING.md +!DEVELOPMENT.md +!README.md +!.markdownlint.json +!.license-header.go.txt diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml new file mode 100644 index 00000000..64acd579 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -0,0 +1,56 @@ +name: 🐞 Bug +description: File a bug/issue +title: "[bug] " +labels: [bug, needs triage] +body: +- type: checkboxes + attributes: + label: Is there an existing issue for this? + description: Please search to see if an issue already exists for the bug you encountered. + options: + - label: I have searched the existing issues + required: true +- type: textarea + attributes: + label: Current Behavior + description: A concise description of what you're experiencing. + validations: + required: true +- type: textarea + attributes: + label: Expected Behavior + description: A concise description of what you expected to happen. + validations: + required: true +- type: textarea + attributes: + label: Steps To Reproduce + description: Steps to reproduce the behavior. + placeholder: | + 1. In this environment... + 2. With this config... + 3. Run '...' + 4. See error... + validations: + required: true +- type: dropdown + id: browsers + attributes: + label: What browsers are you seeing the problem on? + multiple: true + options: + - Firefox + - Chrome + - Safari + - Microsoft Edge + validations: + required: false +- type: textarea + attributes: + label: Anything else? + description: | + Links? References? Anything that will give us more context about the issue you are encountering! + + Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in. + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/feature_request.yaml b/.github/ISSUE_TEMPLATE/feature_request.yaml new file mode 100644 index 00000000..d7e4adea --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yaml @@ -0,0 +1,33 @@ +name: 🔧 Feature request +description: Suggest an idea for this project +title: "[feature] <title>" +labels: [feature] +body: +- type: textarea + attributes: + label: Problem Description + description: Is your feature request related to a problem? Please describe. + placeholder: A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + validations: + required: true +- type: textarea + attributes: + label: Solution + description: Describe the solution you'd like + placeholder: A clear and concise description of what you want to happen. + validations: + required: false +- type: textarea + attributes: + label: Alternative Solutions + description: Describe alternatives you've considered + placeholder: A clear and concise description of any alternative solutions or features you've considered. + validations: + required: false +- type: textarea + attributes: + label: Notes + description: Additional context + placeholder: Add any other context or screenshots about the feature request here. + validations: + required: false diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 00000000..9f305fb4 --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,439 @@ +# THIS FILE WAS AUTOMATICALLY GENERATED, PLEASE DO NOT EDIT. +# +# Generated on 2024-02-28T11:30:58Z by kres latest. + +name: default +concurrency: + group: ${{ github.head_ref || github.run_id }} + cancel-in-progress: true +"on": + push: + branches: + - main + - release-* + tags: + - v* + pull_request: + branches: + - main + - release-* +jobs: + default: + permissions: + actions: read + contents: write + issues: read + packages: write + pull-requests: read + runs-on: + - self-hosted + - generic + if: (!startsWith(github.head_ref, 'renovate/') && !startsWith(github.head_ref, 'dependabot/')) + outputs: + labels: ${{ steps.retrieve-pr-labels.outputs.result }} + services: + buildkitd: + image: moby/buildkit:v0.12.5 + options: --privileged + ports: + - 1234:1234 + volumes: + - /var/lib/buildkit/${{ github.repository }}:/var/lib/buildkit + - /usr/etc/buildkit/buildkitd.toml:/etc/buildkit/buildkitd.toml + steps: + - name: checkout + uses: actions/checkout@v4 + - name: Unshallow + run: | + git fetch --prune --unshallow + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + with: + driver: remote + endpoint: tcp://localhost:1234 + timeout-minutes: 1 + - name: js + run: | + make js + - name: unit-tests-frontend + run: | + make unit-tests-frontend + - name: frontend + run: | + make frontend + - name: base + run: | + make base + - name: unit-tests-client + run: | + make unit-tests-client + - name: unit-tests-client-race + run: | + make unit-tests-client-race + - name: unit-tests + run: | + make unit-tests + - name: unit-tests-race + run: | + make unit-tests-race + - name: omni + run: | + make omni + - name: lint + run: | + make lint + - name: Login to registry + if: github.event_name != 'pull_request' + uses: docker/login-action@v3 + with: + password: ${{ secrets.GITHUB_TOKEN }} + registry: ghcr.io + username: ${{ github.repository_owner }} + - name: image-omni + run: | + make image-omni + - name: push-omni + if: github.event_name != 'pull_request' + env: + PUSH: "true" + run: | + make image-omni + - name: push-omni-latest + if: github.event_name != 'pull_request' + env: + PUSH: "true" + run: | + make image-omni TAG=latest + - name: omni-integration-test + run: | + make omni-integration-test + - name: omnictl + run: | + make omnictl + - name: run-integration-test + env: + AUTH0_TEST_PASSWORD: ${{ secrets.AUTH0_TEST_PASSWORD }} + AUTH0_TEST_USERNAME: ${{ secrets.AUTH0_TEST_USERNAME }} + INTEGRATION_RUN_E2E_TEST: "true" + INTEGRATION_TEST_ARGS: --test.run CleanState/|Auth/|DefaultCluster/ + WITH_DEBUG: "true" + run: | + sudo -E make run-integration-test + - name: Retrieve PR labels + id: retrieve-pr-labels + uses: actions/github-script@v7 + with: + retries: "3" + script: | + if (context.eventName != "pull_request") { return "[]" } + + const resp = await github.rest.issues.get({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + }) + + return resp.data.labels.map(label => label.name) + - name: Generate executable list + run: | + find _out -type f -executable > _out/executable-artifacts + - name: save-artifacts + uses: actions/upload-artifact@v4 + with: + name: artifacts + path: |- + _out + !_out/etcd + !_out/secondary-storage/** + retention-days: "5" + - name: save-talos-logs-artifacts + if: always() + uses: actions/upload-artifact@v4 + with: + name: talos-logs + path: ~/.talos/clusters/**/*.log + retention-days: "5" + - name: Generate Checksums + if: startsWith(github.ref, 'refs/tags/') + run: | + sha256sum _out/omnictl-* _out/omni-* > _out/sha256sum.txt + sha512sum _out/omnictl-* _out/omni-* > _out/sha512sum.txt + - name: release-notes + if: startsWith(github.ref, 'refs/tags/') + run: | + make release-notes + - name: Release + if: startsWith(github.ref, 'refs/tags/') + uses: crazy-max/ghaction-github-release@v2 + with: + body_path: _out/RELEASE_NOTES.md + draft: "true" + files: |- + _out/omnictl-* + _out/omni-* + _out/sha*.txt + e2e-backups: + runs-on: + - self-hosted + - omni + if: contains(fromJSON(needs.default.outputs.labels), 'integration/e2e') || contains(fromJSON(needs.default.outputs.labels), 'integration/e2e-backups') + needs: + - default + services: + buildkitd: + image: moby/buildkit:v0.12.5 + options: --privileged + ports: + - 1234:1234 + volumes: + - /var/lib/buildkit/${{ github.repository }}:/var/lib/buildkit + - /usr/etc/buildkit/buildkitd.toml:/etc/buildkit/buildkitd.toml + steps: + - name: checkout + uses: actions/checkout@v4 + - name: Unshallow + run: | + git fetch --prune --unshallow + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + with: + driver: remote + endpoint: tcp://localhost:1234 + timeout-minutes: 1 + - name: Download artifacts + uses: actions/download-artifact@v4 + with: + name: artifacts + path: _out + - name: Fix artifact permissions + run: | + xargs -a _out/executable-artifacts -I {} chmod +x {} + - name: run-integration-test + env: + AUTH0_TEST_PASSWORD: ${{ secrets.AUTH0_TEST_PASSWORD }} + AUTH0_TEST_USERNAME: ${{ secrets.AUTH0_TEST_USERNAME }} + INTEGRATION_RUN_E2E_TEST: "false" + INTEGRATION_TEST_ARGS: --test.run CleanState/|EtcdBackupAndRestore + WITH_DEBUG: "true" + run: | + sudo -E make run-integration-test + - name: save-talos-logs-artifacts + if: always() + uses: actions/upload-artifact@v4 + with: + name: talos-logs-e2e-backups + path: ~/.talos/clusters/**/*.log + retention-days: "5" + continue-on-error: true + e2e-scaling: + runs-on: + - self-hosted + - omni + if: contains(fromJSON(needs.default.outputs.labels), 'integration/e2e') || contains(fromJSON(needs.default.outputs.labels), 'integration/e2e-scaling') + needs: + - default + services: + buildkitd: + image: moby/buildkit:v0.12.5 + options: --privileged + ports: + - 1234:1234 + volumes: + - /var/lib/buildkit/${{ github.repository }}:/var/lib/buildkit + - /usr/etc/buildkit/buildkitd.toml:/etc/buildkit/buildkitd.toml + steps: + - name: checkout + uses: actions/checkout@v4 + - name: Unshallow + run: | + git fetch --prune --unshallow + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + with: + driver: remote + endpoint: tcp://localhost:1234 + timeout-minutes: 1 + - name: Download artifacts + uses: actions/download-artifact@v4 + with: + name: artifacts + path: _out + - name: Fix artifact permissions + run: | + xargs -a _out/executable-artifacts -I {} chmod +x {} + - name: run-integration-test + env: + AUTH0_TEST_PASSWORD: ${{ secrets.AUTH0_TEST_PASSWORD }} + AUTH0_TEST_USERNAME: ${{ secrets.AUTH0_TEST_USERNAME }} + INTEGRATION_RUN_E2E_TEST: "false" + INTEGRATION_TEST_ARGS: --test.run CleanState/|ScaleUpAndDown/|ScaleUpAndDownMachineClassBasedMachineSets/|RollingUpdateParallelism/|ForcedMachineRemoval/|ReplaceControlPlanes/|ConfigPatching/ + WITH_DEBUG: "true" + run: | + sudo -E make run-integration-test + - name: save-talos-logs-artifacts + if: always() + uses: actions/upload-artifact@v4 + with: + name: talos-logs-e2e-scaling + path: ~/.talos/clusters/**/*.log + retention-days: "5" + continue-on-error: true + e2e-short: + runs-on: + - self-hosted + - omni + if: contains(fromJSON(needs.default.outputs.labels), 'integration/e2e') || contains(fromJSON(needs.default.outputs.labels), 'integration/e2e-short') + needs: + - default + services: + buildkitd: + image: moby/buildkit:v0.12.5 + options: --privileged + ports: + - 1234:1234 + volumes: + - /var/lib/buildkit/${{ github.repository }}:/var/lib/buildkit + - /usr/etc/buildkit/buildkitd.toml:/etc/buildkit/buildkitd.toml + steps: + - name: checkout + uses: actions/checkout@v4 + - name: Unshallow + run: | + git fetch --prune --unshallow + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + with: + driver: remote + endpoint: tcp://localhost:1234 + timeout-minutes: 1 + - name: Download artifacts + uses: actions/download-artifact@v4 + with: + name: artifacts + path: _out + - name: Fix artifact permissions + run: | + xargs -a _out/executable-artifacts -I {} chmod +x {} + - name: run-integration-test + env: + AUTH0_TEST_PASSWORD: ${{ secrets.AUTH0_TEST_PASSWORD }} + AUTH0_TEST_USERNAME: ${{ secrets.AUTH0_TEST_USERNAME }} + INTEGRATION_RUN_E2E_TEST: "false" + INTEGRATION_TEST_ARGS: --test.run CleanState/|TalosImageGeneration/|ImmediateClusterDestruction/|DefaultCluster/|EncryptedCluster/|SinglenodeCluster/|Auth/ + WITH_DEBUG: "true" + run: | + sudo -E make run-integration-test + - name: save-talos-logs-artifacts + if: always() + uses: actions/upload-artifact@v4 + with: + name: talos-logs-e2e-short + path: ~/.talos/clusters/**/*.log + retention-days: "5" + continue-on-error: true + e2e-templates: + runs-on: + - self-hosted + - omni + if: contains(fromJSON(needs.default.outputs.labels), 'integration/e2e') || contains(fromJSON(needs.default.outputs.labels), 'integration/e2e-templates') + needs: + - default + services: + buildkitd: + image: moby/buildkit:v0.12.5 + options: --privileged + ports: + - 1234:1234 + volumes: + - /var/lib/buildkit/${{ github.repository }}:/var/lib/buildkit + - /usr/etc/buildkit/buildkitd.toml:/etc/buildkit/buildkitd.toml + steps: + - name: checkout + uses: actions/checkout@v4 + - name: Unshallow + run: | + git fetch --prune --unshallow + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + with: + driver: remote + endpoint: tcp://localhost:1234 + timeout-minutes: 1 + - name: Download artifacts + uses: actions/download-artifact@v4 + with: + name: artifacts + path: _out + - name: Fix artifact permissions + run: | + xargs -a _out/executable-artifacts -I {} chmod +x {} + - name: run-integration-test + env: + AUTH0_TEST_PASSWORD: ${{ secrets.AUTH0_TEST_PASSWORD }} + AUTH0_TEST_USERNAME: ${{ secrets.AUTH0_TEST_USERNAME }} + INTEGRATION_RUN_E2E_TEST: "false" + INTEGRATION_TEST_ARGS: --test.run CleanState/|ClusterTemplate/ + WITH_DEBUG: "true" + run: | + sudo -E make run-integration-test + - name: save-talos-logs-artifacts + if: always() + uses: actions/upload-artifact@v4 + with: + name: talos-logs-e2e-templates + path: ~/.talos/clusters/**/*.log + retention-days: "5" + continue-on-error: true + e2e-upgrades: + runs-on: + - self-hosted + - omni + if: contains(fromJSON(needs.default.outputs.labels), 'integration/e2e') || contains(fromJSON(needs.default.outputs.labels), 'integration/e2e-upgrades') + needs: + - default + services: + buildkitd: + image: moby/buildkit:v0.12.5 + options: --privileged + ports: + - 1234:1234 + volumes: + - /var/lib/buildkit/${{ github.repository }}:/var/lib/buildkit + - /usr/etc/buildkit/buildkitd.toml:/etc/buildkit/buildkitd.toml + steps: + - name: checkout + uses: actions/checkout@v4 + - name: Unshallow + run: | + git fetch --prune --unshallow + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + with: + driver: remote + endpoint: tcp://localhost:1234 + timeout-minutes: 1 + - name: Download artifacts + uses: actions/download-artifact@v4 + with: + name: artifacts + path: _out + - name: Fix artifact permissions + run: | + xargs -a _out/executable-artifacts -I {} chmod +x {} + - name: run-integration-test + env: + AUTH0_TEST_PASSWORD: ${{ secrets.AUTH0_TEST_PASSWORD }} + AUTH0_TEST_USERNAME: ${{ secrets.AUTH0_TEST_USERNAME }} + INTEGRATION_RUN_E2E_TEST: "false" + INTEGRATION_TEST_ARGS: --test.run CleanState/|TalosUpgrades/|KubernetesUpgrades/|MaintenanceDowngrade/ + WITH_DEBUG: "true" + run: | + sudo -E make run-integration-test + - name: save-talos-logs-artifacts + if: always() + uses: actions/upload-artifact@v4 + with: + name: talos-logs-e2e-upgrades + path: ~/.talos/clusters/**/*.log + retention-days: "5" + continue-on-error: true diff --git a/.github/workflows/e2e-backups-cron.yaml b/.github/workflows/e2e-backups-cron.yaml new file mode 100644 index 00000000..bebae109 --- /dev/null +++ b/.github/workflows/e2e-backups-cron.yaml @@ -0,0 +1,53 @@ +# THIS FILE WAS AUTOMATICALLY GENERATED, PLEASE DO NOT EDIT. +# +# Generated on 2024-02-28T11:30:58Z by kres latest. + +name: e2e-backups-cron +concurrency: + group: ${{ github.head_ref || github.run_id }} + cancel-in-progress: true +"on": + schedule: + - cron: 30 1 * * * +jobs: + default: + runs-on: + - self-hosted + - omni + services: + buildkitd: + image: moby/buildkit:v0.12.5 + options: --privileged + ports: + - 1234:1234 + volumes: + - /var/lib/buildkit/${{ github.repository }}:/var/lib/buildkit + - /usr/etc/buildkit/buildkitd.toml:/etc/buildkit/buildkitd.toml + steps: + - name: checkout + uses: actions/checkout@v4 + - name: Unshallow + run: | + git fetch --prune --unshallow + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + with: + driver: remote + endpoint: tcp://localhost:1234 + timeout-minutes: 1 + - name: run-integration-test + env: + AUTH0_TEST_PASSWORD: ${{ secrets.AUTH0_TEST_PASSWORD }} + AUTH0_TEST_USERNAME: ${{ secrets.AUTH0_TEST_USERNAME }} + INTEGRATION_RUN_E2E_TEST: "false" + INTEGRATION_TEST_ARGS: --test.run CleanState/|EtcdBackupAndRestore + WITH_DEBUG: "true" + run: | + sudo -E make run-integration-test + - name: save-talos-logs-artifacts + if: always() + uses: actions/upload-artifact@v4 + with: + name: talos-logs + path: ~/.talos/clusters/**/*.log + retention-days: "5" diff --git a/.github/workflows/e2e-scaling-cron.yaml b/.github/workflows/e2e-scaling-cron.yaml new file mode 100644 index 00000000..13c61eb1 --- /dev/null +++ b/.github/workflows/e2e-scaling-cron.yaml @@ -0,0 +1,53 @@ +# THIS FILE WAS AUTOMATICALLY GENERATED, PLEASE DO NOT EDIT. +# +# Generated on 2024-02-28T11:30:58Z by kres latest. + +name: e2e-scaling-cron +concurrency: + group: ${{ github.head_ref || github.run_id }} + cancel-in-progress: true +"on": + schedule: + - cron: 30 1 * * * +jobs: + default: + runs-on: + - self-hosted + - omni + services: + buildkitd: + image: moby/buildkit:v0.12.5 + options: --privileged + ports: + - 1234:1234 + volumes: + - /var/lib/buildkit/${{ github.repository }}:/var/lib/buildkit + - /usr/etc/buildkit/buildkitd.toml:/etc/buildkit/buildkitd.toml + steps: + - name: checkout + uses: actions/checkout@v4 + - name: Unshallow + run: | + git fetch --prune --unshallow + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + with: + driver: remote + endpoint: tcp://localhost:1234 + timeout-minutes: 1 + - name: run-integration-test + env: + AUTH0_TEST_PASSWORD: ${{ secrets.AUTH0_TEST_PASSWORD }} + AUTH0_TEST_USERNAME: ${{ secrets.AUTH0_TEST_USERNAME }} + INTEGRATION_RUN_E2E_TEST: "false" + INTEGRATION_TEST_ARGS: --test.run CleanState/|ScaleUpAndDown/|ScaleUpAndDownMachineClassBasedMachineSets/|RollingUpdateParallelism/|ForcedMachineRemoval/|ReplaceControlPlanes/|ConfigPatching/ + WITH_DEBUG: "true" + run: | + sudo -E make run-integration-test + - name: save-talos-logs-artifacts + if: always() + uses: actions/upload-artifact@v4 + with: + name: talos-logs + path: ~/.talos/clusters/**/*.log + retention-days: "5" diff --git a/.github/workflows/e2e-short-cron.yaml b/.github/workflows/e2e-short-cron.yaml new file mode 100644 index 00000000..fc42ab94 --- /dev/null +++ b/.github/workflows/e2e-short-cron.yaml @@ -0,0 +1,53 @@ +# THIS FILE WAS AUTOMATICALLY GENERATED, PLEASE DO NOT EDIT. +# +# Generated on 2024-02-28T11:30:58Z by kres latest. + +name: e2e-short-cron +concurrency: + group: ${{ github.head_ref || github.run_id }} + cancel-in-progress: true +"on": + schedule: + - cron: 30 1 * * * +jobs: + default: + runs-on: + - self-hosted + - omni + services: + buildkitd: + image: moby/buildkit:v0.12.5 + options: --privileged + ports: + - 1234:1234 + volumes: + - /var/lib/buildkit/${{ github.repository }}:/var/lib/buildkit + - /usr/etc/buildkit/buildkitd.toml:/etc/buildkit/buildkitd.toml + steps: + - name: checkout + uses: actions/checkout@v4 + - name: Unshallow + run: | + git fetch --prune --unshallow + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + with: + driver: remote + endpoint: tcp://localhost:1234 + timeout-minutes: 1 + - name: run-integration-test + env: + AUTH0_TEST_PASSWORD: ${{ secrets.AUTH0_TEST_PASSWORD }} + AUTH0_TEST_USERNAME: ${{ secrets.AUTH0_TEST_USERNAME }} + INTEGRATION_RUN_E2E_TEST: "false" + INTEGRATION_TEST_ARGS: --test.run CleanState/|TalosImageGeneration/|ImmediateClusterDestruction/|DefaultCluster/|EncryptedCluster/|SinglenodeCluster/|Auth/ + WITH_DEBUG: "true" + run: | + sudo -E make run-integration-test + - name: save-talos-logs-artifacts + if: always() + uses: actions/upload-artifact@v4 + with: + name: talos-logs + path: ~/.talos/clusters/**/*.log + retention-days: "5" diff --git a/.github/workflows/e2e-templates-cron.yaml b/.github/workflows/e2e-templates-cron.yaml new file mode 100644 index 00000000..e9565e9d --- /dev/null +++ b/.github/workflows/e2e-templates-cron.yaml @@ -0,0 +1,53 @@ +# THIS FILE WAS AUTOMATICALLY GENERATED, PLEASE DO NOT EDIT. +# +# Generated on 2024-02-28T11:30:58Z by kres latest. + +name: e2e-templates-cron +concurrency: + group: ${{ github.head_ref || github.run_id }} + cancel-in-progress: true +"on": + schedule: + - cron: 30 1 * * * +jobs: + default: + runs-on: + - self-hosted + - omni + services: + buildkitd: + image: moby/buildkit:v0.12.5 + options: --privileged + ports: + - 1234:1234 + volumes: + - /var/lib/buildkit/${{ github.repository }}:/var/lib/buildkit + - /usr/etc/buildkit/buildkitd.toml:/etc/buildkit/buildkitd.toml + steps: + - name: checkout + uses: actions/checkout@v4 + - name: Unshallow + run: | + git fetch --prune --unshallow + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + with: + driver: remote + endpoint: tcp://localhost:1234 + timeout-minutes: 1 + - name: run-integration-test + env: + AUTH0_TEST_PASSWORD: ${{ secrets.AUTH0_TEST_PASSWORD }} + AUTH0_TEST_USERNAME: ${{ secrets.AUTH0_TEST_USERNAME }} + INTEGRATION_RUN_E2E_TEST: "false" + INTEGRATION_TEST_ARGS: --test.run CleanState/|ClusterTemplate/ + WITH_DEBUG: "true" + run: | + sudo -E make run-integration-test + - name: save-talos-logs-artifacts + if: always() + uses: actions/upload-artifact@v4 + with: + name: talos-logs + path: ~/.talos/clusters/**/*.log + retention-days: "5" diff --git a/.github/workflows/e2e-upgrades-cron.yaml b/.github/workflows/e2e-upgrades-cron.yaml new file mode 100644 index 00000000..dca88334 --- /dev/null +++ b/.github/workflows/e2e-upgrades-cron.yaml @@ -0,0 +1,53 @@ +# THIS FILE WAS AUTOMATICALLY GENERATED, PLEASE DO NOT EDIT. +# +# Generated on 2024-02-28T11:30:58Z by kres latest. + +name: e2e-upgrades-cron +concurrency: + group: ${{ github.head_ref || github.run_id }} + cancel-in-progress: true +"on": + schedule: + - cron: 30 1 * * * +jobs: + default: + runs-on: + - self-hosted + - omni + services: + buildkitd: + image: moby/buildkit:v0.12.5 + options: --privileged + ports: + - 1234:1234 + volumes: + - /var/lib/buildkit/${{ github.repository }}:/var/lib/buildkit + - /usr/etc/buildkit/buildkitd.toml:/etc/buildkit/buildkitd.toml + steps: + - name: checkout + uses: actions/checkout@v4 + - name: Unshallow + run: | + git fetch --prune --unshallow + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + with: + driver: remote + endpoint: tcp://localhost:1234 + timeout-minutes: 1 + - name: run-integration-test + env: + AUTH0_TEST_PASSWORD: ${{ secrets.AUTH0_TEST_PASSWORD }} + AUTH0_TEST_USERNAME: ${{ secrets.AUTH0_TEST_USERNAME }} + INTEGRATION_RUN_E2E_TEST: "false" + INTEGRATION_TEST_ARGS: --test.run CleanState/|TalosUpgrades/|KubernetesUpgrades/|MaintenanceDowngrade/ + WITH_DEBUG: "true" + run: | + sudo -E make run-integration-test + - name: save-talos-logs-artifacts + if: always() + uses: actions/upload-artifact@v4 + with: + name: talos-logs + path: ~/.talos/clusters/**/*.log + retention-days: "5" diff --git a/.github/workflows/slack-notify.yaml b/.github/workflows/slack-notify.yaml new file mode 100644 index 00000000..9b45a9d8 --- /dev/null +++ b/.github/workflows/slack-notify.yaml @@ -0,0 +1,97 @@ +# THIS FILE WAS AUTOMATICALLY GENERATED, PLEASE DO NOT EDIT. +# +# Generated on 2023-11-23T16:03:37Z by kres latest. + +name: slack-notify +"on": + workflow_run: + workflows: + - default + - e2e-short-cron + - e2e-scaling-cron + - e2e-upgrades-cron + - e2e-templates-cron + - e2e-backups-cron + types: + - completed +jobs: + slack-notify: + runs-on: + - self-hosted + - generic + if: github.event.workflow_run.conclusion != 'skipped' + steps: + - name: Get PR number + id: get-pr-number + if: github.event.workflow_run.event == 'pull_request' + env: + GH_TOKEN: ${{ github.token }} + run: | + echo pull_request_number=$(gh pr view -R ${{ github.repository }} ${{ github.event.workflow_run.head_repository.owner.login }}:${{ github.event.workflow_run.head_branch }} --json number --jq .number) >> $GITHUB_OUTPUT + - name: Slack Notify + uses: slackapi/slack-github-action@v1 + with: + channel-id: proj-talos-maintainers + payload: | + { + "attachments": [ + { + "color": "${{ github.event.workflow_run.conclusion == 'success' && '#2EB886' || github.event.workflow_run.conclusion == 'failure' && '#A30002' || '#FFCC00' }}", + "fallback": "test", + "blocks": [ + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "${{ github.event.workflow_run.event == 'pull_request' && format('*Pull Request:* {0} (`{1}`)\n<{2}/pull/{3}|{4}>', github.repository, github.ref_name, github.event.repository.html_url, steps.get-pr-number.outputs.pull_request_number, github.event.workflow_run.display_title) || format('*Build:* {0} (`{1}`)\n<{2}/commit/{3}|{4}>', github.repository, github.ref_name, github.event.repository.html_url, github.sha, github.event.workflow_run.display_title) }}" + }, + { + "type": "mrkdwn", + "text": "*Status:*\n`${{ github.event.workflow_run.conclusion }}`" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Author:*\n`${{ github.actor }}`" + }, + { + "type": "mrkdwn", + "text": "*Event:*\n`${{ github.event.workflow_run.event }}`" + } + ] + }, + { + "type": "divider" + }, + { + "type": "actions", + "elements": [ + { + "type": "button", + "text": { + "type": "plain_text", + "text": "Logs" + }, + "url": "${{ github.event.workflow_run.html_url }}" + }, + { + "type": "button", + "text": { + "type": "plain_text", + "text": "Commit" + }, + "url": "${{ github.event.repository.html_url }}/commit/${{ github.sha }}" + } + ] + } + ] + } + ] + } + env: + SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..1ba1aaad --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +# THIS FILE WAS AUTOMATICALLY GENERATED, PLEASE DO NOT EDIT. +# +# Generated on 2022-11-30T18:14:53Z by kres c41f376. + +_out +hack/generate-certs.yml +hack/generate-certs/ca-root +hack/generate-certs/certs +hack/compose/docker-compose.override.yml +frontend/node_modules diff --git a/.golangci.yml b/.golangci.yml new file mode 100644 index 00000000..18755b7c --- /dev/null +++ b/.golangci.yml @@ -0,0 +1,178 @@ +# THIS FILE WAS AUTOMATICALLY GENERATED, PLEASE DO NOT EDIT. +# +# Generated on 2024-02-09T09:47:03Z by kres decf506. + +# options for analysis running +run: + timeout: 10m + issues-exit-code: 1 + tests: true + build-tags: [] + skip-dirs: [] + skip-dirs-use-default: true + skip-files: [] + modules-download-mode: readonly + +# output configuration options +output: + format: colored-line-number + print-issued-lines: true + print-linter-name: true + uniq-by-line: true + path-prefix: "" + +# all available settings of specific linters +linters-settings: + dogsled: + max-blank-identifiers: 2 + dupl: + threshold: 150 + errcheck: + check-type-assertions: true + check-blank: true + exhaustive: + default-signifies-exhaustive: false + funlen: + lines: 60 + statements: 40 + gci: + local-prefixes: github.com/siderolabs/omni/ + gocognit: + min-complexity: 30 + ireturn: + allow: + - anon + - error + - empty + - stdlib + - github.com\/talos-systems\/kres\/internal\/dag.Node + nestif: + min-complexity: 5 + goconst: + min-len: 3 + min-occurrences: 3 + gocritic: + disabled-checks: [] + gocyclo: + min-complexity: 20 + godot: + check-all: false + godox: + keywords: # default keywords are TODO, BUG, and FIXME, these can be overwritten by this setting + - NOTE + - OPTIMIZE # marks code that should be optimized before merging + - HACK # marks hack-arounds that should be removed before merging + gofmt: + simplify: true + goimports: + local-prefixes: github.com/siderolabs/omni/ + golint: + min-confidence: 0.8 + gomnd: + settings: {} + gomodguard: {} + govet: + check-shadowing: true + enable-all: true + lll: + line-length: 200 + tab-width: 4 + misspell: + locale: US + ignore-words: [] + nakedret: + max-func-lines: 30 + prealloc: + simple: true + range-loops: true # Report preallocation suggestions on range loops, true by default + for-loops: false # Report preallocation suggestions on for loops, false by default + nolintlint: + allow-unused: false + allow-leading-space: false + allow-no-explanation: [] + require-explanation: false + require-specific: true + rowserrcheck: {} + testpackage: {} + unparam: + check-exported: false + unused: + check-exported: false + whitespace: + multi-if: false # Enforces newlines (or comments) after every multi-line if statement + multi-func: false # Enforces newlines (or comments) after every multi-line function signature + wsl: + strict-append: true + allow-assign-and-call: true + allow-multiline-assign: true + allow-cuddle-declarations: false + allow-trailing-comment: false + force-case-trailing-whitespace: 0 + force-err-cuddling: false + allow-separated-leading-comment: false + gofumpt: + extra-rules: false + cyclop: + # the maximal code complexity to report + max-complexity: 20 + # depguard: + # Main: + # deny: + # - github.com/OpenPeeDeeP/depguard # this is just an example + +linters: + enable-all: true + disable-all: false + fast: false + disable: + - exhaustruct + - exhaustivestruct + - forbidigo + - funlen + - gas + - gochecknoglobals + - gochecknoinits + - godox + - goerr113 + - gomnd + - gomoddirectives + - ireturn + - nestif + - nonamedreturns + - nosnakecase + - paralleltest + - tagliatelle + - thelper + - typecheck + - varnamelen + - wrapcheck + - depguard # Disabled because starting with golangci-lint 1.53.0 it doesn't allow denylist alone anymore + - tagalign + - inamedparam + - testifylint # complains about our assert recorder and has a number of false positives for assert.Greater(t, thing, 1) + - protogetter # complains about us using Value field on typed spec, instead of GetValue which has a different signature + - perfsprint # complains about us using fmt.Sprintf in non-performance critical code, updating just kres took too long + # abandoned linters for which golangci shows the warning that the repo is archived by the owner + - interfacer + - maligned + - golint + - scopelint + - varcheck + - deadcode + - structcheck + - ifshort + # disabled as it seems to be broken - goes into imported libraries and reports issues there + - musttag + +issues: + exclude: [] + exclude-rules: [] + exclude-use-default: false + exclude-case-sensitive: false + max-issues-per-linter: 10 + max-same-issues: 3 + new: false + +severity: + default-severity: error + case-sensitive: false diff --git a/.kres.yaml b/.kres.yaml new file mode 100644 index 00000000..c6595775 --- /dev/null +++ b/.kres.yaml @@ -0,0 +1,511 @@ +--- +kind: auto.CommandConfig +name: omnictl +spec: + disableImage: true +--- +kind: auto.CommandConfig +name: omni-integration-test +spec: + disableImage: true +--- +kind: auto.CustomSteps +spec: + steps: + - name: dev-server + toplevel: true + - name: docker-compose-up + toplevel: true + - name: docker-compose-down + toplevel: true + - name: mkcert-install + toplevel: true + - name: mkcert-generate + toplevel: true + - name: mkcert-uninstall + toplevel: true + - name: run-integration-test + toplevel: true +--- +kind: custom.Step +name: dev-server +spec: + makefile: + enabled: true + phony: true + script: + - hack/dev-server.sh +--- +kind: custom.Step +name: docker-compose-up +spec: + makefile: + enabled: true + phony: true + script: + - >- + ARTIFACTS="$(ARTIFACTS)" + SHA="$(SHA)" + TAG="$(TAG)" + USERNAME="$(USERNAME)" + REGISTRY="$(REGISTRY)" + JS_TOOLCHAIN="$(JS_TOOLCHAIN)" + PROTOBUF_TS_VERSION="$(PROTOBUF_TS_VERSION)" + PROTOBUF_GRPC_GATEWAY_TS_VERSION="$(PROTOBUF_GRPC_GATEWAY_TS_VERSION)" + NODE_BUILD_ARGS="$(NODE_BUILD_ARGS)" + TOOLCHAIN="$(TOOLCHAIN)" + CGO_ENABLED="$(CGO_ENABLED)" + GO_BUILDFLAGS="$(GO_BUILDFLAGS)" + GOLANGCILINT_VERSION="$(GOLANGCILINT_VERSION)" + GOFUMPT_VERSION="$(GOFUMPT_VERSION)" + GOIMPORTS_VERSION="$(GOIMPORTS_VERSION)" + PROTOBUF_GO_VERSION="$(PROTOBUF_GO_VERSION)" + GRPC_GO_VERSION="$(GRPC_GO_VERSION)" + GRPC_GATEWAY_VERSION="$(GRPC_GATEWAY_VERSION)" + VTPROTOBUF_VERSION="$(VTPROTOBUF_VERSION)" + DEEPCOPY_VERSION="$(DEEPCOPY_VERSION)" + TESTPKGS="$(TESTPKGS)" + COMPOSE_DOCKER_CLI_BUILD=1 + DOCKER_BUILDKIT=1 + GO_LDFLAGS="$(GO_LDFLAGS)" + docker compose --file ./hack/compose/docker-compose.yml --file ./hack/compose/docker-compose.override.yml up --build +--- +kind: custom.Step +name: mkcert-generate +spec: + makefile: + enabled: true + phony: true + script: + - >- + go run ./hack/generate-certs -config ./hack/generate-certs.yml generate +--- +kind: custom.Step +name: mkcert-install +spec: + makefile: + enabled: true + phony: true + script: + - >- + go run ./hack/generate-certs install +--- +kind: custom.Step +name: mkcert-uninstall +spec: + makefile: + enabled: true + phony: true + script: + - >- + go run ./hack/generate-certs uninstall +--- +kind: custom.Step +name: docker-compose-down +spec: + makefile: + enabled: true + phony: true + variables: + - name: REMOVE_VOLUMES + defaultValue: false + script: + - >- + ARTIFACTS="$(ARTIFACTS)" + SHA="$(SHA)" + TAG="$(TAG)" + USERNAME="$(USERNAME)" + REGISTRY="$(REGISTRY)" + JS_TOOLCHAIN="$(JS_TOOLCHAIN)" + PROTOBUF_TS_VERSION="$(PROTOBUF_TS_VERSION)" + PROTOBUF_GRPC_GATEWAY_TS_VERSION="$(PROTOBUF_GRPC_GATEWAY_TS_VERSION)" + NODE_BUILD_ARGS="$(NODE_BUILD_ARGS)" + TOOLCHAIN="$(TOOLCHAIN)" + CGO_ENABLED="$(CGO_ENABLED)" + GO_BUILDFLAGS="$(GO_BUILDFLAGS)" + GOLANGCILINT_VERSION="$(GOLANGCILINT_VERSION)" + GOFUMPT_VERSION="$(GOFUMPT_VERSION)" + GOIMPORTS_VERSION="$(GOIMPORTS_VERSION)" + PROTOBUF_GO_VERSION="$(PROTOBUF_GO_VERSION)" + GRPC_GO_VERSION="$(GRPC_GO_VERSION)" + GRPC_GATEWAY_VERSION="$(GRPC_GATEWAY_VERSION)" + VTPROTOBUF_VERSION="$(VTPROTOBUF_VERSION)" + DEEPCOPY_VERSION="$(DEEPCOPY_VERSION)" + TESTPKGS="$(TESTPKGS)" + COMPOSE_DOCKER_CLI_BUILD=1 + DOCKER_BUILDKIT=1 + GO_LDFLAGS="$(GO_LDFLAGS)" + docker compose --file ./hack/compose/docker-compose.yml --file ./hack/compose/docker-compose.override.yml down --rmi local --remove-orphans --volumes=$(REMOVE_VOLUMES) +--- +kind: custom.Step +name: run-integration-test +spec: + sudoInCI: true + makefile: + enabled: true + depends: + - omni-integration-test-linux-amd64 + - omnictl-linux-amd64 + - omni-linux-amd64 + script: + - >- + @hack/test/integration.sh + ghaction: + enabled: true + artifacts: + enabled: true + extraPaths: + - "!_out/etcd" + - "!_out/secondary-storage/**" + additional: + - name: talos-logs + always: true + continueOnError: true + paths: + - ~/.talos/clusters/**/*.log + environment: + WITH_DEBUG: "true" + INTEGRATION_RUN_E2E_TEST: "true" + INTEGRATION_TEST_ARGS: "--test.run CleanState/|Auth/|DefaultCluster/" + AUTH0_TEST_PASSWORD: ${{ secrets.AUTH0_TEST_PASSWORD }} + AUTH0_TEST_USERNAME: ${{ secrets.AUTH0_TEST_USERNAME }} + jobs: + - name: e2e-short + crons: + - '30 1 * * *' + runnerLabels: + - omni + triggerLabels: + - integration/e2e + - integration/e2e-short + environmentOverride: + INTEGRATION_RUN_E2E_TEST: "false" + INTEGRATION_TEST_ARGS: "--test.run CleanState/|TalosImageGeneration/|ImmediateClusterDestruction/|DefaultCluster/|EncryptedCluster/|SinglenodeCluster/|Auth/" + - name: e2e-scaling + crons: + - '30 1 * * *' + runnerLabels: + - omni + triggerLabels: + - integration/e2e + - integration/e2e-scaling + environmentOverride: + INTEGRATION_RUN_E2E_TEST: "false" + INTEGRATION_TEST_ARGS: "--test.run CleanState/|ScaleUpAndDown/|ScaleUpAndDownMachineClassBasedMachineSets/|RollingUpdateParallelism/|ForcedMachineRemoval/|ReplaceControlPlanes/|ConfigPatching/" + - name: e2e-upgrades + crons: + - '30 1 * * *' + runnerLabels: + - omni + triggerLabels: + - integration/e2e + - integration/e2e-upgrades + environmentOverride: + INTEGRATION_RUN_E2E_TEST: "false" + INTEGRATION_TEST_ARGS: "--test.run CleanState/|TalosUpgrades/|KubernetesUpgrades/|MaintenanceDowngrade/" + - name: e2e-templates + crons: + - '30 1 * * *' + runnerLabels: + - omni + triggerLabels: + - integration/e2e + - integration/e2e-templates + environmentOverride: + INTEGRATION_RUN_E2E_TEST: "false" + INTEGRATION_TEST_ARGS: "--test.run CleanState/|ClusterTemplate/" + - name: e2e-backups + crons: + - '30 1 * * *' + runnerLabels: + - omni + triggerLabels: + - integration/e2e + - integration/e2e-backups + environmentOverride: + INTEGRATION_RUN_E2E_TEST: "false" + INTEGRATION_TEST_ARGS: "--test.run CleanState/|EtcdBackupAndRestore" +--- +kind: common.Build +spec: + ignoredPaths: + - "hack/generate-certs.yml" + - "hack/generate-certs/ca-root" + - "hack/generate-certs/certs" + - "hack/compose/docker-compose.override.yml" +--- +kind: golang.Build +name: omni +spec: + outputs: + linux-amd64: + GOOS: linux + GOARCH: amd64 + linux-arm64: + GOOS: linux + GOARCH: arm64 + darwin-amd64: + GOOS: darwin + GOARCH: amd64 + darwin-arm64: + GOOS: darwin + GOARCH: arm64 +--- +kind: golang.Build +name: omnictl +spec: + outputs: + linux-amd64: + GOOS: linux + GOARCH: amd64 + linux-arm64: + GOOS: linux + GOARCH: arm64 + darwin-amd64: + GOOS: darwin + GOARCH: amd64 + darwin-arm64: + GOOS: darwin + GOARCH: arm64 + windows-amd64.exe: + GOOS: windows + GOARCH: amd64 +--- +kind: golang.Build +name: omni-integration-test +spec: + outputs: + linux-amd64: + GOOS: linux + GOARCH: amd64 +--- +kind: golang.Generate +spec: + versionPackagePath: internal/version + licenseText: | + Copyright (c) 2024 Sidero Labs, Inc. + + Use of this software is governed by the Business Source License + included in the LICENSE file. +--- +kind: golang.Generate +spec: + baseSpecPath: /client/api + goGenerateSpecs: + - source: ./internal + copy: + - frontend/ + vtProtobufEnabled: true + specs: + - source: client/api/common/omni.proto + subdirectory: common + - source: client/api/omni/resources/resources.proto + subdirectory: omni/resources + genGateway: true + - source: client/api/omni/management/management.proto + subdirectory: omni/management + genGateway: true + - source: client/api/omni/oidc/oidc.proto + subdirectory: omni/oidc + genGateway: true + - source: client/api/omni/specs/auth.proto + subdirectory: omni/specs + genGateway: true + - source: client/api/omni/specs/virtual.proto + subdirectory: omni/specs + genGateway: true + - source: client/api/omni/specs/ephemeral.proto + subdirectory: omni/specs + genGateway: true + - source: client/api/omni/specs/oidc.proto # not used in the frontend + subdirectory: omni/specs + genGateway: true + - source: client/api/omni/specs/omni.proto + subdirectory: omni/specs + genGateway: true + - source: client/api/omni/specs/siderolink.proto + subdirectory: omni/specs + genGateway: true + - source: client/api/omni/specs/system.proto + subdirectory: omni/specs + genGateway: true + - source: https://raw.githubusercontent.com/googleapis/googleapis/master/google/rpc/status.proto + subdirectory: google/rpc/ + genGateway: true + - source: https://raw.githubusercontent.com/siderolabs/talos/03a20da9da5916c63015d355f4b56823778e994f/api/common/common.proto + subdirectory: common/ + genGateway: true + - source: https://raw.githubusercontent.com/siderolabs/talos/03a20da9da5916c63015d355f4b56823778e994f/api/machine/machine.proto + subdirectory: talos/machine/ + genGateway: true + - source: https://raw.githubusercontent.com/cosi-project/specification/c644a4b0fd408ec41bd29193bcdbd1a5b7feead2/proto/v1alpha1/resource.proto + subdirectory: v1alpha1 + genGateway: true +--- +kind: js.Build +spec: + licenseText: | + Copyright (c) 2024 Sidero Labs, Inc. + + Use of this software is governed by the Business Source License + included in the LICENSE file. +--- +kind: js.Protobuf +spec: + baseSpecPath: /client/api + files: + - source: https://www.talos.dev/v1.6/schemas/config.schema.json + destination: frontend/src/schemas/config.schema.json + destinationRoot: src/api + specs: + - source: client/api/common/omni.proto + subdirectory: common + genGateway: true + - source: client/api/omni/resources/resources.proto + subdirectory: omni/resources + genGateway: true + - source: client/api/omni/management/management.proto + subdirectory: omni/management + genGateway: true + - source: client/api/omni/oidc/oidc.proto + subdirectory: omni/oidc + genGateway: true + - source: https://raw.githubusercontent.com/siderolabs/go-api-signature/a034e9ff315ba4a56115acc7ad0fb99d0dc77800/api/auth/auth.proto + subdirectory: omni/auth + genGateway: true + - source: client/api/omni/specs/omni.proto + subdirectory: omni/specs + genGateway: true + - source: client/api/omni/specs/siderolink.proto + subdirectory: omni/specs + genGateway: true + - source: client/api/omni/specs/system.proto + subdirectory: omni/specs + genGateway: true + - source: client/api/omni/specs/auth.proto + subdirectory: omni/specs + genGateway: true + - source: client/api/omni/specs/virtual.proto + subdirectory: omni/specs + genGateway: true + - source: client/api/omni/specs/ephemeral.proto + subdirectory: omni/specs + genGateway: true + - source: https://raw.githubusercontent.com/googleapis/googleapis/master/google/rpc/status.proto + subdirectory: google/rpc/ + genGateway: true + - source: https://raw.githubusercontent.com/siderolabs/talos/03a20da9da5916c63015d355f4b56823778e994f/api/machine/machine.proto + subdirectory: talos/machine + genGateway: true + - source: https://raw.githubusercontent.com/protocolbuffers/protobuf/master/src/google/protobuf/any.proto + subdirectory: google/protobuf/ + genGateway: true + - source: https://raw.githubusercontent.com/protocolbuffers/protobuf/master/src/google/protobuf/duration.proto + subdirectory: google/protobuf/ + genGateway: true + - source: https://raw.githubusercontent.com/protocolbuffers/protobuf/master/src/google/protobuf/empty.proto + subdirectory: google/protobuf/ + genGateway: true + - source: https://raw.githubusercontent.com/protocolbuffers/protobuf/master/src/google/protobuf/timestamp.proto + subdirectory: google/protobuf/ + genGateway: true + - source: https://raw.githubusercontent.com/googleapis/googleapis/master/google/rpc/code.proto + subdirectory: google/rpc/ + genGateway: true + - source: https://raw.githubusercontent.com/siderolabs/talos/03a20da9da5916c63015d355f4b56823778e994f/api/common/common.proto + subdirectory: common/ + genGateway: true + - source: https://raw.githubusercontent.com/cosi-project/specification/5c734257bfa6a3acb01417809797dbfbe0e73c71/proto/v1alpha1/resource.proto + subdirectory: v1alpha1 + genGateway: true +--- +kind: common.Release +name: release +spec: + artifacts: + - omnictl-* + - omni-* +--- +kind: common.Image +name: image-omni +spec: + copyFrom: + - stage: omnictl-all + destination: /omnictl/ +--- +kind: service.CodeCov +spec: + enabled: false +--- +kind: common.Repository +spec: + licenses: + - id: BSL-1.1 + params: + Licensor: Sidero Labs, Inc. + LicensedWork: Omni + Copyright: (c) 2024 Sidero Labs, Inc. + ChangeDate: "2028-02-22" + ChangeLicense: Mozilla Public License, version 2.0 + EnterpriseLink: https://www.siderolabs.com/contact/ + header: | + // Copyright (c) 2024 Sidero Labs, Inc. + // + // Use of this software is governed by the Business Source License + // included in the LICENSE file. + + - id: MPL-2.0 + root: client + header: | + // This Source Code Form is subject to the terms of the Mozilla Public + // License, v. 2.0. If a copy of the MPL was not distributed with this + // file, You can obtain one at http://mozilla.org/MPL/2.0/. + licenseChecks: + - root: "." + header: | + // Copyright (c) 2024 Sidero Labs, Inc. + // + // Use of this software is governed by the Business Source License + // included in the LICENSE file. + includeSuffixes: + - .go + - .ts + - .js + excludeSuffixes: + - .pb.go + - .pb.gw.go + - .pb.ts + - babel.config.js + skipPaths: + - .git + - testdata/ + - client/ + - frontend/node_modules/ + - internal/pkg/kubernetes/resource/ # contains a file copied from kubectl + + - root: client + header: | + // This Source Code Form is subject to the terms of the Mozilla Public + // License, v. 2.0. If a copy of the MPL was not distributed with this + // file, You can obtain one at http://mozilla.org/MPL/2.0/ + + - root: frontend/ + header: | + <!-- + Copyright (c) 2024 Sidero Labs, Inc. + + Use of this software is governed by the Business Source License + included in the LICENSE file. + --> + includeSuffixes: + - .vue + skipPaths: + - node_modules/ + + enableConform: true + enforceContexts: + - e2e-short + - e2e-scaling + - e2e-templates + - e2e-upgrades + - e2e-backups diff --git a/.license-header.go.txt b/.license-header.go.txt new file mode 100644 index 00000000..574b91d2 --- /dev/null +++ b/.license-header.go.txt @@ -0,0 +1,4 @@ +// Copyright (c) 2024 Sidero Labs, Inc. +// +// Use of this software is governed by the Business Source License +// included in the LICENSE file. diff --git a/.markdownlint.json b/.markdownlint.json new file mode 100644 index 00000000..042c1557 --- /dev/null +++ b/.markdownlint.json @@ -0,0 +1,9 @@ +# THIS FILE WAS AUTOMATICALLY GENERATED, PLEASE DO NOT EDIT. +# +# Generated on 2020-08-29T13:20:33Z by kres latest. + +{ + "MD013": false, + "MD033": false, + "default": true + } diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..26c033ed --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "css.lint.unknownAtRules": "ignore", + "vue3snippets.enable-compile-vue-file-on-did-save-code": false +} diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..a3fa663b --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,1655 @@ +## [Omni 0.20.0](https://github.com/siderolabs/omni/releases/tag/v0.20.0) (2023-10-17) + +Welcome to the v0.20.0 release of Omni! + + + +Please try out the release binaries and report any issues at +https://github.com/siderolabs/omni/issues. + +### Kubeconfig Changes + +Omni now generates Kubernetes configs without accessing Talos API. + + +### + +Omni can now define SAML user roles depending on the SAML labels it gets from the SAML assertion. +Role is assigned only once on user creation. + + +### Contributors + +* Andrey Smirnov +* Artem Chernyshev +* Utku Ozdemir + +### Changes +<details><summary>19 commits</summary> +<p> + +* [`992614d4`](https://github.com/siderolabs/omni/commit/992614d408f185692ddde2021682fdef68ebd5ba) chore: stop kubernetes status watchers for the offline cluster +* [`79868c27`](https://github.com/siderolabs/omni/commit/79868c279355bec3b36c194f97381d55e3b4a007) chore: optimize controller operations for disconnected machines +* [`8c2c39d3`](https://github.com/siderolabs/omni/commit/8c2c39d386cb8074db3c196b69b07fc80d30fdbe) fix: do not run loadbalancer for the unreachable clusters +* [`caf3d955`](https://github.com/siderolabs/omni/commit/caf3d955fe8e79e1a52ff463c3c6e0fa5e8420d8) test: set unique names for config patches +* [`f31373bd`](https://github.com/siderolabs/omni/commit/f31373bd317dcb1be407d3616669746f2ba79fee) feat: implement kubeconfig generation on Omni side +* [`681ffa3b`](https://github.com/siderolabs/omni/commit/681ffa3b1d8446f77618399353f8563d139d9f44) feat: allow defining SAML label mapping rules to Omni roles +* [`9d3f3b9e`](https://github.com/siderolabs/omni/commit/9d3f3b9e3ad0a56f666b50e2930610c0fa91f8eb) fix: rewrite the link counter handling +* [`9becbc78`](https://github.com/siderolabs/omni/commit/9becbc78f8ffc7065e2c8dcaa0386fa00a147c17) refactor: use COSI runtime with new controller runtime DB +* [`22235517`](https://github.com/siderolabs/omni/commit/22235517c04351136fc1a34977f394e4298cb25e) fix: gracefully handle links removal in the siderolink manager +* [`26ae4163`](https://github.com/siderolabs/omni/commit/26ae416378acfee1ae66561017cd809da6960f3c) refactor: lower the level of log storage logs +* [`01743ecd`](https://github.com/siderolabs/omni/commit/01743ecdde23583e9bc177e250122e6237996975) fix: rework the talos client and configuration generation +* [`f837129a`](https://github.com/siderolabs/omni/commit/f837129ae469d319b78e575f0e72e16f97f8e2fe) chore: bump Talos machinery to the latest main +* [`4a79387e`](https://github.com/siderolabs/omni/commit/4a79387e95f07e2f33df682904af00eb38bf1f5b) fix: update to Go 1.21.3 +* [`3df360b8`](https://github.com/siderolabs/omni/commit/3df360b81196e939eb571e6ee262eb5bee715bd7) chore: log received interruption signals in Omni +* [`0a72c596`](https://github.com/siderolabs/omni/commit/0a72c5962a446f4ca1ea9399ff87aa750587bd07) chore: update state-etcd to v0.2.4 +* [`4f2978d2`](https://github.com/siderolabs/omni/commit/4f2978d2cf051a2a83eca885193792a335d94fcc) test: override grpc call log level in authorization tests +* [`e21e39a8`](https://github.com/siderolabs/omni/commit/e21e39a83e80ef3226e73f85d0f36fcfd7e0b7b9) test: avoid excessive public key registration in integration tests +* [`78c5fbdf`](https://github.com/siderolabs/omni/commit/78c5fbdf290ffe8feb2d42a7a510089f327eaf60) ci: remove gh actions workflow +* [`e9f07068`](https://github.com/siderolabs/omni/commit/e9f07068ac0c08a7500677ec22d94afbb437e151) test: fix the assertion on cluster destroyed +</p> +</details> + +### Dependency Changes + +* **github.com/cosi-project/runtime** v0.3.11 -> v0.3.13 +* **github.com/cosi-project/state-etcd** v0.2.3 -> v0.2.4 +* **github.com/hashicorp/golang-lru/v2** v2.0.7 **_new_** +* **github.com/siderolabs/talos/pkg/machinery** c14a5d4f79a3 -> 7bb205ebe2ef +* **golang.org/x/crypto** v0.13.0 -> v0.14.0 +* **golang.org/x/net** v0.15.0 -> v0.17.0 +* **google.golang.org/grpc** v1.58.2 -> v1.58.3 + +Previous release can be found at [v0.19.0](https://github.com/siderolabs/omni/releases/tag/v0.19.0) + +## [Omni 0.16.0](https://github.com/siderolabs/omni/releases/tag/v0.16.0) (2023-08-18) + +Welcome to the v0.16.0 release of Omni! + + + +Please try out the release binaries and report any issues at +https://github.com/siderolabs/omni/issues. + +### Better Etcd Disaster Recovery + +Omni now allows replacing control plane machines even if etcd is unhealthy. +And stil properly handles safety checks, not allowing to break etcd quorum, +allowing removing only unhealthy machines. + +It also allows canceling machine destroy sequence if the machine destroyed +is not being torn down by the machine set controller. + + +### Machine Locking + +Cluster templates now also support machine locking: + +```yaml +kind: Machine +name: 430d882a-51a8-48b3-ab00-d4b5b0b5b0b0 +locked: true +``` + + +### Limit Workload Access + +Workload proxy now takes into account the access to the cluster when allowing users to open the service endpoints. + + +### Contributors + +* Utku Ozdemir +* Artem Chernyshev +* Dmitriy Matrenichev + +### Changes +<details><summary>18 commits</summary> +<p> + +* [`3d1c19a1`](https://github.com/siderolabs/omni/commit/3d1c19a11110e8b3e8a04543797b0cf32cd79a88) feat: allow replacing control plane machines if it doesn't break etcd +* [`12561b5b`](https://github.com/siderolabs/omni/commit/12561b5b82d4f150dac334e8b891b7f3dc7aeb54) fix: don't allow changing disk for the nodes that have Talos installed +* [`8e17f742`](https://github.com/siderolabs/omni/commit/8e17f742c17f0e47b79b1e2da03725a7205721f8) feat: allow canceling deletion of a machine set node +* [`1d8722aa`](https://github.com/siderolabs/omni/commit/1d8722aa353258c4e157e122ec9f11ddd8d1476b) chore: use 1.5.0 Talos in tests and enable disk encryption feature +* [`3318a443`](https://github.com/siderolabs/omni/commit/3318a443c4bd8c36914b1d0a768c59ff6651680b) feat: show `invalid-state` label if the machine is reachable but apid is not +* [`05f69c0d`](https://github.com/siderolabs/omni/commit/05f69c0d2a40837a466b4b2f607f7df5601207fa) feat: enable workload proxying by default +* [`dded4d81`](https://github.com/siderolabs/omni/commit/dded4d814633f42b2677ca392636f6103d042b55) fix: check for roles and ACLs on exposed service access +* [`d718f134`](https://github.com/siderolabs/omni/commit/d718f13432e92666b875b9134cf38c12dbbf01e5) chore: run auth tests in main integration test pipeline +* [`79516583`](https://github.com/siderolabs/omni/commit/79516583e7995b3832f0759dbdc855e230f42abe) chore: remove `toInputWeak` and add mutex.Empty +* [`6b2e09b7`](https://github.com/siderolabs/omni/commit/6b2e09b7e2229c25bd77863a7aa9aed367b20845) chore: bump Go to 1.21 +* [`a5f4a9a4`](https://github.com/siderolabs/omni/commit/a5f4a9a493a7e359ec552f61dabb898ad7dd66e6) chore: cleanup `ConfigPatch` resources along with their owners +* [`a48efd7a`](https://github.com/siderolabs/omni/commit/a48efd7a9793c47a23b1b57fa23f90e7c72c7825) feat: add support for machine locking in cluster templates +* [`964eb23d`](https://github.com/siderolabs/omni/commit/964eb23dc862cabb9b3029515ff1a947ee6978f2) feat: block `os:admin` access to Talos API from workload clusters +* [`65bb6403`](https://github.com/siderolabs/omni/commit/65bb6403a529bf24aedf1175230fb98b4f63ab0d) refactor: simplify cleanup of exposed services +* [`ede70550`](https://github.com/siderolabs/omni/commit/ede70550561562b930196701f989a1821da5ebba) fix: destroy exposedservices when cluster is destroyed +* [`ddfd7657`](https://github.com/siderolabs/omni/commit/ddfd7657a3d871ab6da4b42adfb2b940e3781b36) fix: fix workload svc proxy feature visibility on frontend +* [`ead58143`](https://github.com/siderolabs/omni/commit/ead581434227dad691e0e8ac9a7f0926afb7d2b9) chore: update vault in docker-compose +* [`653824ca`](https://github.com/siderolabs/omni/commit/653824ca093ca053c129bd15780ae2e27e91ced0) chore: set default Talos version to v1.4.7 +</p> +</details> + +### Dependency Changes + +* **github.com/emicklei/dot** v1.5.0 -> v1.6.0 +* **github.com/siderolabs/talos/pkg/machinery** 80238a05a6f8 -> v1.5.0-beta.1 +* **go.uber.org/zap** v1.24.0 -> v1.25.0 +* **golang.org/x/net** v0.12.0 -> v0.14.0 +* **golang.org/x/text** v0.11.0 -> v0.12.0 +* **golang.org/x/tools** v0.11.0 -> v0.12.0 + +Previous release can be found at [v0.15.0](https://github.com/siderolabs/omni/releases/tag/v0.15.0) + +## [Omni 0.11.0-alpha.0](https://github.com/siderolabs/omni/releases/tag/v0.11.0-alpha.0) (2023-06-08) + +Welcome to the v0.11.0-alpha.0 release of Omni! +*This is a pre-release of Omni* + + + +Please try out the release binaries and report any issues at +https://github.com/siderolabs/omni/issues. + +### Support Full ACL Syntax + +ACL now supports configuring additive perimissions to the base role, which includes: + +- accessing the clusters - read-only, write access, separate Talos API access +- read-only access to machines +- write access to machines + + +### SAML support + +Omni now supports SAML authentication. +SAML authentication is enabled by the following cmd line flags: + +``` +--auth-saml-enabled +--auth-saml-url <idp-url> +--auth-saml-metadata <idp-metadata> +--auth-saml-label-rules '{"Role": "role"}' +``` + +Omni metadata endpoint is `/saml/metadata`. + +The users are automatically created on the first SAML login. +The first created user has Admin permissions, other have no permissions. +Permissions can be managed by ACLs or `Admin` can change user roles. + + +### Replace User Scopes with Roles + +User management is now simplified. Instead of having scopes like `cluster:read`, `cluster:write`, etc, +the user is assigned one of 4 roles: `None`, `Reader`, `Operator`, `Admin`. + +- `None` - gives no permissions. +- `Reader` - gives readonly permissions. +- `Operator` - allows managing clusters, machines, getting talosconfig, but doesn't allow editing users. +- `Amdin` - all permissions. + +Fine grained access can still be managed by ACLs. + + +### Contributors + +* Utku Ozdemir +* Artem Chernyshev +* Andrey Smirnov + +### Changes +<details><summary>10 commits</summary> +<p> + +* [`c7c93a1e`](https://github.com/siderolabs/omni/commit/c7c93a1e87f9d58ed8626aeed03bddb5b1d27a0d) fix: let the empty endpoints be recorded if there are no endpoints +* [`c28907e4`](https://github.com/siderolabs/omni/commit/c28907e4cafe2ed478ace42e5dfeeb0beaf52b95) feat: copy SAML attributes to `Identity` as labels +* [`a2f17a21`](https://github.com/siderolabs/omni/commit/a2f17a21f7321cc9dac4ea740afa8a14fa9d3e77) feat: implement full ACL syntax +* [`c0fa5d46`](https://github.com/siderolabs/omni/commit/c0fa5d46f705e73d904b78a5ce4e98dc0b787d0e) feat: add support for SAML authentication +* [`ad783798`](https://github.com/siderolabs/omni/commit/ad783798a081b4ff4ce667748db05688f91e0006) fix: replace `exponential-backoff` library with own implementation +* [`c8d7183a`](https://github.com/siderolabs/omni/commit/c8d7183a37e20c8fbc8c28b0d3cff684ae367199) feat: replace scopes with simplified roles +* [`08a048a9`](https://github.com/siderolabs/omni/commit/08a048a925fde227329b9b6696a03307ebc92256) feat: update default Talos to 1.4.5, Kubernetes to 1.27.2 +* [`5278321b`](https://github.com/siderolabs/omni/commit/5278321bb38a1af39b4157c0a49157cc5d16fe73) fix: respect service account key env on omnictl download +* [`caac445d`](https://github.com/siderolabs/omni/commit/caac445d65289afb4276de0788c877640c74b4de) fix: don't show `OngoingTasks` until the UI is authorized +* [`dfca66df`](https://github.com/siderolabs/omni/commit/dfca66dfa297f5c35b5c7ea44e81dab20e74d8c2) fix: include node name in the cluster node search +</p> +</details> + +### Changes from siderolabs/go-api-signature +<details><summary>1 commit</summary> +<p> + +* [`a034e9f`](https://github.com/siderolabs/go-api-signature/commit/a034e9ff315ba4a56115acc7ad0fb99d0dc77800) feat: replace scopes with roles +</p> +</details> + +### Dependency Changes + +* **github.com/crewjam/saml** v0.4.13 **_new_** +* **github.com/siderolabs/go-api-signature** v0.2.4 -> a034e9ff315b +* **github.com/siderolabs/talos/pkg/machinery** v1.4.4 -> v1.4.5 + +Previous release can be found at [v0.10.0](https://github.com/siderolabs/omni/releases/tag/v0.10.0) + +## [Omni 0.1.0-beta.2](https://github.com/siderolabs/omni/releases/tag/v0.1.0-beta.2) (2022-12-20) + +Welcome to the v0.1.0-beta.2 release of Omni! +*This is a pre-release of Omni* + + + +Please try out the release binaries and report any issues at +https://github.com/siderolabs/omni/issues. + +### Contributors + +* Andrey Smirnov +* Artem Chernyshev + +### Changes +<details><summary>5 commits</summary> +<p> + +* [`59df55f`](https://github.com/siderolabs/omni/commit/59df55f7b82c1e26564c77772eaa9755a2947b9e) fix: bring K8s info back to life on the node overview page +* [`2f54f91`](https://github.com/siderolabs/omni/commit/2f54f9136ecce5009dbca552c1ab01cfeb602679) chore: run etcd elections ("lock") to prevent concurrent Omni runs +* [`8beb051`](https://github.com/siderolabs/omni/commit/8beb05147a2746630c96fae2f62465dd3c95dd64) chore: update COSI to v0.3.0-alpha.2 +* [`f14e358`](https://github.com/siderolabs/omni/commit/f14e3582ed8f63ba188d7b7e0b33fed0f27c5b8a) fix: better errors in `talosctl` via Omni +* [`f12a216`](https://github.com/siderolabs/omni/commit/f12a21673593ace90c51bdf087e2c7d084bb9c5f) fix: properly reset flush timeout in the Talos logs viewer +</p> +</details> + +### Dependency Changes + +* **github.com/cosi-project/runtime** v0.3.0-alpha.1 -> v0.3.0-alpha.2 + +Previous release can be found at [v0.1.0-beta.1](https://github.com/siderolabs/omni/releases/tag/v0.1.0-beta.1) + +## [Omni 0.1.0-beta.1](https://github.com/siderolabs/omni/releases/tag/v0.1.0-beta.1) (2022-12-16) + +Welcome to the v0.1.0-beta.1 release of Omni! +*This is a pre-release of Omni* + + + +Please try out the release binaries and report any issues at +https://github.com/siderolabs/omni/issues. + +### Contributors + +* Andrey Smirnov +* Andrey Smirnov +* Utku Ozdemir +* Alexey Palazhchenko +* Artem Chernyshev +* Dmitriy Matrenichev +* Andrew Rynhard +* Artem Chernyshev +* Noel Georgi +* Serge Logvinov + +### Changes +<details><summary>20 commits</summary> +<p> + +* [`9a7a9a0`](https://github.com/siderolabs/omni/commit/9a7a9a02f4853ecb9d99031c9e606eab1cb4f7ea) feat: add RedactedClusterMachineConfig resource +* [`c83cfe2`](https://github.com/siderolabs/omni/commit/c83cfe2f84c88bcff62a2c664b805bccbc996e56) feat: rework the cluster list view and cluster overview pages +* [`f65ce14`](https://github.com/siderolabs/omni/commit/f65ce14cea1d9169e39bf5845c6f8aff70a299f1) fix: ignore keys if the auth is disabled +* [`e9c3831`](https://github.com/siderolabs/omni/commit/e9c383161583c33ae32f229dbcbb8e546db507c2) fix: create config patch if it does not exist +* [`437d271`](https://github.com/siderolabs/omni/commit/437d2718c6d4bdcef2aac4d5b2c98cf2ce17e4e8) fix: support Kubernetes proxy OIDC flow when auth is disabled +* [`a47c211`](https://github.com/siderolabs/omni/commit/a47c211222881d474bb5774ff4969d4144652096) fix: read cluster reference from MachineStatus spec +* [`8091f16`](https://github.com/siderolabs/omni/commit/8091f16161c7779b2406062e37bdbd7f4ea7e68e) fix: set owner on MachineStatus migration +* [`e986e20`](https://github.com/siderolabs/omni/commit/e986e20d6f8899c3ff99e316c9111de56dd8b42c) fix: wrong yaml module version (should be v3) +* [`dbb3d48`](https://github.com/siderolabs/omni/commit/dbb3d48d0ff3305a9c0184b469d0100ada76db6a) fix: rollback etcd auto compaction retention +* [`047b89f`](https://github.com/siderolabs/omni/commit/047b89fd81eeffb60680a289cf1c5ba335afed40) refactor: move machine status labels into spec +* [`f990aea`](https://github.com/siderolabs/omni/commit/f990aea20db95502aa0013889168897d34161a98) feat: do not allow setting config patch fields which are owned by Omni +* [`7d9258f`](https://github.com/siderolabs/omni/commit/7d9258ff3b48582111487e114b7fffe098d38464) fix: fix incorrect yaml multiline string decoding in ClusterMachineSpec +* [`0b5b095`](https://github.com/siderolabs/omni/commit/0b5b0959c80beccc5eb5d062cf5158f8577edc0d) fix: prevent etcd audit from removing valid members +* [`82fe21b`](https://github.com/siderolabs/omni/commit/82fe21be7169a29f70b8c3425716082696dc770e) fix: label generated patches with `system-patch` label +* [`4c2ce26`](https://github.com/siderolabs/omni/commit/4c2ce26a28b57911b0489de6d7ba99ab8ebdbb77) fix: enhance watch to accept a single `Ref` value +* [`ef78843`](https://github.com/siderolabs/omni/commit/ef788432b6a3f3c2a40875fef65650e177a1adcd) feat: implement `Machine` level config patch editor +* [`8144d44`](https://github.com/siderolabs/omni/commit/8144d44f9f0974a94cdab257c5803367581d4db3) fix: encode image download URL when signing & slugify file names +* [`75ea9e6`](https://github.com/siderolabs/omni/commit/75ea9e6b60134981f3776f3b250678113f19dc63) refactor: rewrite generic ClusterMachineStatusController +* [`5dba725`](https://github.com/siderolabs/omni/commit/5dba725ed040cb0cde35ec9295c6e99db4cb9d6a) feat: add ability to download admin talosconfig in debug mode +* [`5baa939`](https://github.com/siderolabs/omni/commit/5baa939b8db3d3069960ff896ac77349ba63f172) refactor: `kubernetes.Runtime` to cache clients and configs +</p> +</details> + +### Changes from siderolabs/crypto +<details><summary>28 commits</summary> +<p> + +* [`c03ff58`](https://github.com/siderolabs/crypto/commit/c03ff58af5051acb9b56e08377200324a3ea1d5e) feat: add a way to represent redacted x509 private keys +* [`c3225ee`](https://github.com/siderolabs/crypto/commit/c3225eee603a8d1218c67e1bfe33ddde7953ed74) feat: allow CSR template subject field to be overridden +* [`8570669`](https://github.com/siderolabs/crypto/commit/85706698dac8cddd0e9f41006bed059347d2ea26) chore: rename to siderolabs/crypto +* [`e9df1b8`](https://github.com/siderolabs/crypto/commit/e9df1b8ca74c6efdc7f72191e5d2613830162fd5) feat: add support for generating keys from RSA-SHA256 CAs +* [`510b0d2`](https://github.com/siderolabs/crypto/commit/510b0d2753a89170d0c0f60e052a66484997a5b2) chore: add json tags +* [`6fa2d93`](https://github.com/siderolabs/crypto/commit/6fa2d93d0382299d5471e0de8e831c923398aaa8) fix: deepcopy nil fields as `nil` +* [`9a63cba`](https://github.com/siderolabs/crypto/commit/9a63cba8dabd278f3080fa8c160613efc48c43f8) fix: add back support for generating ECDSA keys with P-256 and SHA512 +* [`893bc66`](https://github.com/siderolabs/crypto/commit/893bc66e4716a4cb7d1d5e66b5660ffc01f22823) fix: use SHA256 for ECDSA-P256 +* [`deec8d4`](https://github.com/siderolabs/crypto/commit/deec8d47700e10e3ea813bdce01377bd93c83367) chore: implement DeepCopy methods for PEMEncoded* types +* [`d3cb772`](https://github.com/siderolabs/crypto/commit/d3cb77220384b3a3119a6f3ddb1340bbc811f1d1) feat: make possible to change KeyUsage +* [`6bc5bb5`](https://github.com/siderolabs/crypto/commit/6bc5bb50c52767296a1b1cab6580e3fcf1358f34) chore: remove unused argument +* [`cd18ef6`](https://github.com/siderolabs/crypto/commit/cd18ef62eb9f65d8b6730a2eb73e47e629949e1b) feat: add support for several organizations +* [`97c888b`](https://github.com/siderolabs/crypto/commit/97c888b3924dd5ac70b8d30dd66b4370b5ab1edc) chore: add options to CSR +* [`7776057`](https://github.com/siderolabs/crypto/commit/7776057f5086157873f62f6a21ec23fa9fd86e05) chore: fix typos +* [`80df078`](https://github.com/siderolabs/crypto/commit/80df078327030af7e822668405bb4853c512bd7c) chore: remove named result parameters +* [`15bdd28`](https://github.com/siderolabs/crypto/commit/15bdd282b74ac406ab243853c1b50338a1bc29d0) chore: minor updates +* [`4f80b97`](https://github.com/siderolabs/crypto/commit/4f80b976b640d773fb025d981bf85bcc8190815b) fix: verify CSR signature before issuing a certificate +* [`39584f1`](https://github.com/siderolabs/crypto/commit/39584f1b6e54e9966db1f16369092b2215707134) feat: support for key/certificate types RSA, Ed25519, ECDSA +* [`cf75519`](https://github.com/siderolabs/crypto/commit/cf75519cab82bd1b128ae9b45107c6bb422bd96a) fix: function NewKeyPair should create certificate with proper subject +* [`751c95a`](https://github.com/siderolabs/crypto/commit/751c95aa9434832a74deb6884cff7c5fd785db0b) feat: add 'PEMEncodedKey' which allows to transport keys in YAML +* [`562c3b6`](https://github.com/siderolabs/crypto/commit/562c3b66f89866746c0ba47927c55f41afed0f7f) feat: add support for public RSA key in RSAKey +* [`bda0e9c`](https://github.com/siderolabs/crypto/commit/bda0e9c24e80c658333822e2002e0bc671ac53a3) feat: enable more conversions between encoded and raw versions +* [`e0dd56a`](https://github.com/siderolabs/crypto/commit/e0dd56ac47456f85c0b247999afa93fb87ebc78b) feat: add NotBefore option for x509 cert creation +* [`12a4897`](https://github.com/siderolabs/crypto/commit/12a489768a6bb2c13e16e54617139c980f99a658) feat: add support for SPKI fingerprint generation and matching +* [`d0c3eef`](https://github.com/siderolabs/crypto/commit/d0c3eef149ec9b713e7eca8c35a6214bd0a64bc4) fix: implement NewKeyPair +* [`196679e`](https://github.com/siderolabs/crypto/commit/196679e9ec77cb709db54879ddeddd4eaafaea01) feat: move `pkg/grpc/tls` from `github.com/talos-systems/talos` as `./tls` +* [`1ff6242`](https://github.com/siderolabs/crypto/commit/1ff6242c91bb298ceeb4acd65685cba952fe4178) chore: initial version as imported from talos-systems/talos +* [`835063e`](https://github.com/siderolabs/crypto/commit/835063e055b28a525038b826a6d80cbe76402414) chore: initial commit +</p> +</details> + +### Changes from siderolabs/gen +<details><summary>1 commit</summary> +<p> + +* [`8e89b1e`](https://github.com/siderolabs/gen/commit/8e89b1ede9f35ff4c18a41ee44a69259181c892b) feat: add GetOrCreate and GetOrCall methods +</p> +</details> + +### Dependency Changes + +* **github.com/cosi-project/runtime** v0.2.0 -> v0.3.0-alpha.1 +* **github.com/grpc-ecosystem/grpc-gateway/v2** v2.13.0 -> v2.14.0 +* **github.com/siderolabs/crypto** c03ff58af505 **_new_** +* **github.com/siderolabs/gen** v0.4.1 -> v0.4.2 +* **github.com/siderolabs/talos/pkg/machinery** v1.3.0-beta.0 -> 873bd3807c0f +* **go.uber.org/zap** v1.23.0 -> v1.24.0 +* **golang.org/x/net** v0.2.0 -> v0.4.0 +* **golang.org/x/text** v0.4.0 -> v0.5.0 + +Previous release can be found at [v0.1.0-beta.0](https://github.com/siderolabs/omni/releases/tag/v0.1.0-beta.0) + +## [Omni 0.1.0-beta.0](https://github.com/siderolabs/omni/releases/tag/v0.1.0-beta.0) (2022-12-02) + +Welcome to the v0.1.0-beta.0 release of Omni! +*This is a pre-release of Omni* + + + +Please try out the release binaries and report any issues at +https://github.com/siderolabs/omni/issues. + +### Contributors + +* Artem Chernyshev +* Andrey Smirnov +* Artem Chernyshev +* Dmitriy Matrenichev +* Utku Ozdemir +* Philipp Sauter +* evgeniybryzh +* Noel Georgi +* Andrew Rynhard +* Tim Jones +* Andrew Rynhard +* Gerard de Leeuw +* Steve Francis +* Volodymyr Mazurets + +### Changes +<details><summary>405 commits</summary> +<p> + +* [`e096c88`](https://github.com/siderolabs/omni/commit/e096c887604399028a559e33da13653c1f54965d) chore: add resource operation metrics +* [`741e820`](https://github.com/siderolabs/omni/commit/741e8202c5aecfe171082c38e2c55e0184e9c80c) feat: implement config patch creation UI +* [`5def267`](https://github.com/siderolabs/omni/commit/5def26706fa21df7748801cbdab5c6e81543174f) fix: attempt to clean up docker container better +* [`876ff5e`](https://github.com/siderolabs/omni/commit/876ff5ee44d4193c52e4daeec776ad50b69664f9) feat: update COSI and state-etcd to 0.2.0 +* [`3df410d`](https://github.com/siderolabs/omni/commit/3df410d964fc66b2d4ad8c7db0459108d16adde0) test: refactor and update config patch integration tests +* [`5eea9e5`](https://github.com/siderolabs/omni/commit/5eea9e50b47a6df324f2fd5564aa9010b56e16e0) feat: add TLS support to siderolink API +* [`36394ea`](https://github.com/siderolabs/omni/commit/36394ea242f9af4d9c17f90ec143b0356fa9e671) refactor: simplify the resource leak fix +* [`e5b962b`](https://github.com/siderolabs/omni/commit/e5b962b66f158fd31b74dc6b97f524c168b4fad1) chore: update dev environment +* [`39bf206`](https://github.com/siderolabs/omni/commit/39bf206eec29262b1c15ed557f7f24e029c61206) fix: save user picture and fullname in the local storage +* [`f1611c1`](https://github.com/siderolabs/omni/commit/f1611c10d26b937b5bae69a1b9eda67d2bc5e137) feat: add machine level config patch support +* [`f2e6cf5`](https://github.com/siderolabs/omni/commit/f2e6cf5cddb47aaa290e7db1a037f2155fcd60d2) fix: remove several resource/goroutine leaks +* [`fc37af3`](https://github.com/siderolabs/omni/commit/fc37af36d87e01c3e9f349f206711f154740e0b4) feat: allow destroying config patches in the UI +* [`3154d59`](https://github.com/siderolabs/omni/commit/3154d591e7c65713c6940d953df45d8242ae9359) fix: respect SIDEROLINK_DEV_JOIN_TOKEN only in debug mode +* [`38f5380`](https://github.com/siderolabs/omni/commit/38f53802ab3dda70fedc0a81de9d6dd43e6204f1) feat: avoid deleting all resources on omnictl delete +* [`28666bc`](https://github.com/siderolabs/omni/commit/28666bcb4acaf6e4f053e99d8d45d5dae320c89c) chore: add support for local development using compose +* [`cad73ce`](https://github.com/siderolabs/omni/commit/cad73cefc6b187a26e3833089e89ca1cb6fbf843) chore: increase TestEtcdAudit timeout and fix incorrect `Assert()` calls. +* [`7199b75`](https://github.com/siderolabs/omni/commit/7199b75c2108568d8bee82c42fcc00edb4a22e1c) chore: during `config merge` create config if there was none +* [`dab54d1`](https://github.com/siderolabs/omni/commit/dab54d14fcd8c0fadc6bb2a49d79e90379234403) chore: increase `TestTalosBackendRoles` reliability +* [`997cd78`](https://github.com/siderolabs/omni/commit/997cd7823bd126302ed4772658c0791768d67638) feat: add reconfiguring phase to machinesetstatus +* [`81fb2b9`](https://github.com/siderolabs/omni/commit/81fb2b94e61f7e7aaf41075fe17a2bbfea005d9f) fix: fix button order and vue config +* [`252fb29`](https://github.com/siderolabs/omni/commit/252fb29d64dac660da08459d9c5acc44e457b034) refactor: simplify backend.Server.Run method +* [`f335c2f`](https://github.com/siderolabs/omni/commit/f335c2f5311a81ca23699c473b68bf6918430aab) refactor: split watch to `Watch` and `WatchFunc`, add unit tests +* [`35a7919`](https://github.com/siderolabs/omni/commit/35a79193b965d42fba0a649bef0efe82abbd2fd5) feat: track machine config apply status +* [`1c54710`](https://github.com/siderolabs/omni/commit/1c54710c6f5ebe2740af27cebfb9c5532b22cc26) fix: use rolling update strategy on control planes +* [`17ccdc2`](https://github.com/siderolabs/omni/commit/17ccdc2f78693b5d1276b843c027e8057faa2ff7) refactor: various logging fixes +* [`3c9ca9c`](https://github.com/siderolabs/omni/commit/3c9ca9cd83298c5281c7ced50720b341c10a02f0) fix: update node overview Kubernetes node watch to make it compatible +* [`e8c2063`](https://github.com/siderolabs/omni/commit/e8c20631501308952bbc596e994a71b7677034b3) fix: enable edit config patches button on the cluster overview page +* [`6e80521`](https://github.com/siderolabs/omni/commit/6e8052169dd672e6fce5668982b704331eac4645) fix: reset the item list after the watch gets reconnected +* [`620d197`](https://github.com/siderolabs/omni/commit/620d1977a70bbc2cca8b331db825fc7bdb8fcda3) chore: remove AddContext method from runtime.Runtime interface +* [`8972ade`](https://github.com/siderolabs/omni/commit/8972ade40dea2bf3bf41bcb865a817d90b37657d) chore: update default version of Talos to v1.2.7 +* [`6a2dde8`](https://github.com/siderolabs/omni/commit/6a2dde863d306986027904167f262d4307a7420d) fix: update the config patch rollout strategy +* [`fb3f6a3`](https://github.com/siderolabs/omni/commit/fb3f6a340c37d1958e36400edf7ca53e2cde48a7) fix: skip updating config status if applying config caused a reboot +* [`8776146`](https://github.com/siderolabs/omni/commit/877614606d0c7d0259c4e65e4911f331550dd7d7) fix: apply finalizer to the `Machine` only when CMS is created +* [`134bb20`](https://github.com/siderolabs/omni/commit/134bb2053ce6250b9b4c647f3b2dbb8255cea2ce) test: fix config patch test with reboot +* [`d3b6b5a`](https://github.com/siderolabs/omni/commit/d3b6b5a75f9ea5304595851d6160e98ec4c9b8aa) feat: implement config patch viewer and editor +* [`149efe1`](https://github.com/siderolabs/omni/commit/149efe189a24c07e648289ee81d0b95ed1c972b7) chore: bump runtime and state-etcd modules +* [`c345b83`](https://github.com/siderolabs/omni/commit/c345b8348412aef59cbd43c35bf06ce3eac5ad3f) chore: output omnictl auth log to stderr +* [`39b2ba2`](https://github.com/siderolabs/omni/commit/39b2ba2a86972324161c6cff056abf10eb2fce5c) refactor: introduce ClusterEndpoint resource +* [`6998ff0`](https://github.com/siderolabs/omni/commit/6998ff0803063b22e113da0c72356ee254f13143) fix: treat created and updated events same +* [`289fe88`](https://github.com/siderolabs/omni/commit/289fe88aba94d6cfe4d7be7472b609232e45cbf6) feat: add omnictl apply +* [`2f1be3b`](https://github.com/siderolabs/omni/commit/2f1be3b4643e2a66a62da6a7f8f1f1da39ed6e17) chore: fix `TestGenerateJoinToken` test +* [`3829176`](https://github.com/siderolabs/omni/commit/382917630030415b1a218f14f2a1d6d3595834a0) fix: don't close config patch editor window if config validation fails +* [`c96f504`](https://github.com/siderolabs/omni/commit/c96f5041be7befb517998fc7bbccd135cb76908d) feat: add suspended mode +* [`b967bcf`](https://github.com/siderolabs/omni/commit/b967bcfd26b2fccfa6bbb08b8a15eb3796e2e872) feat: add last config apply error to clustermachineconfigstatus +* [`0395d9d`](https://github.com/siderolabs/omni/commit/0395d9dd7b985802be8f4cd2b8005b409faca3de) test: increase key generation timeout on storage signing test +* [`577eba4`](https://github.com/siderolabs/omni/commit/577eba4231142fe983f9a0f9b5a81280c377686e) fix: set SideroLink MTU to 1280 +* [`0f32172`](https://github.com/siderolabs/omni/commit/0f32172922ed2f7b8b4b7433fb1f9ce104f3c5a8) fix: minor things in frontend +* [`9abcc7b`](https://github.com/siderolabs/omni/commit/9abcc7b444c49f6223e0ae4948bff13eedbb05b5) test: add config patching integration tests +* [`99531fb`](https://github.com/siderolabs/omni/commit/99531fbeee982e2ab87d9f0162a0080308b852ab) refactor: drop unneeded controller inputs +* [`5172354`](https://github.com/siderolabs/omni/commit/51723541621d91964e88e8a5add834159214dc5b) chore: add omnictl to the generated image +* [`738cf64`](https://github.com/siderolabs/omni/commit/738cf649f53ec29e88112a027ec72f3d6f0cfff8) fix: set cluster machine version in machine config status correctly +* [`1d0d220`](https://github.com/siderolabs/omni/commit/1d0d220f47f1cc9ca8b20bfef47004a875b7573c) fix: lower ttl of the issued keys on the FE side by 10 minutes +* [`2889524`](https://github.com/siderolabs/omni/commit/2889524f222e42d49061867b2b2f5b59a16af4ba) feat: dynamic title +* [`3d17bd7`](https://github.com/siderolabs/omni/commit/3d17bd7cfd4775292090ccb3fd3c2b575b26d449) chore: fix release CI run +* [`f2c752f`](https://github.com/siderolabs/omni/commit/f2c752fed627006912018ae3e5f2ff0f2bed60b8) fix: properly proxy watch requests through dev-server +* [`9a74897`](https://github.com/siderolabs/omni/commit/9a74897d0ce60a51086f5af98c4c4eb71f2b0009) release(v0.1.0-alpha.1): prepare release +* [`8b284f3`](https://github.com/siderolabs/omni/commit/8b284f3aa26cf8a34452f33807dcc04045e7a098) feat: implement Kubernetes API OIDC proxy and OIDC server +* [`adad8d0`](https://github.com/siderolabs/omni/commit/adad8d0fe2f3356e97de613104196233a3b98ff5) refactor: rework LoadBalancerConfig/LoadBalancerStatus resources +* [`08e2cb4`](https://github.com/siderolabs/omni/commit/08e2cb4fd40ec918bf458edd6a5d8e6c86fe5c97) feat: support editing config patches on cluster and machine set levels +* [`e2197c8`](https://github.com/siderolabs/omni/commit/e2197c83e994afb435671f5af5cdefa843bbddb5) test: e2e testing improvements +* [`ec9051f`](https://github.com/siderolabs/omni/commit/ec9051f6dfdf1f5acaf3fa6766dc1195b6f6dcdd) fix: config patching +* [`e2a1d6c`](https://github.com/siderolabs/omni/commit/e2a1d6c78809eaa4168ca5ede433824797a6aa4e) fix: send logs in JSON format by default +* [`954dd70`](https://github.com/siderolabs/omni/commit/954dd70b935b7c373ba5830fd7ad6e965f6b0da8) chore: replace talos-systems depedencies with siderolabs +* [`acf94db`](https://github.com/siderolabs/omni/commit/acf94db8ac80fb6f15cc87ff276b7edca0cb8661) chore: add payload logger +* [`838c716`](https://github.com/siderolabs/omni/commit/838c7168c64f2296a9e01d3ef6ab4feb9f16aeb9) fix: allow time skew on validating the public keys +* [`dd481d6`](https://github.com/siderolabs/omni/commit/dd481d6cb3620790f6e7a9c8e305defb507cbe5f) fix: refactor runGRPCProxy in router tests to catch listener errors +* [`e68d010`](https://github.com/siderolabs/omni/commit/e68d010685d4f0a5d25fee671744119cecf6c27b) chore: small fixes +* [`ad86875`](https://github.com/siderolabs/omni/commit/ad86875ec146e05d7d7f461bf7c8094a8c143df5) feat: minor adjustments on the cluster create page +* [`e61f194`](https://github.com/siderolabs/omni/commit/e61f1943e965287c79fbaef05760bb0b0deee988) chore: implement debug handlers with controller dependency graphs +* [`cbbf901`](https://github.com/siderolabs/omni/commit/cbbf901e601d31c777ad2ada0f0036c57020ba96) refactor: use generic TransformController more +* [`33f9f2c`](https://github.com/siderolabs/omni/commit/33f9f2ce3ec0999198f311ae4bae9b58e57153c9) chore: remove reflect from runtime package +* [`6586963`](https://github.com/siderolabs/omni/commit/65869636aa33013b5feafb06e727b9d2a4cf1c19) feat: add scopes to users, rework authz & add integration tests +* [`bb355f5`](https://github.com/siderolabs/omni/commit/bb355f5c659d8c66b825de409d9446767005a2bb) fix: reload the page to init the UI Authenticator on signature fails +* [`c90cd48`](https://github.com/siderolabs/omni/commit/c90cd48eefa7f29328a456aa5ca474eece17c6fe) chore: log auth context +* [`d278780`](https://github.com/siderolabs/omni/commit/d2787801a4904fe895996e5319f301a1d7ca76df) fix: update Clusters page UI +* [`5e77607`](https://github.com/siderolabs/omni/commit/5e776072285e535e93c0458774dcad810b9b857a) tests: abort on first failure +* [`4c55980`](https://github.com/siderolabs/omni/commit/4c5598083ff6d8763c8763d8e46a3d7b659784ff) chore: get full method name from the service +* [`2194f43`](https://github.com/siderolabs/omni/commit/2194f4391607e6e73bce1917d2744e78fdd2cebc) feat: redesign cluster list view +* [`40b3f23`](https://github.com/siderolabs/omni/commit/40b3f23071096987e8a7c6f30a2622c317c190cb) chore: enable gRPC request duration histogram +* [`0235bb9`](https://github.com/siderolabs/omni/commit/0235bb91a71510cf4d349eedd3625b119c7e4e11) refactor: make sure Talos/Kubernetes versions are defined once +* [`dd6154a`](https://github.com/siderolabs/omni/commit/dd6154a45d5dcd14870e0aa3f97aa1d4e53bdcfb) chore: add public key pruning +* [`68908ba`](https://github.com/siderolabs/omni/commit/68908ba330ecd1e285681e24db4b9037eb2e8202) fix: bring back UpgradeInfo API +* [`f1bc692`](https://github.com/siderolabs/omni/commit/f1bc692c9125f7683fe5f234b03eb3521ba7e773) refactor: drop dependency on Talos Go module +* [`0e3ef43`](https://github.com/siderolabs/omni/commit/0e3ef43cfed68e53879e6c22b46e7d0568ddc05f) feat: implement talosctl access via Omni +* [`2b0014f`](https://github.com/siderolabs/omni/commit/2b0014fea15da359217f89ef723965dcc9faa739) fix: provide a way to switch the user on the authenticate page +* [`e295d7e`](https://github.com/siderolabs/omni/commit/e295d7e2854ac0226e7efda32864f6a687a88470) chore: refactor all controller tests to use assertResource function +* [`8251dfb`](https://github.com/siderolabs/omni/commit/8251dfb9e44341e9df9471f387cc76c91359cf84) refactor: extract PGP client key handling +* [`02da9ee`](https://github.com/siderolabs/omni/commit/02da9ee66f15462e6f4d7da18515651a5fde11aa) refactor: use extracted go-api-signature library +* [`4bc3db4`](https://github.com/siderolabs/omni/commit/4bc3db4dcbc14e0e51c7a3b5257686b671cc2823) fix: drop not working upgrade k8s functional +* [`17ca75e`](https://github.com/siderolabs/omni/commit/17ca75ef864b7a59f9c6f829de19cc9630a670c0) feat: add 404 page +* [`8dcde2a`](https://github.com/siderolabs/omni/commit/8dcde2af3ca49d9be16cc705c0b403826f2eee5d) feat: implement logout flow in the frontend +* [`ba766b9`](https://github.com/siderolabs/omni/commit/ba766b9922302b9d1f279b74caf94e6ca727f86f) fix: make `omnictl` correctly re-auth on invalid key +* [`fd16f87`](https://github.com/siderolabs/omni/commit/fd16f8743d3843e8ec6735a7c2e96532694b876e) fix: don't set timeout on watch gRPC requests +* [`8dc3cc6`](https://github.com/siderolabs/omni/commit/8dc3cc682e5419c3824c6e740a32085c386b8817) fix: don't use `omni` in external names +* [`2513661`](https://github.com/siderolabs/omni/commit/2513661578574255ca3f736d3dfa1f307f5d43b6) fix: reset `Error` field of the `MachineSetStatus` +* [`b611e99`](https://github.com/siderolabs/omni/commit/b611e99e14a7e2ebc64c55ed5c95a47e17d6ac32) fix: properly handle `Forbidden` errors on the authentication page +* [`8525502`](https://github.com/siderolabs/omni/commit/8525502265b10dc3cc056d301785f6f60e4f7e22) fix: stop runners properly and clean up StatusMachineSnapshot +* [`ab0190d`](https://github.com/siderolabs/omni/commit/ab0190d9a41b830daf60173b998acdbcbbdd3754) feat: implement scopes and enforce authorization +* [`9198d96`](https://github.com/siderolabs/omni/commit/9198d96ea9d57bb5949c59350aec42b2ce13ebac) feat: sign gRPC requests on the frontend to enable Authentication flow +* [`bdd8f21`](https://github.com/siderolabs/omni/commit/bdd8f216a9eca7ec657fa0dc554e663743f058d1) chore: remove reset button and fix padding +* [`362db57`](https://github.com/siderolabs/omni/commit/362db570349b4a2659f746ce18a436d684481ecb) fix: gRPC verifier should verify against original JSON payload +* [`30186b8`](https://github.com/siderolabs/omni/commit/30186b8cfe2eea6eaade8bacf31114886d3da3ea) fix: omnictl ignoring omniconfig argument +* [`e8ab0ba`](https://github.com/siderolabs/omni/commit/e8ab0ba45648b8f521500b46fe032797da6a111f) fix: do not attempt to execute failed integration test again +* [`9fda25e`](https://github.com/siderolabs/omni/commit/9fda25ef45f0060cc6c3ec812f5fa1c7b1015801) chore: add more info on errors to different controllers +* [`ccda526`](https://github.com/siderolabs/omni/commit/ccda5260c4645b5929724574a9f856eeaa4c232f) chore: bump grpc version +* [`b1ac125`](https://github.com/siderolabs/omni/commit/b1ac1255da5ca4b5d9c409e27c51e4298275e73c) chore: emit log when we got machine status event. +* [`005d257`](https://github.com/siderolabs/omni/commit/005d257c25c745b61e5a25c39167d511710562c7) chore: set admin role specifically for Reboot request. +* [`27f0e30`](https://github.com/siderolabs/omni/commit/27f0e309cec76a454e5bb24c2df1e62d9e4718e0) chore: update deps +* [`77f0219`](https://github.com/siderolabs/omni/commit/77f02198c1e7fb215548f3a0e2be30a0e19aaf6d) test: more unit-tests for auth components +* [`0bf6ddf`](https://github.com/siderolabs/omni/commit/0bf6ddfa46e0ea6ad255ede00a600c390344e221) fix: pass through HTTP request if auth is disabled +* [`4f3a67b`](https://github.com/siderolabs/omni/commit/4f3a67b08e03a1bad65c2acb8d65f0281fdd2f9e) fix: unit-tests for auth package and fixes +* [`e3390cb`](https://github.com/siderolabs/omni/commit/e3390cbbac1d0e78b72512c6ebb64a8f53dcde17) chore: rename arges-theila to omni +* [`14d2614`](https://github.com/siderolabs/omni/commit/14d2614538ec696d468a0850bd4ee7bc6884c3b1) chore: allow slashes in secretPath +* [`e423edc`](https://github.com/siderolabs/omni/commit/e423edc072714e7f693249b60079f5f700cc0a65) fix: add unit-tests for auth message and fix issues +* [`b5cfa1a`](https://github.com/siderolabs/omni/commit/b5cfa1a84e93b6bbf5533c599917f293fc5cdf66) feat: add vault client +* [`b47791c`](https://github.com/siderolabs/omni/commit/b47791ce303cbb9a8aab279685d17f92a480c7f4) feat: sign grpc requests on cli with pgp key & verify it on server +* [`d6ef4d9`](https://github.com/siderolabs/omni/commit/d6ef4d9c36758cb0091e2c528b848952f312941a) feat: split account ID and name +* [`e412e1a`](https://github.com/siderolabs/omni/commit/e412e1a69edad0d19d7e46fa3aa076dcb8e6d4b6) chore: workaround the bind problem +* [`e23cc59`](https://github.com/siderolabs/omni/commit/e23cc59bb8cb8f9df81738d4c58aed08d80fa9c4) chore: bump minimum Talos version to v1.2.4 +* [`0638a29`](https://github.com/siderolabs/omni/commit/0638a29d78c092641573aa2b8d2e594a7ff6aab4) feat: stop using websockets +* [`8f3c19d`](https://github.com/siderolabs/omni/commit/8f3c19d0f0ecfbe5beabc7dc508dcafa720e83e2) feat: update install media to be identifiable +* [`70d1e35`](https://github.com/siderolabs/omni/commit/70d1e354466618bb07c13445a16ca639be12009e) feat: implement resource encryption +* [`7653638`](https://github.com/siderolabs/omni/commit/76536386499889994b65f66a8a40f18b5535c5ba) fix: fix NPE in integration tests +* [`e39849f`](https://github.com/siderolabs/omni/commit/e39849f4047f028251123781bd8be350ebbfd65d) chore: update Makefile and Dockerfile with kres +* [`4709473`](https://github.com/siderolabs/omni/commit/4709473ec20fbf92a3240fb3376a322f1321103a) fix: return an error if external etcd client fails to be built +* [`5366661`](https://github.com/siderolabs/omni/commit/536666140556ba9b997a2b5d4441ea4b5f42d1c5) refactor: use generic transform controller +* [`a2a5f16`](https://github.com/siderolabs/omni/commit/a2a5f167f21df6375767d018981651d60bb2f768) feat: limit access to Talos API via Omni to `os:reader` +* [`e254201`](https://github.com/siderolabs/omni/commit/e2542013938991faa8f1c521fc524b8fcf31ea34) feat: merge internal/external states into one +* [`3258ca4`](https://github.com/siderolabs/omni/commit/3258ca487c818a34924f138640f44a2e51d307fb) feat: add `ControlPlaneStatus` controller +* [`1c0f286`](https://github.com/siderolabs/omni/commit/1c0f286a28f5134333130708d031dbfa11051a42) refactor: use `MachineStatus` Talos resource +* [`0a6b19f`](https://github.com/siderolabs/omni/commit/0a6b19fb916ea301a8f5f6ccd9bbdaa7cb4c39e0) chore: drop support for Talos resource API +* [`ee5f6d5`](https://github.com/siderolabs/omni/commit/ee5f6d58a2b22a87930d3c8bb9963f71c92f3908) feat: add auth resource types & implement CLI auth +* [`36736e1`](https://github.com/siderolabs/omni/commit/36736e14e5c837d38568a473834d14073b88a153) fix: use correct protobuf URL for cosi resource spec +* [`b98c56d`](https://github.com/siderolabs/omni/commit/b98c56dafe33beef7792bd861ac4e637fe13c494) feat: bump minimum version for Talos to v1.2.3 +* [`b93bc9c`](https://github.com/siderolabs/omni/commit/b93bc9cd913b017c66502d96d99c52e4d971e231) chore: move containers and optional package to the separate module +* [`e1af4d8`](https://github.com/siderolabs/omni/commit/e1af4d8a0bee31721d8946ef452afe04da6b494d) chore: update COSI to v0.2.0-alpha.1 +* [`788dd37`](https://github.com/siderolabs/omni/commit/788dd37c0be32745547ee8268aa0f004041dc96f) feat: implement and enable by default etcd backend +* [`1b83038`](https://github.com/siderolabs/omni/commit/1b83038b77cab87ffc2d4d73a91582785ed446ef) release(v0.1.0-alpha.0): prepare release +* [`8a9c4f1`](https://github.com/siderolabs/omni/commit/8a9c4f17ed6ee0d8e4a51b466d60a8278cd50f9c) feat: implement CLI configuration file (omniconfig) +* [`b0c92d5`](https://github.com/siderolabs/omni/commit/b0c92d56da00529c106f042399c1163375046785) feat: implement etcd audit controller +* [`0e993a0`](https://github.com/siderolabs/omni/commit/0e993a0977c711fb8767e3de2ad828fd5b9e688f) feat: properly support scaling down the cluster +* [`264cdc9`](https://github.com/siderolabs/omni/commit/264cdc9e015fd87724c7a07128d1136153732540) refactor: prepare for etcd backend integration +* [`b519d17`](https://github.com/siderolabs/omni/commit/b519d17971bb1c919286813b4c2465c2f5803a03) feat: show version in the UI +* [`a2fb539`](https://github.com/siderolabs/omni/commit/a2fb5397f9efb22a1354c5675180ca49537bee55) feat: keep track of loadbalancer health in the controller +* [`4789c62`](https://github.com/siderolabs/omni/commit/4789c62af0d1694d8d0a492cd6fb7d436e213fe5) feat: implement a new controller that can gather cluster machine data +* [`bd3712e`](https://github.com/siderolabs/omni/commit/bd3712e13491ede4610ab1452ae85bde6d92b2db) fix: populate machine label field in the patches created by the UI +* [`ba70b4a`](https://github.com/siderolabs/omni/commit/ba70b4a48623939d31775935bd0338c0d60ab65b) fix: rename to Omni, fix workers scale up, hide join token +* [`47b45c1`](https://github.com/siderolabs/omni/commit/47b45c129160821576d808d9a46a9ec5d14c6469) fix: correct filenames for Digital Ocean images +* [`9d217cf`](https://github.com/siderolabs/omni/commit/9d217cf16d432c5194110ae16a566b44b02a567e) feat: introduce new resources, deprecate `ClusterMachineTemplate` +* [`aee153b`](https://github.com/siderolabs/omni/commit/aee153bedb2f7856913a54b282603b07bf20059b) fix: address style issue in the Pods paginator +* [`752dd44`](https://github.com/siderolabs/omni/commit/752dd44ac42c95c644cad5640f6b2c5536a29676) chore: update Talos machinery to 1.2.0 and use client config struct +* [`88d7079`](https://github.com/siderolabs/omni/commit/88d7079a6656605a1a8dfed56d392414583a283e) fix: regenerate sources from proto files that were rolled back. +* [`84062c5`](https://github.com/siderolabs/omni/commit/84062c53417197417ff636a667289342089f390c) chore: update Talos to the latest master +* [`5a139e4`](https://github.com/siderolabs/omni/commit/5a139e473abcdf7fd25ad7c61dad8cbdc964a453) fix: properly route theila internal requests in the gRPC proxy +* [`4be4fb6`](https://github.com/siderolabs/omni/commit/4be4fb6a4e0bca29b32e1b732c227c9e7a0b1f43) feat: add support for 'talosconfig' generation +* [`9235b8b`](https://github.com/siderolabs/omni/commit/9235b8b522d4bc0712012425b68ff89e455886b9) fix: properly layer gRPC proxies +* [`9a516cc`](https://github.com/siderolabs/omni/commit/9a516ccb5c892ed8fe41f7cf69aaa5bb1d3fa471) fix: wait for selector of 'View All' to render in e2e tests. +* [`3cf3aa7`](https://github.com/siderolabs/omni/commit/3cf3aa730e7833c0c1abe42a6afb87a85f14b58c) fix: some unhandled errors in the e2e tests. +* [`c32c7d5`](https://github.com/siderolabs/omni/commit/c32c7d55c92007aa1aa10feab3c7a7de2b2afc42) fix: ignore updating cluster machines statuses without machine statuses +* [`4cfa307`](https://github.com/siderolabs/omni/commit/4cfa307b85b410b44e482b259d14670b55e4a237) chore: run rekres, fix lint errors and bump Go to 1.19 +* [`eb2d449`](https://github.com/siderolabs/omni/commit/eb2d4499f1a3da7bc1552a6b099c28bed6fd0e4d) fix: skip the machines in `tearingDown` phase in the controller +* [`9ebc769`](https://github.com/siderolabs/omni/commit/9ebc769b89a2bab37fd081e555f84e3e4c99187e) fix: allow all services to be proxied by gRPC router +* [`ea2b01d`](https://github.com/siderolabs/omni/commit/ea2b01d0a0e054b259d710317fe368882534cf4c) fix: properly handle non empty resource id in the K8s resource watch +* [`3bb7da3`](https://github.com/siderolabs/omni/commit/3bb7da3a0fa6b746f6a7b9aa668e055bdf825e6a) feat: show a Cluster column in the Machine section +* [`8beb70b`](https://github.com/siderolabs/omni/commit/8beb70b7f045a218f9cb753e1402a07542b0bf1c) fix: ignore tearing down clusters in the `Cluster` migrations +* [`319d4e7`](https://github.com/siderolabs/omni/commit/319d4e7947cb78135f5a14c02afe5814c56a312c) fix: properly handle `null` memory modules list +* [`6c2120b`](https://github.com/siderolabs/omni/commit/6c2120b5ae2bd947f473d002dfe165646032e811) chore: introduce migrations manager for COSI DB state +* [`ec52139`](https://github.com/siderolabs/omni/commit/ec521397946cc15929472feb7c45435fb48df848) fix: filter out invalid memory modules info coming from Talos nodes +* [`8e87031`](https://github.com/siderolabs/omni/commit/8e870313a3a31d052eecf81acb522433ff98ae79) fix: bump loadbalancer timeout settings +* [`bc0ed26`](https://github.com/siderolabs/omni/commit/bc0ed2672064a6bf148cd9799b35a2790f5aa7f6) feat: introduce websocket, HTTP requests monitoring +* [`857401f`](https://github.com/siderolabs/omni/commit/857401f54e3922a9ab85d7dc703a5afb70c6ee45) feat: add HTTP logging (static, gateway), and websocket logging +* [`eb612a3`](https://github.com/siderolabs/omni/commit/eb612a38e9c71913ebecc9f345e17844d60800b8) fix: do hard stop of events sink gRPC server after 5 seconds +* [`3162513`](https://github.com/siderolabs/omni/commit/31625135e2b971d6b9f92eb4096c010113030a80) fix: populate nodes filter dropdown properly and rewrite filter function +* [`5713a51`](https://github.com/siderolabs/omni/commit/5713a516391a5190fac9b7044a9f71952ce15479) fix: make `TSelectList` search filter the items in the dropdown +* [`f2519ff`](https://github.com/siderolabs/omni/commit/f2519ff51b88766a907f1d7717ef74031157fd56) feat: don't allow using nodes with not enough mem for the cluster +* [`9e474d6`](https://github.com/siderolabs/omni/commit/9e474d69c76a898fc5b6fcd9fdc8e87f25b7dc53) feat: show disconnected warning in the machines list +* [`fa52b48`](https://github.com/siderolabs/omni/commit/fa52b48f54362c7305681ca79a7d98237531f2b4) feat: redesign Installation Media selection menu +* [`01e301a`](https://github.com/siderolabs/omni/commit/01e301a875699cf6fcc887cb31cd7939338f58e9) fix: query node list using `talosctl get members` instead of K8s nodes +* [`e694df5`](https://github.com/siderolabs/omni/commit/e694df59c50fbee356a48c94ade95e924ea46bb2) fix: display all available Talos versions on cluster create page +* [`7a87525`](https://github.com/siderolabs/omni/commit/7a87525ed1b928a8f8e3e6a39feb4c19009ec264) fix: use `v-model` instead of callbacks in the inputs +* [`d681f5f`](https://github.com/siderolabs/omni/commit/d681f5f58788612f144fa1f8d90ec6c996badb0e) feat: support scaling up the clusters +* [`e992b95`](https://github.com/siderolabs/omni/commit/e992b9574d7b8f76497f46e25764618ec274af1a) feat: show notification on image download progress +* [`8ea6d9f`](https://github.com/siderolabs/omni/commit/8ea6d9f1724b271919e538ed55ff6582858470f9) fix: probably fix 'context canceled' on image download +* [`692612b`](https://github.com/siderolabs/omni/commit/692612b7e628588fa7608cff683c5af406f24ca7) fix: improve the Talos image generation process +* [`a69c140`](https://github.com/siderolabs/omni/commit/a69c140e26f4298fcaafb1f96c389269992fc069) feat: introduce Prometheus metrics +* [`e90ca78`](https://github.com/siderolabs/omni/commit/e90ca7875c501391f860f5df9f2a4e4f8e2f2d7a) fix: make grpc api listen only on siderolink interface +* [`99fc28c`](https://github.com/siderolabs/omni/commit/99fc28c36c62a8d8c654c05f9b9c64ff37cedba8) fix: display correct cluster/machine status on ui +* [`eaf7655`](https://github.com/siderolabs/omni/commit/eaf7655395401cd88e6bd47f4f8aa958abee30f1) fix: add a pause before integration tests +* [`19ff1c9`](https://github.com/siderolabs/omni/commit/19ff1c909bedf63fe6cf2f5cc0e44f34046ca568) chore: rename download button +* [`e1c4e1b`](https://github.com/siderolabs/omni/commit/e1c4e1b171eab08585a3315ca5838c88a4d2eb24) feat: add download options for all talos images +* [`24e7863`](https://github.com/siderolabs/omni/commit/24e786369bfc0bb4966712296395db91751e657b) fix: delete cached clients from gRPC proxy when the cluster is destroyed +* [`58c89ef`](https://github.com/siderolabs/omni/commit/58c89ef3fe621ef6909c5d38a0d47cc861667f45) feat: implement `argesctl delete` command +* [`3c99b49`](https://github.com/siderolabs/omni/commit/3c99b49a9b680b091d92455a0d3bc325f8f68ca6) test: add a test which removes allocated machine +* [`75dd28f`](https://github.com/siderolabs/omni/commit/75dd28f56d7ce9a92b96822a867fbfe2655cd0fa) chore: fill in resource definitions for table headers +* [`028f168`](https://github.com/siderolabs/omni/commit/028f16886c41b7aa7eafb65308cc4adf4d624037) feat: End-to-end tests with playwright +* [`6be6b36`](https://github.com/siderolabs/omni/commit/6be6b3605583ce8e8068746624ca86ed6adc37af) chore: bump goimports from 0.1.10 to 0.1.11 and node from 18.5.0 to 18.6.0 +* [`af4da08`](https://github.com/siderolabs/omni/commit/af4da086d4b709f504eda7909a36a8f0cf84e480) test: implement kernel log streaming test +* [`1eacfee`](https://github.com/siderolabs/omni/commit/1eacfee2c1084040ae2201eba957409218a92c66) feat: implement argesctl machine-logs output in 'zap-like' and 'dmesg' form. +* [`96ab7ab`](https://github.com/siderolabs/omni/commit/96ab7ab8317898dd45d129d5cecd2aaf1d379fba) chore: ignore memory modules with zero size +* [`fd0575f`](https://github.com/siderolabs/omni/commit/fd0575ff4050702c9d07e34c7d9d5596b4ad7311) chore: retrieve k8s versions from github registry +* [`8651527`](https://github.com/siderolabs/omni/commit/86515275a77741bacc790d2006f3671a5cfb27c6) feat: redo errgroup to return error on first nil error +* [`944222d`](https://github.com/siderolabs/omni/commit/944222d06607079b5d982afe4b19fc1dda7f1ec2) fix: show ClusterMachineStatus.Stage in 'Clusters' view +* [`f3f6b6e`](https://github.com/siderolabs/omni/commit/f3f6b6eecd3ffc13b69845dff50d2e8ab31bc0d2) chore: refactor run method and no longer ignore log receiver listener errors +* [`b316377`](https://github.com/siderolabs/omni/commit/b316377b277f87a184b969b3bbf20ebe6047a0a8) chore: rename 'Dmesg' to 'Console' +* [`19ee857`](https://github.com/siderolabs/omni/commit/19ee8578a6f1c1bf742699d1b5720dc4c2674c82) test: add a way to recover deleted machines +* [`e5b5bdc`](https://github.com/siderolabs/omni/commit/e5b5bdc39fa6f3812b15771366f942ddcbe7f328) fix: update SideroLink library for EEXIST fixes +* [`363de69`](https://github.com/siderolabs/omni/commit/363de69a50b5c1e9d07fa42152cca935844d118b) fix: spec collector equality +* [`841f3b2`](https://github.com/siderolabs/omni/commit/841f3b22aacc6d2875062ef324d900c5f2091f9d) feat: add ability to supply machine config patches on the machines +* [`907ca93`](https://github.com/siderolabs/omni/commit/907ca93247267d80125866c2b60225ceca3ada27) test: fix link destroy test +* [`4c9f99d`](https://github.com/siderolabs/omni/commit/4c9f99d32874cdaff1eb651bf6d74ef39167c273) fix: remove machine status if the machine is in tearing down phase +* [`d9747e5`](https://github.com/siderolabs/omni/commit/d9747e552e52156a9baeae962a9478231e26c566) fix: make cluster machine status test more reliable +* [`3bfff3b`](https://github.com/siderolabs/omni/commit/3bfff3bb0eea9d18956dee21aff7f3de900c6b82) fix: do not set up full theila runtime during clients tests +* [`4bf33bc`](https://github.com/siderolabs/omni/commit/4bf33bc9d37404a733c5039784c80e92800fb3dc) fix: immediately fail the request if the cluster is down +* [`124a5c2`](https://github.com/siderolabs/omni/commit/124a5c2947978e6bc86d1b19c9eacbcf7f870b53) fix: ensure the created date on resources is set +* [`14161bf`](https://github.com/siderolabs/omni/commit/14161bf3dad4484868359d186d99d9198b6eed95) feat: add scale up integration test and minor log fixes +* [`7af06fd`](https://github.com/siderolabs/omni/commit/7af06fd75959eb9e807680ac8a6ba4f0a7f59255) feat: make integration tests a subtests of one global test +* [`f7c1464`](https://github.com/siderolabs/omni/commit/f7c1464a1002f63daab29b36d19ea16de0cd5794) feat: implement log receiver for logs from Talos +* [`5b800ea`](https://github.com/siderolabs/omni/commit/5b800ea970215fb4e100ed7b3b73d7e218fd6d86) fix: accumulate bytes received/send in the link resource +* [`b3b1e9b`](https://github.com/siderolabs/omni/commit/b3b1e9bbfbf62632dc0d8c2239a72793883101ce) feat: machine removal +* [`fb01bc4`](https://github.com/siderolabs/omni/commit/fb01bc4b26c5b37f15bac923450e1f58fb7a3d89) fix: use Talos 1.2.0 +* [`3a50efe`](https://github.com/siderolabs/omni/commit/3a50efe363c4724f369a02f672848ad7c284847c) feat: filter machines that can be added to cluster +* [`ba62db5`](https://github.com/siderolabs/omni/commit/ba62db521b47049e92557bf8cfc5f737e496bf57) fix: properly parse `siderolink-api-advertised-url` if there's no port +* [`96f835a`](https://github.com/siderolabs/omni/commit/96f835a91136f62d9dbdf5c1d1c46c729d57e51e) fix: properly display node selectors in FireFox +* [`12c20a4`](https://github.com/siderolabs/omni/commit/12c20a42c9dfdea5f88e0e7942fbdb42ea543b95) fix: populate disks when machines are connected during cluster create +* [`0dc97f8`](https://github.com/siderolabs/omni/commit/0dc97f8696a7c571d5318daf794700342e06f639) fix: adjust overview page to look closer to the mockups +* [`2b77af8`](https://github.com/siderolabs/omni/commit/2b77af8d39e555970487c3265dfbd63412e90d2f) feat: add the chart showing the count of clusters +* [`a1dff65`](https://github.com/siderolabs/omni/commit/a1dff6589d64207e6e7331d0407e7857f9c4079d) feat: implement ISO download with embedded kernel args +* [`37c03d8`](https://github.com/siderolabs/omni/commit/37c03d8cb04b02e79f42e70eeea1e4368445604d) test: pull kubeconfig and interact with Kubernetes API +* [`75bfb08`](https://github.com/siderolabs/omni/commit/75bfb08f0738fc9f67259caf12902db67860370f) fix: ignore the error on splitting host/port +* [`3be5a32`](https://github.com/siderolabs/omni/commit/3be5a3254168cddec8f1629789c2ae50d9eaa08e) feat: make the whole cluster list item clickable, add dropdown menu item +* [`2c9dc99`](https://github.com/siderolabs/omni/commit/2c9dc99000266b3d4c139f27dea4f6283709251e) fix: adjust the look of the Overview page a bit +* [`aa4a926`](https://github.com/siderolabs/omni/commit/aa4a926cbb85bf63312493b937440a174aed5070) feat: add the button for downloading cluster Kubeconfig on overview page +* [`4532de6`](https://github.com/siderolabs/omni/commit/4532de6f3d514a534c38a63731c43075698f5c01) feat: support basic auth in `argesctl` command +* [`b66bb3c`](https://github.com/siderolabs/omni/commit/b66bb3cbcc85d7be4348ecd9a6d5d62f72a90e11) feat: add summary information Overview page +* [`3bdbce4`](https://github.com/siderolabs/omni/commit/3bdbce41a3ed89a42556d837bc0c5cfe417e22e6) test: more cluster creation tests, two clusters, cleanup +* [`3b00bd5`](https://github.com/siderolabs/omni/commit/3b00bd5bf417c5c9cb42471d27811c1849a40c78) fix: improve cluster deletion and node reset flow +* [`2d83d16`](https://github.com/siderolabs/omni/commit/2d83d1694ec73da818004f91ede76a0bca30fe79) test: create a cluster and verify cluster machine statuses +* [`f471cfd`](https://github.com/siderolabs/omni/commit/f471cfdcf7c9e70f37436e173c3a58c1965e8bb2) fix: copy all labels from the `ClusterMachine` to `ClusterMachineStatus` +* [`ec32f86`](https://github.com/siderolabs/omni/commit/ec32f8632db104efd6fedc5421179175274d6339) test: add integration tests up to the cluster creation +* [`a8d3ee5`](https://github.com/siderolabs/omni/commit/a8d3ee5b14a57ad1d9d88512a95032bbda61e734) feat: add kubeconfig command to argesctl and fix kubeconfig +* [`10b9a3b`](https://github.com/siderolabs/omni/commit/10b9a3ba676a636e488805ed04a0c908c3d2cf53) test: implement API integration test +* [`3e6b891`](https://github.com/siderolabs/omni/commit/3e6b8913f916dc5e8ac3ef49e14648defa6e1bf6) feat: aggregate cluster machine statuses in cluster status controller +* [`f6cbc58`](https://github.com/siderolabs/omni/commit/f6cbc58a91124833f0cbae4ecd0c0416acbe8bfa) chore: ignore empty processor info +* [`c5fc71b`](https://github.com/siderolabs/omni/commit/c5fc71b86a5492d548ae9098c5c74de240ebd800) fix: clean up Kubernetes client and configs when a cluster is destroyed +* [`e8478fe`](https://github.com/siderolabs/omni/commit/e8478fe5280d5e8a32bb423ec96edacadabc7e43) fix: properly use tracker to cleanup `ClusterMachineConfig` resources +* [`044fcad`](https://github.com/siderolabs/omni/commit/044fcadb66de61742ab871d10f3fcf0f453f6e27) fix: make `MachineStatusController` connect to configured nodes +* [`2867099`](https://github.com/siderolabs/omni/commit/2867099a52d651c3b0f9d3abbae266f2792cafe7) feat: add api endpoint to fetch kubeconfig +* [`5f32667`](https://github.com/siderolabs/omni/commit/5f3266747012b590dd7a7d0ebc23ee0e80abb2ab) test: support registry mirrors for development purposes +* [`5114695`](https://github.com/siderolabs/omni/commit/5114695cfeb0b6c792002ff5f0f31c1944c269ab) refactor: consistent flag naming +* [`9ffb19e`](https://github.com/siderolabs/omni/commit/9ffb19e77968c6e411903a2c59fd9a18063b46d4) chore: use latest node +* [`5512321`](https://github.com/siderolabs/omni/commit/5512321f05b6b657a28abc25470664f6eb6e3d0a) refactor: set better defaults for cli args +* [`ff88242`](https://github.com/siderolabs/omni/commit/ff882427f56e42039b79900380b61b86d3290269) chore: mark 'siderolink-wireguard-endpoint' flags as required +* [`4a9d9ad`](https://github.com/siderolabs/omni/commit/4a9d9adef1e521d3c0293b6dc414f572bd8a93d4) feat: add the ClusterMachineStatus resource +* [`e4e8b62`](https://github.com/siderolabs/omni/commit/e4e8b6264cb48edd014f97129f52aefaa129fd63) refactor: unify all Arges API under a single HTTP server +* [`5af9049`](https://github.com/siderolabs/omni/commit/5af9049bdc2e09bf410e1b0646e4e08a4366f33b) chore: rename sidebar item +* [`a4fc47f`](https://github.com/siderolabs/omni/commit/a4fc47f97d79259532b91a8d391e84b59554ed8e) chore: fix build warning +* [`547b83c`](https://github.com/siderolabs/omni/commit/547b83c4a2a543d5b6ce4dca6cf6f5de87c33dcb) chore: bump siderolink version +* [`11c31f3`](https://github.com/siderolabs/omni/commit/11c31f39d834e3352b086c1aec665065fd74e944) refactor: drop one of the layered gRPC servers +* [`0adbbb7`](https://github.com/siderolabs/omni/commit/0adbbb7edfeacedd98a7e84c2f45ac458750a281) feat: introduce a way to copy kernel arguments from the UI +* [`ce5422a`](https://github.com/siderolabs/omni/commit/ce5422a27771a94cc25be70ec756711d140b2758) fix: import new COSI library to fix YAML marshaling +* [`d6cec09`](https://github.com/siderolabs/omni/commit/d6cec099cb6f4c3118e4263b9517176858bb9cfb) feat: implement Arges API client, and minimal `argesctl` +* [`65c8d68`](https://github.com/siderolabs/omni/commit/65c8d683187d82dc730752294c1bc03657f5df78) feat: implement cluster creation view +* [`8365b00`](https://github.com/siderolabs/omni/commit/8365b00df90ac55f99e0f82e1fa6d4367ebd6a3f) feat: re-enable old Theila UI +* [`63e703c`](https://github.com/siderolabs/omni/commit/63e703c4e1dfb4bf645fbc9cd28ba2a722e04dc2) fix: update Talos to the latest master +* [`d33e27b`](https://github.com/siderolabs/omni/commit/d33e27b49113729c5538fce688832152ff96a7ea) feat: implement clusters list view +* [`cb9e23c`](https://github.com/siderolabs/omni/commit/cb9e23ca6f420ac7b71acf6b19e9012265f3c69b) feat: protect Theila state from external API access +* [`952c235`](https://github.com/siderolabs/omni/commit/952c2359b32fdd077d85e312707f8b9c9e01ea0c) fix: properly allocated ports in the loadbalancer +* [`a58c479`](https://github.com/siderolabs/omni/commit/a58c479e9e31f70e806a1f3482b9b984c5c0ca68) chore: report siderolink events kernel arg +* [`8a56fe3`](https://github.com/siderolabs/omni/commit/8a56fe34ce1966fe28f9e432c696fdd779dfb638) refactor: move Theila resources to public `pkg/` +* [`1251699`](https://github.com/siderolabs/omni/commit/12516996eda859db6677403ad1f72a3994ea180b) fix: reset the `MachineEventsSnapshot` after the node is reset +* [`9a2e6af`](https://github.com/siderolabs/omni/commit/9a2e6af3113b795f57c4e3a86c1348b120fa3bbd) feat: implement bootstrap controller +* [`7107e27`](https://github.com/siderolabs/omni/commit/7107e27ee6b9ba644fc803e4463cbfcf26cf97de) feat: implement apply and reset config controller +* [`1579eb0`](https://github.com/siderolabs/omni/commit/1579eb09eb58f2cb679205e9e204369f3a362e07) feat: implement machine events handler and `ClusterStatus` +* [`7214f4a`](https://github.com/siderolabs/omni/commit/7214f4a514a921d6b9df7515116613996416f383) feat: implement cluster load balancer controller +* [`9c4fafa`](https://github.com/siderolabs/omni/commit/9c4fafaf6b8dc9b7ff08fe28704ca6a2e7efc097) feat: add a controller that manages load balancers for talos clusters +* [`7e3d80c`](https://github.com/siderolabs/omni/commit/7e3d80ce956d621ed79e4db094808831e18db85b) feat: add a resources that specify configurations for load balancers +* [`dc0d356`](https://github.com/siderolabs/omni/commit/dc0d356a181b4c37670d2ed4e8d7af370dccef60) feat: support Theila runtime watch with label selectors +* [`6a568a7`](https://github.com/siderolabs/omni/commit/6a568a72922e34e91f5448d3c1caa2f0b3a02e96) feat: implement `ClusterMachineConfig` resource and it's controller +* [`3db0f1c`](https://github.com/siderolabs/omni/commit/3db0f1c9d4e2d6f962b6f3216a4f9c7e2575dd21) feat: implement `TalosConfig` controller +* [`b7ae8e1`](https://github.com/siderolabs/omni/commit/b7ae8e113dc68acd87c4cfe5e3c8349d32bc392d) feat: introduce `Cluster` controller that adds finalizers on Clusters +* [`8d7ea02`](https://github.com/siderolabs/omni/commit/8d7ea0293e8f57388fd483dc82e79e6b4c76a53f) chore: use label selectors in `TalosConfig`, set labels on the resources +* [`cff9cb1`](https://github.com/siderolabs/omni/commit/cff9cb19ba8718fdad509b5e91cb8221c6c1ff00) fix: separate advertised endpoint from the actual wireguard endpoint +* [`5be6cc3`](https://github.com/siderolabs/omni/commit/5be6cc391adf8bcb58b8d47f09dad5aa75d1ad98) feat: implement cluster creation UI +* [`a1633eb`](https://github.com/siderolabs/omni/commit/a1633eb18772b9e99d687dfddd12fc09fd1ea5c4) chore: add typed wrappers around State, Reader and Writer +* [`5515f3d`](https://github.com/siderolabs/omni/commit/5515f3d004f54455a1eb1f4977bbb9d663fd1bca) feat: add `ClusterSecrets` resource and controller and tests +* [`7226f6c`](https://github.com/siderolabs/omni/commit/7226f6cdc60eeb4d6040d1aa0711fed378c50b33) feat: add `Cluster`, `ClusterMachine` and `TalosConfig` resources +* [`ec44930`](https://github.com/siderolabs/omni/commit/ec44930672ca8954c6ba68975c1799a087ec0c43) feat: enable vtprotobuf optimized marshaling +* [`15be219`](https://github.com/siderolabs/omni/commit/15be2198872fb637f7ba2e1ff550e4466179f2b1) feat: generate TS constants from go `//tsgen:` comments +* [`caa4c4d`](https://github.com/siderolabs/omni/commit/caa4c4d285dcd1176a70d87f28ee303cd0483ca8) fix: resource equality for proto specs +* [`beeca88`](https://github.com/siderolabs/omni/commit/beeca886213332f313f7f3a477d7e7c508e6d058) refactor: clarify code that creates or gets links for nodes +* [`340c63a`](https://github.com/siderolabs/omni/commit/340c63ad4ba918d4b11ab1f57fdbd3b5e5d8b3dc) feat: implement `Machines` page +* [`f7bc0c6`](https://github.com/siderolabs/omni/commit/f7bc0c69c69fe515cfa729bc062c730756a53019) feat: accept nodes if they provide the correct join token +* [`bdf789a`](https://github.com/siderolabs/omni/commit/bdf789a35da5491a4fcbd2af35a1c6efd22ab1fc) feat: immediately reconnect SideroLink peers after Arges restart +* [`6b74fa8`](https://github.com/siderolabs/omni/commit/6b74fa82ca5757d6f3809853c1ac3e7754efb06d) feat: implement MachineStatusController +* [`f5db0e0`](https://github.com/siderolabs/omni/commit/f5db0e05a87d5c11b4a1029b14020b19ca67035d) feat: add more info to the siderolink connection spec +* [`d3e4a71`](https://github.com/siderolabs/omni/commit/d3e4a71af8fd79328e4edda6d9642b83902b2003) refactor: simplify the usage of gRPC resource CRUD API +* [`2430115`](https://github.com/siderolabs/omni/commit/2430115af1aaac4226b7d5821e1fe706a1088501) feat: implement MachineController and small fixes +* [`e31d22d`](https://github.com/siderolabs/omni/commit/e31d22d7639753df53c130461ae1f96b9126f3a5) feat: support running Theila without contexts +* [`a6b3646`](https://github.com/siderolabs/omni/commit/a6b364626bd808687d5ad95307766344b16dd042) refactor: small fixes +* [`33d2b59`](https://github.com/siderolabs/omni/commit/33d2b59c202f03785580209c885aa297c023fa60) refactor: clean up a bit SideroLink code, fix shutdown +* [`98ec883`](https://github.com/siderolabs/omni/commit/98ec8830308755c7073a5d4510483e97d8e1d02d) chore: rename main executable to avoid clashing with Theila project +* [`828721d`](https://github.com/siderolabs/omni/commit/828721d9aa5d912cce628256f75579309d1ad67d) feat: enable COSI persistence for resources +* [`f1f7883`](https://github.com/siderolabs/omni/commit/f1f788344254e18bcab00a25b56a86289bfb1638) feat: set up siderolink endpoints in Theila +* [`6439335`](https://github.com/siderolabs/omni/commit/64393353ca7cf430f82bfe73a004da319da28261) refactor: migrate to `typed.Resource` in Theila internal state +* [`6195274`](https://github.com/siderolabs/omni/commit/61952742a47ea89e89228f057d0d3de351766150) refactor: restructure folders in the project +* [`1abf72b`](https://github.com/siderolabs/omni/commit/1abf72b4b2e382fe0cf9302b42242152c255a3ee) chore: update Talos libs to the latest version +* [`16dffd9`](https://github.com/siderolabs/omni/commit/16dffd9058570477b3a648896a89e6445e5b0162) fix: display delta time for pod's age +* [`8b80726`](https://github.com/siderolabs/omni/commit/8b807262b23cfa830f3ff444d49f11b3a1654703) feat: update favicon to sidero logo +* [`2da7378`](https://github.com/siderolabs/omni/commit/2da737841c2ae0bf1f1f916dc6f45b1e3996d6e4) feat: show the extended hardware info +* [`d3c6004`](https://github.com/siderolabs/omni/commit/d3c6004f9767bf0cff9191dc130308c848ede077) chore: allow getting resources without version and group +* [`eb19087`](https://github.com/siderolabs/omni/commit/eb190875b30275195e52f1a95ed0bb3aae08424f) fix: remove t-header error notification +* [`5a28202`](https://github.com/siderolabs/omni/commit/5a28202c939ef9683d14fb3d873e0bacb35577db) feat: restyle t-alert component +* [`9f2b482`](https://github.com/siderolabs/omni/commit/9f2b48228bbfa39d33b07ae43e9fdb34192c3eed) fix: get rid of racy code in the kubeconfig request code +* [`c40824e`](https://github.com/siderolabs/omni/commit/c40824ecc5d10cb5289e133b8b1f51213aa12f7f) feat: add text Highlight feature +* [`9018c81`](https://github.com/siderolabs/omni/commit/9018c81bd0d7c58bb5c632c06f3c3904f6674e03) feat: use `~/.talos/config` as a primary source for clusters +* [`e10547b`](https://github.com/siderolabs/omni/commit/e10547b5761ad96ab8b5766fe5c3f06fcdf86477) refactor: remove old components and not used code parts +* [`f704684`](https://github.com/siderolabs/omni/commit/f7046846ea8e83a0e39647c4fcc49addf4c56061) fix: properly calculate servers capacity +* [`755a077`](https://github.com/siderolabs/omni/commit/755a0779014b0a4177e0fc5180db20720be5a814) fix: use proper units for memory and CPU charts on the node monitor page +* [`d0a083d`](https://github.com/siderolabs/omni/commit/d0a083d1c15c319e236dd258fabcc9a231f797a1) release(v0.2.0-alpha.0): prepare release +* [`53878ee`](https://github.com/siderolabs/omni/commit/53878eea09c18f2bc0dd55ca11a6743587748319) fix: properly update servers menu item when the context is changed +* [`b4cb9c7`](https://github.com/siderolabs/omni/commit/b4cb9c7989ec5299785b86acb3fa0ee648efd259) feat: restyle TMonitor page +* [`f0377e2`](https://github.com/siderolabs/omni/commit/f0377e2ad5da702af71f2706141f4d7c638c7a15) fix: invert chart value for cpu, storage and memory on the overview page +* [`6ea6ecf`](https://github.com/siderolabs/omni/commit/6ea6ecf12c4d8b5253b4dfc2e64f5b5d787d022a) fix: update capi-utils to fix talosconfig requests for CAPI clusters +* [`e3796d3`](https://github.com/siderolabs/omni/commit/e3796d3876d33248fd0998901273a14d29a487a3) chore: update capi-utils +* [`39186eb`](https://github.com/siderolabs/omni/commit/39186ebe50da531f35d21ac2488f8a58c1ef8e78) feat: implement overview page, cluster dropdown, ongoing tasks +* [`59f2b27`](https://github.com/siderolabs/omni/commit/59f2b27be4d7f5a591fdeae533d649494356250d) docs: update README.md +* [`2b7831f`](https://github.com/siderolabs/omni/commit/2b7831f2d22106ac8a82f890d73c2705841b0739) feat: add Kubernetes and Servers pages +* [`4451a5b`](https://github.com/siderolabs/omni/commit/4451a5bc9f5c6b058c6bcf1252b7c83a001cafbe) fix: properly set TaskStatus namespace in the initial call +* [`4545464`](https://github.com/siderolabs/omni/commit/454546425f2fd7e4418aa8a03465f3a062de804e) fix: add new fields to the TaskStatus spec, update Talos +* [`891cf3b`](https://github.com/siderolabs/omni/commit/891cf3b79c8430deeed8a168955afd6e97083baa) docs: describe client context types, usage +* [`309b515`](https://github.com/siderolabs/omni/commit/309b51545ead2ee144244591df2e5ead2849fb11) feat: update k8s upgrades tasks structure for the new UI representation +* [`5aa8ca2`](https://github.com/siderolabs/omni/commit/5aa8ca24bd3159879c46c8e8a134702b174e3362) feat: add NodesPage +* [`db434e0`](https://github.com/siderolabs/omni/commit/db434e07b9f23562bd746a0f78e3868b079006e2) feat: add TPagination component +* [`0b51727`](https://github.com/siderolabs/omni/commit/0b51727efed31f13f52fa20b360071e7e2a6d9eb) feat: add Pods, Dashboard, Upgrade views, etc +* [`c549b8b`](https://github.com/siderolabs/omni/commit/c549b8b9ee8a563f14b2e791f91a7b3cb0430aa7) feat: add Overview and Upgrade Kubernetes pages +* [`cec2e85`](https://github.com/siderolabs/omni/commit/cec2e854f4f3999109220902bccaee6c25d1f502) chore: define constants for all used resource types +* [`962bdaf`](https://github.com/siderolabs/omni/commit/962bdaf6406ab8e5febea0ad8d32da9c86fa39e7) feat: add TSideBar +* [`fa28ccb`](https://github.com/siderolabs/omni/commit/fa28ccb67f52c1dd9096b23388427d78be526275) feat: add TheHeader component +* [`f3418a5`](https://github.com/siderolabs/omni/commit/f3418a59e38e551bd0be7cc7ae66ef4645719aa7) feat: button;icons;config +* [`db30f50`](https://github.com/siderolabs/omni/commit/db30f503730bdbd8ed359d4070dea0214df67fcd) fix: add `frontend/node_modules` to gitignore +* [`a675b86`](https://github.com/siderolabs/omni/commit/a675b86f7d55cecd4ae1277cbf057a6bc264940c) fix: properly pass label selector to the metadata in ClusterListItem +* [`7911d6a`](https://github.com/siderolabs/omni/commit/7911d6a31abdb51e86586a025b705ddfeb1dd19e) chore: add ability to start local development server for the frontend +* [`076fee1`](https://github.com/siderolabs/omni/commit/076fee10c6583dc49e6530b02cab1f757da0e853) feat: use CAPI utils for CAPI requests +* [`5ed5ba2`](https://github.com/siderolabs/omni/commit/5ed5ba2a122585a97cf65c3ff081126752cd26fa) fix: more websocket client bugfixes +* [`6fe22ad`](https://github.com/siderolabs/omni/commit/6fe22ad370026380ba75b38e261870addc341e6f) fix: reset reconnect timeouts after the client is reconnected +* [`c4b144a`](https://github.com/siderolabs/omni/commit/c4b144af272a46dbdc8d1bb35784e09ba1b79987) fix: talosconfig/kubeconfig when using the default context +* [`b439a37`](https://github.com/siderolabs/omni/commit/b439a371c13a8d46d986a1dae3d6f4b7cba4a298) fix: properly handle Same-Origin header in websockets +* [`ffffed1`](https://github.com/siderolabs/omni/commit/ffffed100cec18209bae723b9919eb8613950649) fix: read node name from nodename resource instead of hostname +* [`2d6f984`](https://github.com/siderolabs/omni/commit/2d6f9844440a6d18b3093dea6228ac6a237dc86b) fix: use secure websockets if the page itself is using https +* [`799f2d2`](https://github.com/siderolabs/omni/commit/799f2d2d00762d5270dd4a3f4b4b312b32dbb7dd) feat: rework the node overview page +* [`0d0eaf4`](https://github.com/siderolabs/omni/commit/0d0eaf4b2721dfa1b04bce24e4a1e476579e3a74) fix: make charts height resize depending on the screen height +* [`7de0101`](https://github.com/siderolabs/omni/commit/7de0101bf0e613653caadd5733db0e29a6bb5bfb) fix: use polyfill to fix streaming APIs on Firefox +* [`0cff2b0`](https://github.com/siderolabs/omni/commit/0cff2b02b5d8b2c2c644067cf6bd3ed573cb784d) feat: small UI adjustments +* [`d70bd41`](https://github.com/siderolabs/omni/commit/d70bd41992e13fb3dacc1740532083a8f6ce9afa) feat: implement accept Sidero server functional +* [`f3a6e16`](https://github.com/siderolabs/omni/commit/f3a6e16a79e1bca9ea6c87eb0d3e0f2a6c65ff2e) feat: add top processes list to the Overview page +* [`3cf97e4`](https://github.com/siderolabs/omni/commit/3cf97e4b9e07f8383da8a6fb7a993b70c8f82503) refactor: use the same object for gRPC metadata context and messages +* [`243206f`](https://github.com/siderolabs/omni/commit/243206f95aa6ba944bd4361db6274e7072bae1fc) release(v0.1.0-alpha.2): prepare release +* [`e5b6f29`](https://github.com/siderolabs/omni/commit/e5b6f29fd298904e06284a67681cc0ce5135145f) feat: implement node Reset +* [`bcb7d23`](https://github.com/siderolabs/omni/commit/bcb7d237c31f42a35f5c3b53e7615ddae1ce0a8b) fix: node IP not being truncated +* [`e576d33`](https://github.com/siderolabs/omni/commit/e576d33ba40f629eed14668f2d9bf77d7fef62c2) feat: add upgrade UI for CAPI clusters +* [`10cdce7`](https://github.com/siderolabs/omni/commit/10cdce7fcc219af969a85a41d18fb904936faa0a) fix: server labels key/value order and chevron orientation +* [`4007177`](https://github.com/siderolabs/omni/commit/40071775d6de1eea697f67e55441c384c86e75d9) feat: implement Kubernetes upgrade UI components +* [`f4917ee`](https://github.com/siderolabs/omni/commit/f4917eecfb3173acf7518883c738118c8537d657) fix: accumulate chart updates into a single update +* [`414d76c`](https://github.com/siderolabs/omni/commit/414d76c1c926695e5d66787b34decae92e151b45) feat: implement upgrade controller +* [`36742ea`](https://github.com/siderolabs/omni/commit/36742ea5ab1e8a983b73f73443c1cf122a90d054) feat: introduce create, delete and update gRPC APIs +* [`2b3d314`](https://github.com/siderolabs/omni/commit/2b3d314a460b385d8c13bdd025fadb37b5508bdc) feat: install internal COSI runtime alongside with K8s and Talos +* [`ae7f784`](https://github.com/siderolabs/omni/commit/ae7f784d08621d18075b1763f026a7513d9d9dcb) refactor: move all generated TypeScript files under `frontend/src/api` +* [`61bad64`](https://github.com/siderolabs/omni/commit/61bad64540c28fb0520a39a6c64d64c3e9353361) release(v0.1.0-alpha.1): prepare release +* [`8e5e722`](https://github.com/siderolabs/omni/commit/8e5e7229470713d2fbd5ad0df027bd825f5481e3) feat: implement node reboot controls +* [`9765a88`](https://github.com/siderolabs/omni/commit/9765a88069f05c49f5a7d854675ee37e1c7a8273) feat: dmesg logs page +* [`ecbbd67`](https://github.com/siderolabs/omni/commit/ecbbd67936b1fb570d706fe3b93b81f6089b5124) feat: use updated timestamp to display event time on the graph +* [`7c56773`](https://github.com/siderolabs/omni/commit/7c56773448a496fe1ceeec3c47978975ce336b3a) refactor: use Metadata to pass context in all gRPC calls +* [`abb4733`](https://github.com/siderolabs/omni/commit/abb47330222217d7d8b5c36ff28902415bc755d8) feat: implement service logs viewer +* [`8e8e032`](https://github.com/siderolabs/omni/commit/8e8e032b20d082bfd71a26c2af2bbc821d9c2a7b) feat: add ability to pick sort order on the servers page +* [`1a1c728`](https://github.com/siderolabs/omni/commit/1a1c728ac929bb02db7f1bd0b991a747e63fe81a) fix: resolve the issue with idFn value generating undefined ids +* [`2e83fe2`](https://github.com/siderolabs/omni/commit/2e83fe23a7feb51b73bc7b53997636b641ae42b9) feat: allow filtering servers by picking from predefined categories +* [`48f776e`](https://github.com/siderolabs/omni/commit/48f776e10f6c79772481393d7397557419520046) fix: navigate home when changing the context +* [`a1ce0ca`](https://github.com/siderolabs/omni/commit/a1ce0ca8c8fabb2267c3dc6f6b1509f131e18ba8) fix: resolve services search issues +* [`5b768f8`](https://github.com/siderolabs/omni/commit/5b768f85277ee31131994ae0b253700a5d26978d) feat: make stacked lists searchable +* [`ec1bc5b`](https://github.com/siderolabs/omni/commit/ec1bc5b48943e473c756ebc7a8c943a34cdeaeac) feat: implement stats component and add stats to the servers page +* [`1a85999`](https://github.com/siderolabs/omni/commit/1a8599981f93fc5ce68e23b1b4cd7aabbb43c90c) feat: align Sidero servers list outlook with the wireframes +* [`524264c`](https://github.com/siderolabs/omni/commit/524264c515a9efdce9f06a3c2ebd59c2979f9b2a) fix: display error message and use proper layout for the spinner +* [`5263d16`](https://github.com/siderolabs/omni/commit/5263d16cfb936aad9ba461e0cc7b150ff9b806d5) feat: introduce node stats page +* [`8feb35e`](https://github.com/siderolabs/omni/commit/8feb35e95a6d588e1d9c605231308976be452a2e) feat: make root sidebar sections collapsible +* [`36ad656`](https://github.com/siderolabs/omni/commit/36ad656a3bbdc1e2915a87c0d09c31738ae3f3c4) feat: detect cluster capabilities +* [`a25d90d`](https://github.com/siderolabs/omni/commit/a25d90d58a85b3b73432858f134fa09cd1338d5c) feat: support switching context in the UI +* [`67903e2`](https://github.com/siderolabs/omni/commit/67903e23f49623ae9a9a6b297282c62aa8579aa8) refactor: separate Watch from StackedList +* [`76b9e1d`](https://github.com/siderolabs/omni/commit/76b9e1dc88cccf74cebb28470eae5e9249809d40) release(v0.1.0-alpha.0): prepare release +* [`7bde4c8`](https://github.com/siderolabs/omni/commit/7bde4c8c6e16c197578cbb4e037a05d50194958f) fix: cobra command was initialized but not actually used +* [`04624c9`](https://github.com/siderolabs/omni/commit/04624c95cec587ae0b0d8888d95d484ef8d98cfa) feat: support getting Talos and Kubernetes client configs for a cluster +* [`219b9c8`](https://github.com/siderolabs/omni/commit/219b9c8663fe03af65796b0b6299cff5e66b3efc) feat: implement notifications component +* [`f8b19a0`](https://github.com/siderolabs/omni/commit/f8b19a0585e6e19c0e7da4e4afad5bbd264e0029) feat: decouple watch list from the view +* [`2f8c96e`](https://github.com/siderolabs/omni/commit/2f8c96e44012e7bd0db9869eeb90ab48ff41e162) feat: implement appearance settings modal window +* [`de745d6`](https://github.com/siderolabs/omni/commit/de745d6b7170a9c509cc835a8b675a1c788e80f4) feat: implement Talos runtime backend +* [`af69a0d`](https://github.com/siderolabs/omni/commit/af69a0d58906a86974bc7dbec2c09ca9f78b152f) feat: support getting Kubernetes resource through gRPC gateway +* [`2c50010`](https://github.com/siderolabs/omni/commit/2c50010b0d9f7b168354fedd698600d94123c354) feat: implement breadcrumbs component, add support for table header +* [`3fc1e80`](https://github.com/siderolabs/omni/commit/3fc1e808875f6f502cd2657c4548dd886fbf465d) feat: implement nodes view +* [`961e93a`](https://github.com/siderolabs/omni/commit/961e93a4af430eaa9efcd1e2922af8072fe4cf85) feat: implement clusters view +* [`e8248ff`](https://github.com/siderolabs/omni/commit/e8248ffab89633cae8834631e39cf4dce5e4147a) feat: use plain zap instead of SugaredLogger everywhere +* [`81ba93d`](https://github.com/siderolabs/omni/commit/81ba93dffdc37efdde06557a1c63511a7d61b2f2) chore: generate websocket protocol messages using protobuf +* [`37a878d`](https://github.com/siderolabs/omni/commit/37a878dd396b650df8afaf6730f9afe52d35569c) feat: make JS websocket reconnect on connection loss +* [`23b3281`](https://github.com/siderolabs/omni/commit/23b3281f8880800a9084e1c8a74617fcf966c846) feat: use dynamic watcher to allow listing any kinds of resources +* [`16475f5`](https://github.com/siderolabs/omni/commit/16475f51cc9651736213b36c57381b24dcabdc62) feat: implement real time update server on top of web sockets +* [`76b39ae`](https://github.com/siderolabs/omni/commit/76b39ae563d9f09ecac3451389e3d260abdad48d) feat: create hello world Vue app using Kres +* [`baab493`](https://github.com/siderolabs/omni/commit/baab493f155cbd78c2e8af6ce45268c40ef6aeed) Initial commit +</p> +</details> + +### Changes since v0.1.0-alpha.1 +<details><summary>55 commits</summary> +<p> + +* [`e096c88`](https://github.com/siderolabs/omni/commit/e096c887604399028a559e33da13653c1f54965d) chore: add resource operation metrics +* [`741e820`](https://github.com/siderolabs/omni/commit/741e8202c5aecfe171082c38e2c55e0184e9c80c) feat: implement config patch creation UI +* [`5def267`](https://github.com/siderolabs/omni/commit/5def26706fa21df7748801cbdab5c6e81543174f) fix: attempt to clean up docker container better +* [`876ff5e`](https://github.com/siderolabs/omni/commit/876ff5ee44d4193c52e4daeec776ad50b69664f9) feat: update COSI and state-etcd to 0.2.0 +* [`3df410d`](https://github.com/siderolabs/omni/commit/3df410d964fc66b2d4ad8c7db0459108d16adde0) test: refactor and update config patch integration tests +* [`5eea9e5`](https://github.com/siderolabs/omni/commit/5eea9e50b47a6df324f2fd5564aa9010b56e16e0) feat: add TLS support to siderolink API +* [`36394ea`](https://github.com/siderolabs/omni/commit/36394ea242f9af4d9c17f90ec143b0356fa9e671) refactor: simplify the resource leak fix +* [`e5b962b`](https://github.com/siderolabs/omni/commit/e5b962b66f158fd31b74dc6b97f524c168b4fad1) chore: update dev environment +* [`39bf206`](https://github.com/siderolabs/omni/commit/39bf206eec29262b1c15ed557f7f24e029c61206) fix: save user picture and fullname in the local storage +* [`f1611c1`](https://github.com/siderolabs/omni/commit/f1611c10d26b937b5bae69a1b9eda67d2bc5e137) feat: add machine level config patch support +* [`f2e6cf5`](https://github.com/siderolabs/omni/commit/f2e6cf5cddb47aaa290e7db1a037f2155fcd60d2) fix: remove several resource/goroutine leaks +* [`fc37af3`](https://github.com/siderolabs/omni/commit/fc37af36d87e01c3e9f349f206711f154740e0b4) feat: allow destroying config patches in the UI +* [`3154d59`](https://github.com/siderolabs/omni/commit/3154d591e7c65713c6940d953df45d8242ae9359) fix: respect SIDEROLINK_DEV_JOIN_TOKEN only in debug mode +* [`38f5380`](https://github.com/siderolabs/omni/commit/38f53802ab3dda70fedc0a81de9d6dd43e6204f1) feat: avoid deleting all resources on omnictl delete +* [`28666bc`](https://github.com/siderolabs/omni/commit/28666bcb4acaf6e4f053e99d8d45d5dae320c89c) chore: add support for local development using compose +* [`cad73ce`](https://github.com/siderolabs/omni/commit/cad73cefc6b187a26e3833089e89ca1cb6fbf843) chore: increase TestEtcdAudit timeout and fix incorrect `Assert()` calls. +* [`7199b75`](https://github.com/siderolabs/omni/commit/7199b75c2108568d8bee82c42fcc00edb4a22e1c) chore: during `config merge` create config if there was none +* [`dab54d1`](https://github.com/siderolabs/omni/commit/dab54d14fcd8c0fadc6bb2a49d79e90379234403) chore: increase `TestTalosBackendRoles` reliability +* [`997cd78`](https://github.com/siderolabs/omni/commit/997cd7823bd126302ed4772658c0791768d67638) feat: add reconfiguring phase to machinesetstatus +* [`81fb2b9`](https://github.com/siderolabs/omni/commit/81fb2b94e61f7e7aaf41075fe17a2bbfea005d9f) fix: fix button order and vue config +* [`252fb29`](https://github.com/siderolabs/omni/commit/252fb29d64dac660da08459d9c5acc44e457b034) refactor: simplify backend.Server.Run method +* [`f335c2f`](https://github.com/siderolabs/omni/commit/f335c2f5311a81ca23699c473b68bf6918430aab) refactor: split watch to `Watch` and `WatchFunc`, add unit tests +* [`35a7919`](https://github.com/siderolabs/omni/commit/35a79193b965d42fba0a649bef0efe82abbd2fd5) feat: track machine config apply status +* [`1c54710`](https://github.com/siderolabs/omni/commit/1c54710c6f5ebe2740af27cebfb9c5532b22cc26) fix: use rolling update strategy on control planes +* [`17ccdc2`](https://github.com/siderolabs/omni/commit/17ccdc2f78693b5d1276b843c027e8057faa2ff7) refactor: various logging fixes +* [`3c9ca9c`](https://github.com/siderolabs/omni/commit/3c9ca9cd83298c5281c7ced50720b341c10a02f0) fix: update node overview Kubernetes node watch to make it compatible +* [`e8c2063`](https://github.com/siderolabs/omni/commit/e8c20631501308952bbc596e994a71b7677034b3) fix: enable edit config patches button on the cluster overview page +* [`6e80521`](https://github.com/siderolabs/omni/commit/6e8052169dd672e6fce5668982b704331eac4645) fix: reset the item list after the watch gets reconnected +* [`620d197`](https://github.com/siderolabs/omni/commit/620d1977a70bbc2cca8b331db825fc7bdb8fcda3) chore: remove AddContext method from runtime.Runtime interface +* [`8972ade`](https://github.com/siderolabs/omni/commit/8972ade40dea2bf3bf41bcb865a817d90b37657d) chore: update default version of Talos to v1.2.7 +* [`6a2dde8`](https://github.com/siderolabs/omni/commit/6a2dde863d306986027904167f262d4307a7420d) fix: update the config patch rollout strategy +* [`fb3f6a3`](https://github.com/siderolabs/omni/commit/fb3f6a340c37d1958e36400edf7ca53e2cde48a7) fix: skip updating config status if applying config caused a reboot +* [`8776146`](https://github.com/siderolabs/omni/commit/877614606d0c7d0259c4e65e4911f331550dd7d7) fix: apply finalizer to the `Machine` only when CMS is created +* [`134bb20`](https://github.com/siderolabs/omni/commit/134bb2053ce6250b9b4c647f3b2dbb8255cea2ce) test: fix config patch test with reboot +* [`d3b6b5a`](https://github.com/siderolabs/omni/commit/d3b6b5a75f9ea5304595851d6160e98ec4c9b8aa) feat: implement config patch viewer and editor +* [`149efe1`](https://github.com/siderolabs/omni/commit/149efe189a24c07e648289ee81d0b95ed1c972b7) chore: bump runtime and state-etcd modules +* [`c345b83`](https://github.com/siderolabs/omni/commit/c345b8348412aef59cbd43c35bf06ce3eac5ad3f) chore: output omnictl auth log to stderr +* [`39b2ba2`](https://github.com/siderolabs/omni/commit/39b2ba2a86972324161c6cff056abf10eb2fce5c) refactor: introduce ClusterEndpoint resource +* [`6998ff0`](https://github.com/siderolabs/omni/commit/6998ff0803063b22e113da0c72356ee254f13143) fix: treat created and updated events same +* [`289fe88`](https://github.com/siderolabs/omni/commit/289fe88aba94d6cfe4d7be7472b609232e45cbf6) feat: add omnictl apply +* [`2f1be3b`](https://github.com/siderolabs/omni/commit/2f1be3b4643e2a66a62da6a7f8f1f1da39ed6e17) chore: fix `TestGenerateJoinToken` test +* [`3829176`](https://github.com/siderolabs/omni/commit/382917630030415b1a218f14f2a1d6d3595834a0) fix: don't close config patch editor window if config validation fails +* [`c96f504`](https://github.com/siderolabs/omni/commit/c96f5041be7befb517998fc7bbccd135cb76908d) feat: add suspended mode +* [`b967bcf`](https://github.com/siderolabs/omni/commit/b967bcfd26b2fccfa6bbb08b8a15eb3796e2e872) feat: add last config apply error to clustermachineconfigstatus +* [`0395d9d`](https://github.com/siderolabs/omni/commit/0395d9dd7b985802be8f4cd2b8005b409faca3de) test: increase key generation timeout on storage signing test +* [`577eba4`](https://github.com/siderolabs/omni/commit/577eba4231142fe983f9a0f9b5a81280c377686e) fix: set SideroLink MTU to 1280 +* [`0f32172`](https://github.com/siderolabs/omni/commit/0f32172922ed2f7b8b4b7433fb1f9ce104f3c5a8) fix: minor things in frontend +* [`9abcc7b`](https://github.com/siderolabs/omni/commit/9abcc7b444c49f6223e0ae4948bff13eedbb05b5) test: add config patching integration tests +* [`99531fb`](https://github.com/siderolabs/omni/commit/99531fbeee982e2ab87d9f0162a0080308b852ab) refactor: drop unneeded controller inputs +* [`5172354`](https://github.com/siderolabs/omni/commit/51723541621d91964e88e8a5add834159214dc5b) chore: add omnictl to the generated image +* [`738cf64`](https://github.com/siderolabs/omni/commit/738cf649f53ec29e88112a027ec72f3d6f0cfff8) fix: set cluster machine version in machine config status correctly +* [`1d0d220`](https://github.com/siderolabs/omni/commit/1d0d220f47f1cc9ca8b20bfef47004a875b7573c) fix: lower ttl of the issued keys on the FE side by 10 minutes +* [`2889524`](https://github.com/siderolabs/omni/commit/2889524f222e42d49061867b2b2f5b59a16af4ba) feat: dynamic title +* [`3d17bd7`](https://github.com/siderolabs/omni/commit/3d17bd7cfd4775292090ccb3fd3c2b575b26d449) chore: fix release CI run +* [`f2c752f`](https://github.com/siderolabs/omni/commit/f2c752fed627006912018ae3e5f2ff0f2bed60b8) fix: properly proxy watch requests through dev-server +</p> +</details> + +### Dependency Changes + +This release has no dependency changes + +## [Omni 0.1.0-alpha.1](https://github.com/siderolabs/omni/releases/tag/v0.1.0-alpha.1) (2022-11-10) + +Welcome to the v0.1.0-alpha.1 release of Omni! +*This is a pre-release of Omni* + + + +Please try out the release binaries and report any issues at +https://github.com/siderolabs/omni/issues. + +### Contributors + +* Artem Chernyshev +* Andrey Smirnov +* Artem Chernyshev +* Dmitriy Matrenichev +* Philipp Sauter +* Utku Ozdemir +* evgeniybryzh +* Noel Georgi +* Andrew Rynhard +* Tim Jones +* Andrew Rynhard +* Gerard de Leeuw +* Steve Francis +* Volodymyr Mazurets + +### Changes +<details><summary>349 commits</summary> +<p> + +* [`8b284f3`](https://github.com/siderolabs/omni/commit/8b284f3aa26cf8a34452f33807dcc04045e7a098) feat: implement Kubernetes API OIDC proxy and OIDC server +* [`adad8d0`](https://github.com/siderolabs/omni/commit/adad8d0fe2f3356e97de613104196233a3b98ff5) refactor: rework LoadBalancerConfig/LoadBalancerStatus resources +* [`08e2cb4`](https://github.com/siderolabs/omni/commit/08e2cb4fd40ec918bf458edd6a5d8e6c86fe5c97) feat: support editing config patches on cluster and machine set levels +* [`e2197c8`](https://github.com/siderolabs/omni/commit/e2197c83e994afb435671f5af5cdefa843bbddb5) test: e2e testing improvements +* [`ec9051f`](https://github.com/siderolabs/omni/commit/ec9051f6dfdf1f5acaf3fa6766dc1195b6f6dcdd) fix: config patching +* [`e2a1d6c`](https://github.com/siderolabs/omni/commit/e2a1d6c78809eaa4168ca5ede433824797a6aa4e) fix: send logs in JSON format by default +* [`954dd70`](https://github.com/siderolabs/omni/commit/954dd70b935b7c373ba5830fd7ad6e965f6b0da8) chore: replace talos-systems depedencies with siderolabs +* [`acf94db`](https://github.com/siderolabs/omni/commit/acf94db8ac80fb6f15cc87ff276b7edca0cb8661) chore: add payload logger +* [`838c716`](https://github.com/siderolabs/omni/commit/838c7168c64f2296a9e01d3ef6ab4feb9f16aeb9) fix: allow time skew on validating the public keys +* [`dd481d6`](https://github.com/siderolabs/omni/commit/dd481d6cb3620790f6e7a9c8e305defb507cbe5f) fix: refactor runGRPCProxy in router tests to catch listener errors +* [`e68d010`](https://github.com/siderolabs/omni/commit/e68d010685d4f0a5d25fee671744119cecf6c27b) chore: small fixes +* [`ad86875`](https://github.com/siderolabs/omni/commit/ad86875ec146e05d7d7f461bf7c8094a8c143df5) feat: minor adjustments on the cluster create page +* [`e61f194`](https://github.com/siderolabs/omni/commit/e61f1943e965287c79fbaef05760bb0b0deee988) chore: implement debug handlers with controller dependency graphs +* [`cbbf901`](https://github.com/siderolabs/omni/commit/cbbf901e601d31c777ad2ada0f0036c57020ba96) refactor: use generic TransformController more +* [`33f9f2c`](https://github.com/siderolabs/omni/commit/33f9f2ce3ec0999198f311ae4bae9b58e57153c9) chore: remove reflect from runtime package +* [`6586963`](https://github.com/siderolabs/omni/commit/65869636aa33013b5feafb06e727b9d2a4cf1c19) feat: add scopes to users, rework authz & add integration tests +* [`bb355f5`](https://github.com/siderolabs/omni/commit/bb355f5c659d8c66b825de409d9446767005a2bb) fix: reload the page to init the UI Authenticator on signature fails +* [`c90cd48`](https://github.com/siderolabs/omni/commit/c90cd48eefa7f29328a456aa5ca474eece17c6fe) chore: log auth context +* [`d278780`](https://github.com/siderolabs/omni/commit/d2787801a4904fe895996e5319f301a1d7ca76df) fix: update Clusters page UI +* [`5e77607`](https://github.com/siderolabs/omni/commit/5e776072285e535e93c0458774dcad810b9b857a) tests: abort on first failure +* [`4c55980`](https://github.com/siderolabs/omni/commit/4c5598083ff6d8763c8763d8e46a3d7b659784ff) chore: get full method name from the service +* [`2194f43`](https://github.com/siderolabs/omni/commit/2194f4391607e6e73bce1917d2744e78fdd2cebc) feat: redesign cluster list view +* [`40b3f23`](https://github.com/siderolabs/omni/commit/40b3f23071096987e8a7c6f30a2622c317c190cb) chore: enable gRPC request duration histogram +* [`0235bb9`](https://github.com/siderolabs/omni/commit/0235bb91a71510cf4d349eedd3625b119c7e4e11) refactor: make sure Talos/Kubernetes versions are defined once +* [`dd6154a`](https://github.com/siderolabs/omni/commit/dd6154a45d5dcd14870e0aa3f97aa1d4e53bdcfb) chore: add public key pruning +* [`68908ba`](https://github.com/siderolabs/omni/commit/68908ba330ecd1e285681e24db4b9037eb2e8202) fix: bring back UpgradeInfo API +* [`f1bc692`](https://github.com/siderolabs/omni/commit/f1bc692c9125f7683fe5f234b03eb3521ba7e773) refactor: drop dependency on Talos Go module +* [`0e3ef43`](https://github.com/siderolabs/omni/commit/0e3ef43cfed68e53879e6c22b46e7d0568ddc05f) feat: implement talosctl access via Omni +* [`2b0014f`](https://github.com/siderolabs/omni/commit/2b0014fea15da359217f89ef723965dcc9faa739) fix: provide a way to switch the user on the authenticate page +* [`e295d7e`](https://github.com/siderolabs/omni/commit/e295d7e2854ac0226e7efda32864f6a687a88470) chore: refactor all controller tests to use assertResource function +* [`8251dfb`](https://github.com/siderolabs/omni/commit/8251dfb9e44341e9df9471f387cc76c91359cf84) refactor: extract PGP client key handling +* [`02da9ee`](https://github.com/siderolabs/omni/commit/02da9ee66f15462e6f4d7da18515651a5fde11aa) refactor: use extracted go-api-signature library +* [`4bc3db4`](https://github.com/siderolabs/omni/commit/4bc3db4dcbc14e0e51c7a3b5257686b671cc2823) fix: drop not working upgrade k8s functional +* [`17ca75e`](https://github.com/siderolabs/omni/commit/17ca75ef864b7a59f9c6f829de19cc9630a670c0) feat: add 404 page +* [`8dcde2a`](https://github.com/siderolabs/omni/commit/8dcde2af3ca49d9be16cc705c0b403826f2eee5d) feat: implement logout flow in the frontend +* [`ba766b9`](https://github.com/siderolabs/omni/commit/ba766b9922302b9d1f279b74caf94e6ca727f86f) fix: make `omnictl` correctly re-auth on invalid key +* [`fd16f87`](https://github.com/siderolabs/omni/commit/fd16f8743d3843e8ec6735a7c2e96532694b876e) fix: don't set timeout on watch gRPC requests +* [`8dc3cc6`](https://github.com/siderolabs/omni/commit/8dc3cc682e5419c3824c6e740a32085c386b8817) fix: don't use `omni` in external names +* [`2513661`](https://github.com/siderolabs/omni/commit/2513661578574255ca3f736d3dfa1f307f5d43b6) fix: reset `Error` field of the `MachineSetStatus` +* [`b611e99`](https://github.com/siderolabs/omni/commit/b611e99e14a7e2ebc64c55ed5c95a47e17d6ac32) fix: properly handle `Forbidden` errors on the authentication page +* [`8525502`](https://github.com/siderolabs/omni/commit/8525502265b10dc3cc056d301785f6f60e4f7e22) fix: stop runners properly and clean up StatusMachineSnapshot +* [`ab0190d`](https://github.com/siderolabs/omni/commit/ab0190d9a41b830daf60173b998acdbcbbdd3754) feat: implement scopes and enforce authorization +* [`9198d96`](https://github.com/siderolabs/omni/commit/9198d96ea9d57bb5949c59350aec42b2ce13ebac) feat: sign gRPC requests on the frontend to enable Authentication flow +* [`bdd8f21`](https://github.com/siderolabs/omni/commit/bdd8f216a9eca7ec657fa0dc554e663743f058d1) chore: remove reset button and fix padding +* [`362db57`](https://github.com/siderolabs/omni/commit/362db570349b4a2659f746ce18a436d684481ecb) fix: gRPC verifier should verify against original JSON payload +* [`30186b8`](https://github.com/siderolabs/omni/commit/30186b8cfe2eea6eaade8bacf31114886d3da3ea) fix: omnictl ignoring omniconfig argument +* [`e8ab0ba`](https://github.com/siderolabs/omni/commit/e8ab0ba45648b8f521500b46fe032797da6a111f) fix: do not attempt to execute failed integration test again +* [`9fda25e`](https://github.com/siderolabs/omni/commit/9fda25ef45f0060cc6c3ec812f5fa1c7b1015801) chore: add more info on errors to different controllers +* [`ccda526`](https://github.com/siderolabs/omni/commit/ccda5260c4645b5929724574a9f856eeaa4c232f) chore: bump grpc version +* [`b1ac125`](https://github.com/siderolabs/omni/commit/b1ac1255da5ca4b5d9c409e27c51e4298275e73c) chore: emit log when we got machine status event. +* [`005d257`](https://github.com/siderolabs/omni/commit/005d257c25c745b61e5a25c39167d511710562c7) chore: set admin role specifically for Reboot request. +* [`27f0e30`](https://github.com/siderolabs/omni/commit/27f0e309cec76a454e5bb24c2df1e62d9e4718e0) chore: update deps +* [`77f0219`](https://github.com/siderolabs/omni/commit/77f02198c1e7fb215548f3a0e2be30a0e19aaf6d) test: more unit-tests for auth components +* [`0bf6ddf`](https://github.com/siderolabs/omni/commit/0bf6ddfa46e0ea6ad255ede00a600c390344e221) fix: pass through HTTP request if auth is disabled +* [`4f3a67b`](https://github.com/siderolabs/omni/commit/4f3a67b08e03a1bad65c2acb8d65f0281fdd2f9e) fix: unit-tests for auth package and fixes +* [`e3390cb`](https://github.com/siderolabs/omni/commit/e3390cbbac1d0e78b72512c6ebb64a8f53dcde17) chore: rename arges-theila to omni +* [`14d2614`](https://github.com/siderolabs/omni/commit/14d2614538ec696d468a0850bd4ee7bc6884c3b1) chore: allow slashes in secretPath +* [`e423edc`](https://github.com/siderolabs/omni/commit/e423edc072714e7f693249b60079f5f700cc0a65) fix: add unit-tests for auth message and fix issues +* [`b5cfa1a`](https://github.com/siderolabs/omni/commit/b5cfa1a84e93b6bbf5533c599917f293fc5cdf66) feat: add vault client +* [`b47791c`](https://github.com/siderolabs/omni/commit/b47791ce303cbb9a8aab279685d17f92a480c7f4) feat: sign grpc requests on cli with pgp key & verify it on server +* [`d6ef4d9`](https://github.com/siderolabs/omni/commit/d6ef4d9c36758cb0091e2c528b848952f312941a) feat: split account ID and name +* [`e412e1a`](https://github.com/siderolabs/omni/commit/e412e1a69edad0d19d7e46fa3aa076dcb8e6d4b6) chore: workaround the bind problem +* [`e23cc59`](https://github.com/siderolabs/omni/commit/e23cc59bb8cb8f9df81738d4c58aed08d80fa9c4) chore: bump minimum Talos version to v1.2.4 +* [`0638a29`](https://github.com/siderolabs/omni/commit/0638a29d78c092641573aa2b8d2e594a7ff6aab4) feat: stop using websockets +* [`8f3c19d`](https://github.com/siderolabs/omni/commit/8f3c19d0f0ecfbe5beabc7dc508dcafa720e83e2) feat: update install media to be identifiable +* [`70d1e35`](https://github.com/siderolabs/omni/commit/70d1e354466618bb07c13445a16ca639be12009e) feat: implement resource encryption +* [`7653638`](https://github.com/siderolabs/omni/commit/76536386499889994b65f66a8a40f18b5535c5ba) fix: fix NPE in integration tests +* [`e39849f`](https://github.com/siderolabs/omni/commit/e39849f4047f028251123781bd8be350ebbfd65d) chore: update Makefile and Dockerfile with kres +* [`4709473`](https://github.com/siderolabs/omni/commit/4709473ec20fbf92a3240fb3376a322f1321103a) fix: return an error if external etcd client fails to be built +* [`5366661`](https://github.com/siderolabs/omni/commit/536666140556ba9b997a2b5d4441ea4b5f42d1c5) refactor: use generic transform controller +* [`a2a5f16`](https://github.com/siderolabs/omni/commit/a2a5f167f21df6375767d018981651d60bb2f768) feat: limit access to Talos API via Omni to `os:reader` +* [`e254201`](https://github.com/siderolabs/omni/commit/e2542013938991faa8f1c521fc524b8fcf31ea34) feat: merge internal/external states into one +* [`3258ca4`](https://github.com/siderolabs/omni/commit/3258ca487c818a34924f138640f44a2e51d307fb) feat: add `ControlPlaneStatus` controller +* [`1c0f286`](https://github.com/siderolabs/omni/commit/1c0f286a28f5134333130708d031dbfa11051a42) refactor: use `MachineStatus` Talos resource +* [`0a6b19f`](https://github.com/siderolabs/omni/commit/0a6b19fb916ea301a8f5f6ccd9bbdaa7cb4c39e0) chore: drop support for Talos resource API +* [`ee5f6d5`](https://github.com/siderolabs/omni/commit/ee5f6d58a2b22a87930d3c8bb9963f71c92f3908) feat: add auth resource types & implement CLI auth +* [`36736e1`](https://github.com/siderolabs/omni/commit/36736e14e5c837d38568a473834d14073b88a153) fix: use correct protobuf URL for cosi resource spec +* [`b98c56d`](https://github.com/siderolabs/omni/commit/b98c56dafe33beef7792bd861ac4e637fe13c494) feat: bump minimum version for Talos to v1.2.3 +* [`b93bc9c`](https://github.com/siderolabs/omni/commit/b93bc9cd913b017c66502d96d99c52e4d971e231) chore: move containers and optional package to the separate module +* [`e1af4d8`](https://github.com/siderolabs/omni/commit/e1af4d8a0bee31721d8946ef452afe04da6b494d) chore: update COSI to v0.2.0-alpha.1 +* [`788dd37`](https://github.com/siderolabs/omni/commit/788dd37c0be32745547ee8268aa0f004041dc96f) feat: implement and enable by default etcd backend +* [`1b83038`](https://github.com/siderolabs/omni/commit/1b83038b77cab87ffc2d4d73a91582785ed446ef) release(v0.1.0-alpha.0): prepare release +* [`8a9c4f1`](https://github.com/siderolabs/omni/commit/8a9c4f17ed6ee0d8e4a51b466d60a8278cd50f9c) feat: implement CLI configuration file (omniconfig) +* [`b0c92d5`](https://github.com/siderolabs/omni/commit/b0c92d56da00529c106f042399c1163375046785) feat: implement etcd audit controller +* [`0e993a0`](https://github.com/siderolabs/omni/commit/0e993a0977c711fb8767e3de2ad828fd5b9e688f) feat: properly support scaling down the cluster +* [`264cdc9`](https://github.com/siderolabs/omni/commit/264cdc9e015fd87724c7a07128d1136153732540) refactor: prepare for etcd backend integration +* [`b519d17`](https://github.com/siderolabs/omni/commit/b519d17971bb1c919286813b4c2465c2f5803a03) feat: show version in the UI +* [`a2fb539`](https://github.com/siderolabs/omni/commit/a2fb5397f9efb22a1354c5675180ca49537bee55) feat: keep track of loadbalancer health in the controller +* [`4789c62`](https://github.com/siderolabs/omni/commit/4789c62af0d1694d8d0a492cd6fb7d436e213fe5) feat: implement a new controller that can gather cluster machine data +* [`bd3712e`](https://github.com/siderolabs/omni/commit/bd3712e13491ede4610ab1452ae85bde6d92b2db) fix: populate machine label field in the patches created by the UI +* [`ba70b4a`](https://github.com/siderolabs/omni/commit/ba70b4a48623939d31775935bd0338c0d60ab65b) fix: rename to Omni, fix workers scale up, hide join token +* [`47b45c1`](https://github.com/siderolabs/omni/commit/47b45c129160821576d808d9a46a9ec5d14c6469) fix: correct filenames for Digital Ocean images +* [`9d217cf`](https://github.com/siderolabs/omni/commit/9d217cf16d432c5194110ae16a566b44b02a567e) feat: introduce new resources, deprecate `ClusterMachineTemplate` +* [`aee153b`](https://github.com/siderolabs/omni/commit/aee153bedb2f7856913a54b282603b07bf20059b) fix: address style issue in the Pods paginator +* [`752dd44`](https://github.com/siderolabs/omni/commit/752dd44ac42c95c644cad5640f6b2c5536a29676) chore: update Talos machinery to 1.2.0 and use client config struct +* [`88d7079`](https://github.com/siderolabs/omni/commit/88d7079a6656605a1a8dfed56d392414583a283e) fix: regenerate sources from proto files that were rolled back. +* [`84062c5`](https://github.com/siderolabs/omni/commit/84062c53417197417ff636a667289342089f390c) chore: update Talos to the latest master +* [`5a139e4`](https://github.com/siderolabs/omni/commit/5a139e473abcdf7fd25ad7c61dad8cbdc964a453) fix: properly route theila internal requests in the gRPC proxy +* [`4be4fb6`](https://github.com/siderolabs/omni/commit/4be4fb6a4e0bca29b32e1b732c227c9e7a0b1f43) feat: add support for 'talosconfig' generation +* [`9235b8b`](https://github.com/siderolabs/omni/commit/9235b8b522d4bc0712012425b68ff89e455886b9) fix: properly layer gRPC proxies +* [`9a516cc`](https://github.com/siderolabs/omni/commit/9a516ccb5c892ed8fe41f7cf69aaa5bb1d3fa471) fix: wait for selector of 'View All' to render in e2e tests. +* [`3cf3aa7`](https://github.com/siderolabs/omni/commit/3cf3aa730e7833c0c1abe42a6afb87a85f14b58c) fix: some unhandled errors in the e2e tests. +* [`c32c7d5`](https://github.com/siderolabs/omni/commit/c32c7d55c92007aa1aa10feab3c7a7de2b2afc42) fix: ignore updating cluster machines statuses without machine statuses +* [`4cfa307`](https://github.com/siderolabs/omni/commit/4cfa307b85b410b44e482b259d14670b55e4a237) chore: run rekres, fix lint errors and bump Go to 1.19 +* [`eb2d449`](https://github.com/siderolabs/omni/commit/eb2d4499f1a3da7bc1552a6b099c28bed6fd0e4d) fix: skip the machines in `tearingDown` phase in the controller +* [`9ebc769`](https://github.com/siderolabs/omni/commit/9ebc769b89a2bab37fd081e555f84e3e4c99187e) fix: allow all services to be proxied by gRPC router +* [`ea2b01d`](https://github.com/siderolabs/omni/commit/ea2b01d0a0e054b259d710317fe368882534cf4c) fix: properly handle non empty resource id in the K8s resource watch +* [`3bb7da3`](https://github.com/siderolabs/omni/commit/3bb7da3a0fa6b746f6a7b9aa668e055bdf825e6a) feat: show a Cluster column in the Machine section +* [`8beb70b`](https://github.com/siderolabs/omni/commit/8beb70b7f045a218f9cb753e1402a07542b0bf1c) fix: ignore tearing down clusters in the `Cluster` migrations +* [`319d4e7`](https://github.com/siderolabs/omni/commit/319d4e7947cb78135f5a14c02afe5814c56a312c) fix: properly handle `null` memory modules list +* [`6c2120b`](https://github.com/siderolabs/omni/commit/6c2120b5ae2bd947f473d002dfe165646032e811) chore: introduce migrations manager for COSI DB state +* [`ec52139`](https://github.com/siderolabs/omni/commit/ec521397946cc15929472feb7c45435fb48df848) fix: filter out invalid memory modules info coming from Talos nodes +* [`8e87031`](https://github.com/siderolabs/omni/commit/8e870313a3a31d052eecf81acb522433ff98ae79) fix: bump loadbalancer timeout settings +* [`bc0ed26`](https://github.com/siderolabs/omni/commit/bc0ed2672064a6bf148cd9799b35a2790f5aa7f6) feat: introduce websocket, HTTP requests monitoring +* [`857401f`](https://github.com/siderolabs/omni/commit/857401f54e3922a9ab85d7dc703a5afb70c6ee45) feat: add HTTP logging (static, gateway), and websocket logging +* [`eb612a3`](https://github.com/siderolabs/omni/commit/eb612a38e9c71913ebecc9f345e17844d60800b8) fix: do hard stop of events sink gRPC server after 5 seconds +* [`3162513`](https://github.com/siderolabs/omni/commit/31625135e2b971d6b9f92eb4096c010113030a80) fix: populate nodes filter dropdown properly and rewrite filter function +* [`5713a51`](https://github.com/siderolabs/omni/commit/5713a516391a5190fac9b7044a9f71952ce15479) fix: make `TSelectList` search filter the items in the dropdown +* [`f2519ff`](https://github.com/siderolabs/omni/commit/f2519ff51b88766a907f1d7717ef74031157fd56) feat: don't allow using nodes with not enough mem for the cluster +* [`9e474d6`](https://github.com/siderolabs/omni/commit/9e474d69c76a898fc5b6fcd9fdc8e87f25b7dc53) feat: show disconnected warning in the machines list +* [`fa52b48`](https://github.com/siderolabs/omni/commit/fa52b48f54362c7305681ca79a7d98237531f2b4) feat: redesign Installation Media selection menu +* [`01e301a`](https://github.com/siderolabs/omni/commit/01e301a875699cf6fcc887cb31cd7939338f58e9) fix: query node list using `talosctl get members` instead of K8s nodes +* [`e694df5`](https://github.com/siderolabs/omni/commit/e694df59c50fbee356a48c94ade95e924ea46bb2) fix: display all available Talos versions on cluster create page +* [`7a87525`](https://github.com/siderolabs/omni/commit/7a87525ed1b928a8f8e3e6a39feb4c19009ec264) fix: use `v-model` instead of callbacks in the inputs +* [`d681f5f`](https://github.com/siderolabs/omni/commit/d681f5f58788612f144fa1f8d90ec6c996badb0e) feat: support scaling up the clusters +* [`e992b95`](https://github.com/siderolabs/omni/commit/e992b9574d7b8f76497f46e25764618ec274af1a) feat: show notification on image download progress +* [`8ea6d9f`](https://github.com/siderolabs/omni/commit/8ea6d9f1724b271919e538ed55ff6582858470f9) fix: probably fix 'context canceled' on image download +* [`692612b`](https://github.com/siderolabs/omni/commit/692612b7e628588fa7608cff683c5af406f24ca7) fix: improve the Talos image generation process +* [`a69c140`](https://github.com/siderolabs/omni/commit/a69c140e26f4298fcaafb1f96c389269992fc069) feat: introduce Prometheus metrics +* [`e90ca78`](https://github.com/siderolabs/omni/commit/e90ca7875c501391f860f5df9f2a4e4f8e2f2d7a) fix: make grpc api listen only on siderolink interface +* [`99fc28c`](https://github.com/siderolabs/omni/commit/99fc28c36c62a8d8c654c05f9b9c64ff37cedba8) fix: display correct cluster/machine status on ui +* [`eaf7655`](https://github.com/siderolabs/omni/commit/eaf7655395401cd88e6bd47f4f8aa958abee30f1) fix: add a pause before integration tests +* [`19ff1c9`](https://github.com/siderolabs/omni/commit/19ff1c909bedf63fe6cf2f5cc0e44f34046ca568) chore: rename download button +* [`e1c4e1b`](https://github.com/siderolabs/omni/commit/e1c4e1b171eab08585a3315ca5838c88a4d2eb24) feat: add download options for all talos images +* [`24e7863`](https://github.com/siderolabs/omni/commit/24e786369bfc0bb4966712296395db91751e657b) fix: delete cached clients from gRPC proxy when the cluster is destroyed +* [`58c89ef`](https://github.com/siderolabs/omni/commit/58c89ef3fe621ef6909c5d38a0d47cc861667f45) feat: implement `argesctl delete` command +* [`3c99b49`](https://github.com/siderolabs/omni/commit/3c99b49a9b680b091d92455a0d3bc325f8f68ca6) test: add a test which removes allocated machine +* [`75dd28f`](https://github.com/siderolabs/omni/commit/75dd28f56d7ce9a92b96822a867fbfe2655cd0fa) chore: fill in resource definitions for table headers +* [`028f168`](https://github.com/siderolabs/omni/commit/028f16886c41b7aa7eafb65308cc4adf4d624037) feat: End-to-end tests with playwright +* [`6be6b36`](https://github.com/siderolabs/omni/commit/6be6b3605583ce8e8068746624ca86ed6adc37af) chore: bump goimports from 0.1.10 to 0.1.11 and node from 18.5.0 to 18.6.0 +* [`af4da08`](https://github.com/siderolabs/omni/commit/af4da086d4b709f504eda7909a36a8f0cf84e480) test: implement kernel log streaming test +* [`1eacfee`](https://github.com/siderolabs/omni/commit/1eacfee2c1084040ae2201eba957409218a92c66) feat: implement argesctl machine-logs output in 'zap-like' and 'dmesg' form. +* [`96ab7ab`](https://github.com/siderolabs/omni/commit/96ab7ab8317898dd45d129d5cecd2aaf1d379fba) chore: ignore memory modules with zero size +* [`fd0575f`](https://github.com/siderolabs/omni/commit/fd0575ff4050702c9d07e34c7d9d5596b4ad7311) chore: retrieve k8s versions from github registry +* [`8651527`](https://github.com/siderolabs/omni/commit/86515275a77741bacc790d2006f3671a5cfb27c6) feat: redo errgroup to return error on first nil error +* [`944222d`](https://github.com/siderolabs/omni/commit/944222d06607079b5d982afe4b19fc1dda7f1ec2) fix: show ClusterMachineStatus.Stage in 'Clusters' view +* [`f3f6b6e`](https://github.com/siderolabs/omni/commit/f3f6b6eecd3ffc13b69845dff50d2e8ab31bc0d2) chore: refactor run method and no longer ignore log receiver listener errors +* [`b316377`](https://github.com/siderolabs/omni/commit/b316377b277f87a184b969b3bbf20ebe6047a0a8) chore: rename 'Dmesg' to 'Console' +* [`19ee857`](https://github.com/siderolabs/omni/commit/19ee8578a6f1c1bf742699d1b5720dc4c2674c82) test: add a way to recover deleted machines +* [`e5b5bdc`](https://github.com/siderolabs/omni/commit/e5b5bdc39fa6f3812b15771366f942ddcbe7f328) fix: update SideroLink library for EEXIST fixes +* [`363de69`](https://github.com/siderolabs/omni/commit/363de69a50b5c1e9d07fa42152cca935844d118b) fix: spec collector equality +* [`841f3b2`](https://github.com/siderolabs/omni/commit/841f3b22aacc6d2875062ef324d900c5f2091f9d) feat: add ability to supply machine config patches on the machines +* [`907ca93`](https://github.com/siderolabs/omni/commit/907ca93247267d80125866c2b60225ceca3ada27) test: fix link destroy test +* [`4c9f99d`](https://github.com/siderolabs/omni/commit/4c9f99d32874cdaff1eb651bf6d74ef39167c273) fix: remove machine status if the machine is in tearing down phase +* [`d9747e5`](https://github.com/siderolabs/omni/commit/d9747e552e52156a9baeae962a9478231e26c566) fix: make cluster machine status test more reliable +* [`3bfff3b`](https://github.com/siderolabs/omni/commit/3bfff3bb0eea9d18956dee21aff7f3de900c6b82) fix: do not set up full theila runtime during clients tests +* [`4bf33bc`](https://github.com/siderolabs/omni/commit/4bf33bc9d37404a733c5039784c80e92800fb3dc) fix: immediately fail the request if the cluster is down +* [`124a5c2`](https://github.com/siderolabs/omni/commit/124a5c2947978e6bc86d1b19c9eacbcf7f870b53) fix: ensure the created date on resources is set +* [`14161bf`](https://github.com/siderolabs/omni/commit/14161bf3dad4484868359d186d99d9198b6eed95) feat: add scale up integration test and minor log fixes +* [`7af06fd`](https://github.com/siderolabs/omni/commit/7af06fd75959eb9e807680ac8a6ba4f0a7f59255) feat: make integration tests a subtests of one global test +* [`f7c1464`](https://github.com/siderolabs/omni/commit/f7c1464a1002f63daab29b36d19ea16de0cd5794) feat: implement log receiver for logs from Talos +* [`5b800ea`](https://github.com/siderolabs/omni/commit/5b800ea970215fb4e100ed7b3b73d7e218fd6d86) fix: accumulate bytes received/send in the link resource +* [`b3b1e9b`](https://github.com/siderolabs/omni/commit/b3b1e9bbfbf62632dc0d8c2239a72793883101ce) feat: machine removal +* [`fb01bc4`](https://github.com/siderolabs/omni/commit/fb01bc4b26c5b37f15bac923450e1f58fb7a3d89) fix: use Talos 1.2.0 +* [`3a50efe`](https://github.com/siderolabs/omni/commit/3a50efe363c4724f369a02f672848ad7c284847c) feat: filter machines that can be added to cluster +* [`ba62db5`](https://github.com/siderolabs/omni/commit/ba62db521b47049e92557bf8cfc5f737e496bf57) fix: properly parse `siderolink-api-advertised-url` if there's no port +* [`96f835a`](https://github.com/siderolabs/omni/commit/96f835a91136f62d9dbdf5c1d1c46c729d57e51e) fix: properly display node selectors in FireFox +* [`12c20a4`](https://github.com/siderolabs/omni/commit/12c20a42c9dfdea5f88e0e7942fbdb42ea543b95) fix: populate disks when machines are connected during cluster create +* [`0dc97f8`](https://github.com/siderolabs/omni/commit/0dc97f8696a7c571d5318daf794700342e06f639) fix: adjust overview page to look closer to the mockups +* [`2b77af8`](https://github.com/siderolabs/omni/commit/2b77af8d39e555970487c3265dfbd63412e90d2f) feat: add the chart showing the count of clusters +* [`a1dff65`](https://github.com/siderolabs/omni/commit/a1dff6589d64207e6e7331d0407e7857f9c4079d) feat: implement ISO download with embedded kernel args +* [`37c03d8`](https://github.com/siderolabs/omni/commit/37c03d8cb04b02e79f42e70eeea1e4368445604d) test: pull kubeconfig and interact with Kubernetes API +* [`75bfb08`](https://github.com/siderolabs/omni/commit/75bfb08f0738fc9f67259caf12902db67860370f) fix: ignore the error on splitting host/port +* [`3be5a32`](https://github.com/siderolabs/omni/commit/3be5a3254168cddec8f1629789c2ae50d9eaa08e) feat: make the whole cluster list item clickable, add dropdown menu item +* [`2c9dc99`](https://github.com/siderolabs/omni/commit/2c9dc99000266b3d4c139f27dea4f6283709251e) fix: adjust the look of the Overview page a bit +* [`aa4a926`](https://github.com/siderolabs/omni/commit/aa4a926cbb85bf63312493b937440a174aed5070) feat: add the button for downloading cluster Kubeconfig on overview page +* [`4532de6`](https://github.com/siderolabs/omni/commit/4532de6f3d514a534c38a63731c43075698f5c01) feat: support basic auth in `argesctl` command +* [`b66bb3c`](https://github.com/siderolabs/omni/commit/b66bb3cbcc85d7be4348ecd9a6d5d62f72a90e11) feat: add summary information Overview page +* [`3bdbce4`](https://github.com/siderolabs/omni/commit/3bdbce41a3ed89a42556d837bc0c5cfe417e22e6) test: more cluster creation tests, two clusters, cleanup +* [`3b00bd5`](https://github.com/siderolabs/omni/commit/3b00bd5bf417c5c9cb42471d27811c1849a40c78) fix: improve cluster deletion and node reset flow +* [`2d83d16`](https://github.com/siderolabs/omni/commit/2d83d1694ec73da818004f91ede76a0bca30fe79) test: create a cluster and verify cluster machine statuses +* [`f471cfd`](https://github.com/siderolabs/omni/commit/f471cfdcf7c9e70f37436e173c3a58c1965e8bb2) fix: copy all labels from the `ClusterMachine` to `ClusterMachineStatus` +* [`ec32f86`](https://github.com/siderolabs/omni/commit/ec32f8632db104efd6fedc5421179175274d6339) test: add integration tests up to the cluster creation +* [`a8d3ee5`](https://github.com/siderolabs/omni/commit/a8d3ee5b14a57ad1d9d88512a95032bbda61e734) feat: add kubeconfig command to argesctl and fix kubeconfig +* [`10b9a3b`](https://github.com/siderolabs/omni/commit/10b9a3ba676a636e488805ed04a0c908c3d2cf53) test: implement API integration test +* [`3e6b891`](https://github.com/siderolabs/omni/commit/3e6b8913f916dc5e8ac3ef49e14648defa6e1bf6) feat: aggregate cluster machine statuses in cluster status controller +* [`f6cbc58`](https://github.com/siderolabs/omni/commit/f6cbc58a91124833f0cbae4ecd0c0416acbe8bfa) chore: ignore empty processor info +* [`c5fc71b`](https://github.com/siderolabs/omni/commit/c5fc71b86a5492d548ae9098c5c74de240ebd800) fix: clean up Kubernetes client and configs when a cluster is destroyed +* [`e8478fe`](https://github.com/siderolabs/omni/commit/e8478fe5280d5e8a32bb423ec96edacadabc7e43) fix: properly use tracker to cleanup `ClusterMachineConfig` resources +* [`044fcad`](https://github.com/siderolabs/omni/commit/044fcadb66de61742ab871d10f3fcf0f453f6e27) fix: make `MachineStatusController` connect to configured nodes +* [`2867099`](https://github.com/siderolabs/omni/commit/2867099a52d651c3b0f9d3abbae266f2792cafe7) feat: add api endpoint to fetch kubeconfig +* [`5f32667`](https://github.com/siderolabs/omni/commit/5f3266747012b590dd7a7d0ebc23ee0e80abb2ab) test: support registry mirrors for development purposes +* [`5114695`](https://github.com/siderolabs/omni/commit/5114695cfeb0b6c792002ff5f0f31c1944c269ab) refactor: consistent flag naming +* [`9ffb19e`](https://github.com/siderolabs/omni/commit/9ffb19e77968c6e411903a2c59fd9a18063b46d4) chore: use latest node +* [`5512321`](https://github.com/siderolabs/omni/commit/5512321f05b6b657a28abc25470664f6eb6e3d0a) refactor: set better defaults for cli args +* [`ff88242`](https://github.com/siderolabs/omni/commit/ff882427f56e42039b79900380b61b86d3290269) chore: mark 'siderolink-wireguard-endpoint' flags as required +* [`4a9d9ad`](https://github.com/siderolabs/omni/commit/4a9d9adef1e521d3c0293b6dc414f572bd8a93d4) feat: add the ClusterMachineStatus resource +* [`e4e8b62`](https://github.com/siderolabs/omni/commit/e4e8b6264cb48edd014f97129f52aefaa129fd63) refactor: unify all Arges API under a single HTTP server +* [`5af9049`](https://github.com/siderolabs/omni/commit/5af9049bdc2e09bf410e1b0646e4e08a4366f33b) chore: rename sidebar item +* [`a4fc47f`](https://github.com/siderolabs/omni/commit/a4fc47f97d79259532b91a8d391e84b59554ed8e) chore: fix build warning +* [`547b83c`](https://github.com/siderolabs/omni/commit/547b83c4a2a543d5b6ce4dca6cf6f5de87c33dcb) chore: bump siderolink version +* [`11c31f3`](https://github.com/siderolabs/omni/commit/11c31f39d834e3352b086c1aec665065fd74e944) refactor: drop one of the layered gRPC servers +* [`0adbbb7`](https://github.com/siderolabs/omni/commit/0adbbb7edfeacedd98a7e84c2f45ac458750a281) feat: introduce a way to copy kernel arguments from the UI +* [`ce5422a`](https://github.com/siderolabs/omni/commit/ce5422a27771a94cc25be70ec756711d140b2758) fix: import new COSI library to fix YAML marshaling +* [`d6cec09`](https://github.com/siderolabs/omni/commit/d6cec099cb6f4c3118e4263b9517176858bb9cfb) feat: implement Arges API client, and minimal `argesctl` +* [`65c8d68`](https://github.com/siderolabs/omni/commit/65c8d683187d82dc730752294c1bc03657f5df78) feat: implement cluster creation view +* [`8365b00`](https://github.com/siderolabs/omni/commit/8365b00df90ac55f99e0f82e1fa6d4367ebd6a3f) feat: re-enable old Theila UI +* [`63e703c`](https://github.com/siderolabs/omni/commit/63e703c4e1dfb4bf645fbc9cd28ba2a722e04dc2) fix: update Talos to the latest master +* [`d33e27b`](https://github.com/siderolabs/omni/commit/d33e27b49113729c5538fce688832152ff96a7ea) feat: implement clusters list view +* [`cb9e23c`](https://github.com/siderolabs/omni/commit/cb9e23ca6f420ac7b71acf6b19e9012265f3c69b) feat: protect Theila state from external API access +* [`952c235`](https://github.com/siderolabs/omni/commit/952c2359b32fdd077d85e312707f8b9c9e01ea0c) fix: properly allocated ports in the loadbalancer +* [`a58c479`](https://github.com/siderolabs/omni/commit/a58c479e9e31f70e806a1f3482b9b984c5c0ca68) chore: report siderolink events kernel arg +* [`8a56fe3`](https://github.com/siderolabs/omni/commit/8a56fe34ce1966fe28f9e432c696fdd779dfb638) refactor: move Theila resources to public `pkg/` +* [`1251699`](https://github.com/siderolabs/omni/commit/12516996eda859db6677403ad1f72a3994ea180b) fix: reset the `MachineEventsSnapshot` after the node is reset +* [`9a2e6af`](https://github.com/siderolabs/omni/commit/9a2e6af3113b795f57c4e3a86c1348b120fa3bbd) feat: implement bootstrap controller +* [`7107e27`](https://github.com/siderolabs/omni/commit/7107e27ee6b9ba644fc803e4463cbfcf26cf97de) feat: implement apply and reset config controller +* [`1579eb0`](https://github.com/siderolabs/omni/commit/1579eb09eb58f2cb679205e9e204369f3a362e07) feat: implement machine events handler and `ClusterStatus` +* [`7214f4a`](https://github.com/siderolabs/omni/commit/7214f4a514a921d6b9df7515116613996416f383) feat: implement cluster load balancer controller +* [`9c4fafa`](https://github.com/siderolabs/omni/commit/9c4fafaf6b8dc9b7ff08fe28704ca6a2e7efc097) feat: add a controller that manages load balancers for talos clusters +* [`7e3d80c`](https://github.com/siderolabs/omni/commit/7e3d80ce956d621ed79e4db094808831e18db85b) feat: add a resources that specify configurations for load balancers +* [`dc0d356`](https://github.com/siderolabs/omni/commit/dc0d356a181b4c37670d2ed4e8d7af370dccef60) feat: support Theila runtime watch with label selectors +* [`6a568a7`](https://github.com/siderolabs/omni/commit/6a568a72922e34e91f5448d3c1caa2f0b3a02e96) feat: implement `ClusterMachineConfig` resource and it's controller +* [`3db0f1c`](https://github.com/siderolabs/omni/commit/3db0f1c9d4e2d6f962b6f3216a4f9c7e2575dd21) feat: implement `TalosConfig` controller +* [`b7ae8e1`](https://github.com/siderolabs/omni/commit/b7ae8e113dc68acd87c4cfe5e3c8349d32bc392d) feat: introduce `Cluster` controller that adds finalizers on Clusters +* [`8d7ea02`](https://github.com/siderolabs/omni/commit/8d7ea0293e8f57388fd483dc82e79e6b4c76a53f) chore: use label selectors in `TalosConfig`, set labels on the resources +* [`cff9cb1`](https://github.com/siderolabs/omni/commit/cff9cb19ba8718fdad509b5e91cb8221c6c1ff00) fix: separate advertised endpoint from the actual wireguard endpoint +* [`5be6cc3`](https://github.com/siderolabs/omni/commit/5be6cc391adf8bcb58b8d47f09dad5aa75d1ad98) feat: implement cluster creation UI +* [`a1633eb`](https://github.com/siderolabs/omni/commit/a1633eb18772b9e99d687dfddd12fc09fd1ea5c4) chore: add typed wrappers around State, Reader and Writer +* [`5515f3d`](https://github.com/siderolabs/omni/commit/5515f3d004f54455a1eb1f4977bbb9d663fd1bca) feat: add `ClusterSecrets` resource and controller and tests +* [`7226f6c`](https://github.com/siderolabs/omni/commit/7226f6cdc60eeb4d6040d1aa0711fed378c50b33) feat: add `Cluster`, `ClusterMachine` and `TalosConfig` resources +* [`ec44930`](https://github.com/siderolabs/omni/commit/ec44930672ca8954c6ba68975c1799a087ec0c43) feat: enable vtprotobuf optimized marshaling +* [`15be219`](https://github.com/siderolabs/omni/commit/15be2198872fb637f7ba2e1ff550e4466179f2b1) feat: generate TS constants from go `//tsgen:` comments +* [`caa4c4d`](https://github.com/siderolabs/omni/commit/caa4c4d285dcd1176a70d87f28ee303cd0483ca8) fix: resource equality for proto specs +* [`beeca88`](https://github.com/siderolabs/omni/commit/beeca886213332f313f7f3a477d7e7c508e6d058) refactor: clarify code that creates or gets links for nodes +* [`340c63a`](https://github.com/siderolabs/omni/commit/340c63ad4ba918d4b11ab1f57fdbd3b5e5d8b3dc) feat: implement `Machines` page +* [`f7bc0c6`](https://github.com/siderolabs/omni/commit/f7bc0c69c69fe515cfa729bc062c730756a53019) feat: accept nodes if they provide the correct join token +* [`bdf789a`](https://github.com/siderolabs/omni/commit/bdf789a35da5491a4fcbd2af35a1c6efd22ab1fc) feat: immediately reconnect SideroLink peers after Arges restart +* [`6b74fa8`](https://github.com/siderolabs/omni/commit/6b74fa82ca5757d6f3809853c1ac3e7754efb06d) feat: implement MachineStatusController +* [`f5db0e0`](https://github.com/siderolabs/omni/commit/f5db0e05a87d5c11b4a1029b14020b19ca67035d) feat: add more info to the siderolink connection spec +* [`d3e4a71`](https://github.com/siderolabs/omni/commit/d3e4a71af8fd79328e4edda6d9642b83902b2003) refactor: simplify the usage of gRPC resource CRUD API +* [`2430115`](https://github.com/siderolabs/omni/commit/2430115af1aaac4226b7d5821e1fe706a1088501) feat: implement MachineController and small fixes +* [`e31d22d`](https://github.com/siderolabs/omni/commit/e31d22d7639753df53c130461ae1f96b9126f3a5) feat: support running Theila without contexts +* [`a6b3646`](https://github.com/siderolabs/omni/commit/a6b364626bd808687d5ad95307766344b16dd042) refactor: small fixes +* [`33d2b59`](https://github.com/siderolabs/omni/commit/33d2b59c202f03785580209c885aa297c023fa60) refactor: clean up a bit SideroLink code, fix shutdown +* [`98ec883`](https://github.com/siderolabs/omni/commit/98ec8830308755c7073a5d4510483e97d8e1d02d) chore: rename main executable to avoid clashing with Theila project +* [`828721d`](https://github.com/siderolabs/omni/commit/828721d9aa5d912cce628256f75579309d1ad67d) feat: enable COSI persistence for resources +* [`f1f7883`](https://github.com/siderolabs/omni/commit/f1f788344254e18bcab00a25b56a86289bfb1638) feat: set up siderolink endpoints in Theila +* [`6439335`](https://github.com/siderolabs/omni/commit/64393353ca7cf430f82bfe73a004da319da28261) refactor: migrate to `typed.Resource` in Theila internal state +* [`6195274`](https://github.com/siderolabs/omni/commit/61952742a47ea89e89228f057d0d3de351766150) refactor: restructure folders in the project +* [`1abf72b`](https://github.com/siderolabs/omni/commit/1abf72b4b2e382fe0cf9302b42242152c255a3ee) chore: update Talos libs to the latest version +* [`16dffd9`](https://github.com/siderolabs/omni/commit/16dffd9058570477b3a648896a89e6445e5b0162) fix: display delta time for pod's age +* [`8b80726`](https://github.com/siderolabs/omni/commit/8b807262b23cfa830f3ff444d49f11b3a1654703) feat: update favicon to sidero logo +* [`2da7378`](https://github.com/siderolabs/omni/commit/2da737841c2ae0bf1f1f916dc6f45b1e3996d6e4) feat: show the extended hardware info +* [`d3c6004`](https://github.com/siderolabs/omni/commit/d3c6004f9767bf0cff9191dc130308c848ede077) chore: allow getting resources without version and group +* [`eb19087`](https://github.com/siderolabs/omni/commit/eb190875b30275195e52f1a95ed0bb3aae08424f) fix: remove t-header error notification +* [`5a28202`](https://github.com/siderolabs/omni/commit/5a28202c939ef9683d14fb3d873e0bacb35577db) feat: restyle t-alert component +* [`9f2b482`](https://github.com/siderolabs/omni/commit/9f2b48228bbfa39d33b07ae43e9fdb34192c3eed) fix: get rid of racy code in the kubeconfig request code +* [`c40824e`](https://github.com/siderolabs/omni/commit/c40824ecc5d10cb5289e133b8b1f51213aa12f7f) feat: add text Highlight feature +* [`9018c81`](https://github.com/siderolabs/omni/commit/9018c81bd0d7c58bb5c632c06f3c3904f6674e03) feat: use `~/.talos/config` as a primary source for clusters +* [`e10547b`](https://github.com/siderolabs/omni/commit/e10547b5761ad96ab8b5766fe5c3f06fcdf86477) refactor: remove old components and not used code parts +* [`f704684`](https://github.com/siderolabs/omni/commit/f7046846ea8e83a0e39647c4fcc49addf4c56061) fix: properly calculate servers capacity +* [`755a077`](https://github.com/siderolabs/omni/commit/755a0779014b0a4177e0fc5180db20720be5a814) fix: use proper units for memory and CPU charts on the node monitor page +* [`d0a083d`](https://github.com/siderolabs/omni/commit/d0a083d1c15c319e236dd258fabcc9a231f797a1) release(v0.2.0-alpha.0): prepare release +* [`53878ee`](https://github.com/siderolabs/omni/commit/53878eea09c18f2bc0dd55ca11a6743587748319) fix: properly update servers menu item when the context is changed +* [`b4cb9c7`](https://github.com/siderolabs/omni/commit/b4cb9c7989ec5299785b86acb3fa0ee648efd259) feat: restyle TMonitor page +* [`f0377e2`](https://github.com/siderolabs/omni/commit/f0377e2ad5da702af71f2706141f4d7c638c7a15) fix: invert chart value for cpu, storage and memory on the overview page +* [`6ea6ecf`](https://github.com/siderolabs/omni/commit/6ea6ecf12c4d8b5253b4dfc2e64f5b5d787d022a) fix: update capi-utils to fix talosconfig requests for CAPI clusters +* [`e3796d3`](https://github.com/siderolabs/omni/commit/e3796d3876d33248fd0998901273a14d29a487a3) chore: update capi-utils +* [`39186eb`](https://github.com/siderolabs/omni/commit/39186ebe50da531f35d21ac2488f8a58c1ef8e78) feat: implement overview page, cluster dropdown, ongoing tasks +* [`59f2b27`](https://github.com/siderolabs/omni/commit/59f2b27be4d7f5a591fdeae533d649494356250d) docs: update README.md +* [`2b7831f`](https://github.com/siderolabs/omni/commit/2b7831f2d22106ac8a82f890d73c2705841b0739) feat: add Kubernetes and Servers pages +* [`4451a5b`](https://github.com/siderolabs/omni/commit/4451a5bc9f5c6b058c6bcf1252b7c83a001cafbe) fix: properly set TaskStatus namespace in the initial call +* [`4545464`](https://github.com/siderolabs/omni/commit/454546425f2fd7e4418aa8a03465f3a062de804e) fix: add new fields to the TaskStatus spec, update Talos +* [`891cf3b`](https://github.com/siderolabs/omni/commit/891cf3b79c8430deeed8a168955afd6e97083baa) docs: describe client context types, usage +* [`309b515`](https://github.com/siderolabs/omni/commit/309b51545ead2ee144244591df2e5ead2849fb11) feat: update k8s upgrades tasks structure for the new UI representation +* [`5aa8ca2`](https://github.com/siderolabs/omni/commit/5aa8ca24bd3159879c46c8e8a134702b174e3362) feat: add NodesPage +* [`db434e0`](https://github.com/siderolabs/omni/commit/db434e07b9f23562bd746a0f78e3868b079006e2) feat: add TPagination component +* [`0b51727`](https://github.com/siderolabs/omni/commit/0b51727efed31f13f52fa20b360071e7e2a6d9eb) feat: add Pods, Dashboard, Upgrade views, etc +* [`c549b8b`](https://github.com/siderolabs/omni/commit/c549b8b9ee8a563f14b2e791f91a7b3cb0430aa7) feat: add Overview and Upgrade Kubernetes pages +* [`cec2e85`](https://github.com/siderolabs/omni/commit/cec2e854f4f3999109220902bccaee6c25d1f502) chore: define constants for all used resource types +* [`962bdaf`](https://github.com/siderolabs/omni/commit/962bdaf6406ab8e5febea0ad8d32da9c86fa39e7) feat: add TSideBar +* [`fa28ccb`](https://github.com/siderolabs/omni/commit/fa28ccb67f52c1dd9096b23388427d78be526275) feat: add TheHeader component +* [`f3418a5`](https://github.com/siderolabs/omni/commit/f3418a59e38e551bd0be7cc7ae66ef4645719aa7) feat: button;icons;config +* [`db30f50`](https://github.com/siderolabs/omni/commit/db30f503730bdbd8ed359d4070dea0214df67fcd) fix: add `frontend/node_modules` to gitignore +* [`a675b86`](https://github.com/siderolabs/omni/commit/a675b86f7d55cecd4ae1277cbf057a6bc264940c) fix: properly pass label selector to the metadata in ClusterListItem +* [`7911d6a`](https://github.com/siderolabs/omni/commit/7911d6a31abdb51e86586a025b705ddfeb1dd19e) chore: add ability to start local development server for the frontend +* [`076fee1`](https://github.com/siderolabs/omni/commit/076fee10c6583dc49e6530b02cab1f757da0e853) feat: use CAPI utils for CAPI requests +* [`5ed5ba2`](https://github.com/siderolabs/omni/commit/5ed5ba2a122585a97cf65c3ff081126752cd26fa) fix: more websocket client bugfixes +* [`6fe22ad`](https://github.com/siderolabs/omni/commit/6fe22ad370026380ba75b38e261870addc341e6f) fix: reset reconnect timeouts after the client is reconnected +* [`c4b144a`](https://github.com/siderolabs/omni/commit/c4b144af272a46dbdc8d1bb35784e09ba1b79987) fix: talosconfig/kubeconfig when using the default context +* [`b439a37`](https://github.com/siderolabs/omni/commit/b439a371c13a8d46d986a1dae3d6f4b7cba4a298) fix: properly handle Same-Origin header in websockets +* [`ffffed1`](https://github.com/siderolabs/omni/commit/ffffed100cec18209bae723b9919eb8613950649) fix: read node name from nodename resource instead of hostname +* [`2d6f984`](https://github.com/siderolabs/omni/commit/2d6f9844440a6d18b3093dea6228ac6a237dc86b) fix: use secure websockets if the page itself is using https +* [`799f2d2`](https://github.com/siderolabs/omni/commit/799f2d2d00762d5270dd4a3f4b4b312b32dbb7dd) feat: rework the node overview page +* [`0d0eaf4`](https://github.com/siderolabs/omni/commit/0d0eaf4b2721dfa1b04bce24e4a1e476579e3a74) fix: make charts height resize depending on the screen height +* [`7de0101`](https://github.com/siderolabs/omni/commit/7de0101bf0e613653caadd5733db0e29a6bb5bfb) fix: use polyfill to fix streaming APIs on Firefox +* [`0cff2b0`](https://github.com/siderolabs/omni/commit/0cff2b02b5d8b2c2c644067cf6bd3ed573cb784d) feat: small UI adjustments +* [`d70bd41`](https://github.com/siderolabs/omni/commit/d70bd41992e13fb3dacc1740532083a8f6ce9afa) feat: implement accept Sidero server functional +* [`f3a6e16`](https://github.com/siderolabs/omni/commit/f3a6e16a79e1bca9ea6c87eb0d3e0f2a6c65ff2e) feat: add top processes list to the Overview page +* [`3cf97e4`](https://github.com/siderolabs/omni/commit/3cf97e4b9e07f8383da8a6fb7a993b70c8f82503) refactor: use the same object for gRPC metadata context and messages +* [`243206f`](https://github.com/siderolabs/omni/commit/243206f95aa6ba944bd4361db6274e7072bae1fc) release(v0.1.0-alpha.2): prepare release +* [`e5b6f29`](https://github.com/siderolabs/omni/commit/e5b6f29fd298904e06284a67681cc0ce5135145f) feat: implement node Reset +* [`bcb7d23`](https://github.com/siderolabs/omni/commit/bcb7d237c31f42a35f5c3b53e7615ddae1ce0a8b) fix: node IP not being truncated +* [`e576d33`](https://github.com/siderolabs/omni/commit/e576d33ba40f629eed14668f2d9bf77d7fef62c2) feat: add upgrade UI for CAPI clusters +* [`10cdce7`](https://github.com/siderolabs/omni/commit/10cdce7fcc219af969a85a41d18fb904936faa0a) fix: server labels key/value order and chevron orientation +* [`4007177`](https://github.com/siderolabs/omni/commit/40071775d6de1eea697f67e55441c384c86e75d9) feat: implement Kubernetes upgrade UI components +* [`f4917ee`](https://github.com/siderolabs/omni/commit/f4917eecfb3173acf7518883c738118c8537d657) fix: accumulate chart updates into a single update +* [`414d76c`](https://github.com/siderolabs/omni/commit/414d76c1c926695e5d66787b34decae92e151b45) feat: implement upgrade controller +* [`36742ea`](https://github.com/siderolabs/omni/commit/36742ea5ab1e8a983b73f73443c1cf122a90d054) feat: introduce create, delete and update gRPC APIs +* [`2b3d314`](https://github.com/siderolabs/omni/commit/2b3d314a460b385d8c13bdd025fadb37b5508bdc) feat: install internal COSI runtime alongside with K8s and Talos +* [`ae7f784`](https://github.com/siderolabs/omni/commit/ae7f784d08621d18075b1763f026a7513d9d9dcb) refactor: move all generated TypeScript files under `frontend/src/api` +* [`61bad64`](https://github.com/siderolabs/omni/commit/61bad64540c28fb0520a39a6c64d64c3e9353361) release(v0.1.0-alpha.1): prepare release +* [`8e5e722`](https://github.com/siderolabs/omni/commit/8e5e7229470713d2fbd5ad0df027bd825f5481e3) feat: implement node reboot controls +* [`9765a88`](https://github.com/siderolabs/omni/commit/9765a88069f05c49f5a7d854675ee37e1c7a8273) feat: dmesg logs page +* [`ecbbd67`](https://github.com/siderolabs/omni/commit/ecbbd67936b1fb570d706fe3b93b81f6089b5124) feat: use updated timestamp to display event time on the graph +* [`7c56773`](https://github.com/siderolabs/omni/commit/7c56773448a496fe1ceeec3c47978975ce336b3a) refactor: use Metadata to pass context in all gRPC calls +* [`abb4733`](https://github.com/siderolabs/omni/commit/abb47330222217d7d8b5c36ff28902415bc755d8) feat: implement service logs viewer +* [`8e8e032`](https://github.com/siderolabs/omni/commit/8e8e032b20d082bfd71a26c2af2bbc821d9c2a7b) feat: add ability to pick sort order on the servers page +* [`1a1c728`](https://github.com/siderolabs/omni/commit/1a1c728ac929bb02db7f1bd0b991a747e63fe81a) fix: resolve the issue with idFn value generating undefined ids +* [`2e83fe2`](https://github.com/siderolabs/omni/commit/2e83fe23a7feb51b73bc7b53997636b641ae42b9) feat: allow filtering servers by picking from predefined categories +* [`48f776e`](https://github.com/siderolabs/omni/commit/48f776e10f6c79772481393d7397557419520046) fix: navigate home when changing the context +* [`a1ce0ca`](https://github.com/siderolabs/omni/commit/a1ce0ca8c8fabb2267c3dc6f6b1509f131e18ba8) fix: resolve services search issues +* [`5b768f8`](https://github.com/siderolabs/omni/commit/5b768f85277ee31131994ae0b253700a5d26978d) feat: make stacked lists searchable +* [`ec1bc5b`](https://github.com/siderolabs/omni/commit/ec1bc5b48943e473c756ebc7a8c943a34cdeaeac) feat: implement stats component and add stats to the servers page +* [`1a85999`](https://github.com/siderolabs/omni/commit/1a8599981f93fc5ce68e23b1b4cd7aabbb43c90c) feat: align Sidero servers list outlook with the wireframes +* [`524264c`](https://github.com/siderolabs/omni/commit/524264c515a9efdce9f06a3c2ebd59c2979f9b2a) fix: display error message and use proper layout for the spinner +* [`5263d16`](https://github.com/siderolabs/omni/commit/5263d16cfb936aad9ba461e0cc7b150ff9b806d5) feat: introduce node stats page +* [`8feb35e`](https://github.com/siderolabs/omni/commit/8feb35e95a6d588e1d9c605231308976be452a2e) feat: make root sidebar sections collapsible +* [`36ad656`](https://github.com/siderolabs/omni/commit/36ad656a3bbdc1e2915a87c0d09c31738ae3f3c4) feat: detect cluster capabilities +* [`a25d90d`](https://github.com/siderolabs/omni/commit/a25d90d58a85b3b73432858f134fa09cd1338d5c) feat: support switching context in the UI +* [`67903e2`](https://github.com/siderolabs/omni/commit/67903e23f49623ae9a9a6b297282c62aa8579aa8) refactor: separate Watch from StackedList +* [`76b9e1d`](https://github.com/siderolabs/omni/commit/76b9e1dc88cccf74cebb28470eae5e9249809d40) release(v0.1.0-alpha.0): prepare release +* [`7bde4c8`](https://github.com/siderolabs/omni/commit/7bde4c8c6e16c197578cbb4e037a05d50194958f) fix: cobra command was initialized but not actually used +* [`04624c9`](https://github.com/siderolabs/omni/commit/04624c95cec587ae0b0d8888d95d484ef8d98cfa) feat: support getting Talos and Kubernetes client configs for a cluster +* [`219b9c8`](https://github.com/siderolabs/omni/commit/219b9c8663fe03af65796b0b6299cff5e66b3efc) feat: implement notifications component +* [`f8b19a0`](https://github.com/siderolabs/omni/commit/f8b19a0585e6e19c0e7da4e4afad5bbd264e0029) feat: decouple watch list from the view +* [`2f8c96e`](https://github.com/siderolabs/omni/commit/2f8c96e44012e7bd0db9869eeb90ab48ff41e162) feat: implement appearance settings modal window +* [`de745d6`](https://github.com/siderolabs/omni/commit/de745d6b7170a9c509cc835a8b675a1c788e80f4) feat: implement Talos runtime backend +* [`af69a0d`](https://github.com/siderolabs/omni/commit/af69a0d58906a86974bc7dbec2c09ca9f78b152f) feat: support getting Kubernetes resource through gRPC gateway +* [`2c50010`](https://github.com/siderolabs/omni/commit/2c50010b0d9f7b168354fedd698600d94123c354) feat: implement breadcrumbs component, add support for table header +* [`3fc1e80`](https://github.com/siderolabs/omni/commit/3fc1e808875f6f502cd2657c4548dd886fbf465d) feat: implement nodes view +* [`961e93a`](https://github.com/siderolabs/omni/commit/961e93a4af430eaa9efcd1e2922af8072fe4cf85) feat: implement clusters view +* [`e8248ff`](https://github.com/siderolabs/omni/commit/e8248ffab89633cae8834631e39cf4dce5e4147a) feat: use plain zap instead of SugaredLogger everywhere +* [`81ba93d`](https://github.com/siderolabs/omni/commit/81ba93dffdc37efdde06557a1c63511a7d61b2f2) chore: generate websocket protocol messages using protobuf +* [`37a878d`](https://github.com/siderolabs/omni/commit/37a878dd396b650df8afaf6730f9afe52d35569c) feat: make JS websocket reconnect on connection loss +* [`23b3281`](https://github.com/siderolabs/omni/commit/23b3281f8880800a9084e1c8a74617fcf966c846) feat: use dynamic watcher to allow listing any kinds of resources +* [`16475f5`](https://github.com/siderolabs/omni/commit/16475f51cc9651736213b36c57381b24dcabdc62) feat: implement real time update server on top of web sockets +* [`76b39ae`](https://github.com/siderolabs/omni/commit/76b39ae563d9f09ecac3451389e3d260abdad48d) feat: create hello world Vue app using Kres +* [`baab493`](https://github.com/siderolabs/omni/commit/baab493f155cbd78c2e8af6ce45268c40ef6aeed) Initial commit +</p> +</details> + +### Changes since v0.1.0-alpha.0 +<details><summary>81 commits</summary> +<p> + +* [`8b284f3`](https://github.com/siderolabs/omni/commit/8b284f3aa26cf8a34452f33807dcc04045e7a098) feat: implement Kubernetes API OIDC proxy and OIDC server +* [`adad8d0`](https://github.com/siderolabs/omni/commit/adad8d0fe2f3356e97de613104196233a3b98ff5) refactor: rework LoadBalancerConfig/LoadBalancerStatus resources +* [`08e2cb4`](https://github.com/siderolabs/omni/commit/08e2cb4fd40ec918bf458edd6a5d8e6c86fe5c97) feat: support editing config patches on cluster and machine set levels +* [`e2197c8`](https://github.com/siderolabs/omni/commit/e2197c83e994afb435671f5af5cdefa843bbddb5) test: e2e testing improvements +* [`ec9051f`](https://github.com/siderolabs/omni/commit/ec9051f6dfdf1f5acaf3fa6766dc1195b6f6dcdd) fix: config patching +* [`e2a1d6c`](https://github.com/siderolabs/omni/commit/e2a1d6c78809eaa4168ca5ede433824797a6aa4e) fix: send logs in JSON format by default +* [`954dd70`](https://github.com/siderolabs/omni/commit/954dd70b935b7c373ba5830fd7ad6e965f6b0da8) chore: replace talos-systems depedencies with siderolabs +* [`acf94db`](https://github.com/siderolabs/omni/commit/acf94db8ac80fb6f15cc87ff276b7edca0cb8661) chore: add payload logger +* [`838c716`](https://github.com/siderolabs/omni/commit/838c7168c64f2296a9e01d3ef6ab4feb9f16aeb9) fix: allow time skew on validating the public keys +* [`dd481d6`](https://github.com/siderolabs/omni/commit/dd481d6cb3620790f6e7a9c8e305defb507cbe5f) fix: refactor runGRPCProxy in router tests to catch listener errors +* [`e68d010`](https://github.com/siderolabs/omni/commit/e68d010685d4f0a5d25fee671744119cecf6c27b) chore: small fixes +* [`ad86875`](https://github.com/siderolabs/omni/commit/ad86875ec146e05d7d7f461bf7c8094a8c143df5) feat: minor adjustments on the cluster create page +* [`e61f194`](https://github.com/siderolabs/omni/commit/e61f1943e965287c79fbaef05760bb0b0deee988) chore: implement debug handlers with controller dependency graphs +* [`cbbf901`](https://github.com/siderolabs/omni/commit/cbbf901e601d31c777ad2ada0f0036c57020ba96) refactor: use generic TransformController more +* [`33f9f2c`](https://github.com/siderolabs/omni/commit/33f9f2ce3ec0999198f311ae4bae9b58e57153c9) chore: remove reflect from runtime package +* [`6586963`](https://github.com/siderolabs/omni/commit/65869636aa33013b5feafb06e727b9d2a4cf1c19) feat: add scopes to users, rework authz & add integration tests +* [`bb355f5`](https://github.com/siderolabs/omni/commit/bb355f5c659d8c66b825de409d9446767005a2bb) fix: reload the page to init the UI Authenticator on signature fails +* [`c90cd48`](https://github.com/siderolabs/omni/commit/c90cd48eefa7f29328a456aa5ca474eece17c6fe) chore: log auth context +* [`d278780`](https://github.com/siderolabs/omni/commit/d2787801a4904fe895996e5319f301a1d7ca76df) fix: update Clusters page UI +* [`5e77607`](https://github.com/siderolabs/omni/commit/5e776072285e535e93c0458774dcad810b9b857a) tests: abort on first failure +* [`4c55980`](https://github.com/siderolabs/omni/commit/4c5598083ff6d8763c8763d8e46a3d7b659784ff) chore: get full method name from the service +* [`2194f43`](https://github.com/siderolabs/omni/commit/2194f4391607e6e73bce1917d2744e78fdd2cebc) feat: redesign cluster list view +* [`40b3f23`](https://github.com/siderolabs/omni/commit/40b3f23071096987e8a7c6f30a2622c317c190cb) chore: enable gRPC request duration histogram +* [`0235bb9`](https://github.com/siderolabs/omni/commit/0235bb91a71510cf4d349eedd3625b119c7e4e11) refactor: make sure Talos/Kubernetes versions are defined once +* [`dd6154a`](https://github.com/siderolabs/omni/commit/dd6154a45d5dcd14870e0aa3f97aa1d4e53bdcfb) chore: add public key pruning +* [`68908ba`](https://github.com/siderolabs/omni/commit/68908ba330ecd1e285681e24db4b9037eb2e8202) fix: bring back UpgradeInfo API +* [`f1bc692`](https://github.com/siderolabs/omni/commit/f1bc692c9125f7683fe5f234b03eb3521ba7e773) refactor: drop dependency on Talos Go module +* [`0e3ef43`](https://github.com/siderolabs/omni/commit/0e3ef43cfed68e53879e6c22b46e7d0568ddc05f) feat: implement talosctl access via Omni +* [`2b0014f`](https://github.com/siderolabs/omni/commit/2b0014fea15da359217f89ef723965dcc9faa739) fix: provide a way to switch the user on the authenticate page +* [`e295d7e`](https://github.com/siderolabs/omni/commit/e295d7e2854ac0226e7efda32864f6a687a88470) chore: refactor all controller tests to use assertResource function +* [`8251dfb`](https://github.com/siderolabs/omni/commit/8251dfb9e44341e9df9471f387cc76c91359cf84) refactor: extract PGP client key handling +* [`02da9ee`](https://github.com/siderolabs/omni/commit/02da9ee66f15462e6f4d7da18515651a5fde11aa) refactor: use extracted go-api-signature library +* [`4bc3db4`](https://github.com/siderolabs/omni/commit/4bc3db4dcbc14e0e51c7a3b5257686b671cc2823) fix: drop not working upgrade k8s functional +* [`17ca75e`](https://github.com/siderolabs/omni/commit/17ca75ef864b7a59f9c6f829de19cc9630a670c0) feat: add 404 page +* [`8dcde2a`](https://github.com/siderolabs/omni/commit/8dcde2af3ca49d9be16cc705c0b403826f2eee5d) feat: implement logout flow in the frontend +* [`ba766b9`](https://github.com/siderolabs/omni/commit/ba766b9922302b9d1f279b74caf94e6ca727f86f) fix: make `omnictl` correctly re-auth on invalid key +* [`fd16f87`](https://github.com/siderolabs/omni/commit/fd16f8743d3843e8ec6735a7c2e96532694b876e) fix: don't set timeout on watch gRPC requests +* [`8dc3cc6`](https://github.com/siderolabs/omni/commit/8dc3cc682e5419c3824c6e740a32085c386b8817) fix: don't use `omni` in external names +* [`2513661`](https://github.com/siderolabs/omni/commit/2513661578574255ca3f736d3dfa1f307f5d43b6) fix: reset `Error` field of the `MachineSetStatus` +* [`b611e99`](https://github.com/siderolabs/omni/commit/b611e99e14a7e2ebc64c55ed5c95a47e17d6ac32) fix: properly handle `Forbidden` errors on the authentication page +* [`8525502`](https://github.com/siderolabs/omni/commit/8525502265b10dc3cc056d301785f6f60e4f7e22) fix: stop runners properly and clean up StatusMachineSnapshot +* [`ab0190d`](https://github.com/siderolabs/omni/commit/ab0190d9a41b830daf60173b998acdbcbbdd3754) feat: implement scopes and enforce authorization +* [`9198d96`](https://github.com/siderolabs/omni/commit/9198d96ea9d57bb5949c59350aec42b2ce13ebac) feat: sign gRPC requests on the frontend to enable Authentication flow +* [`bdd8f21`](https://github.com/siderolabs/omni/commit/bdd8f216a9eca7ec657fa0dc554e663743f058d1) chore: remove reset button and fix padding +* [`362db57`](https://github.com/siderolabs/omni/commit/362db570349b4a2659f746ce18a436d684481ecb) fix: gRPC verifier should verify against original JSON payload +* [`30186b8`](https://github.com/siderolabs/omni/commit/30186b8cfe2eea6eaade8bacf31114886d3da3ea) fix: omnictl ignoring omniconfig argument +* [`e8ab0ba`](https://github.com/siderolabs/omni/commit/e8ab0ba45648b8f521500b46fe032797da6a111f) fix: do not attempt to execute failed integration test again +* [`9fda25e`](https://github.com/siderolabs/omni/commit/9fda25ef45f0060cc6c3ec812f5fa1c7b1015801) chore: add more info on errors to different controllers +* [`ccda526`](https://github.com/siderolabs/omni/commit/ccda5260c4645b5929724574a9f856eeaa4c232f) chore: bump grpc version +* [`b1ac125`](https://github.com/siderolabs/omni/commit/b1ac1255da5ca4b5d9c409e27c51e4298275e73c) chore: emit log when we got machine status event. +* [`005d257`](https://github.com/siderolabs/omni/commit/005d257c25c745b61e5a25c39167d511710562c7) chore: set admin role specifically for Reboot request. +* [`27f0e30`](https://github.com/siderolabs/omni/commit/27f0e309cec76a454e5bb24c2df1e62d9e4718e0) chore: update deps +* [`77f0219`](https://github.com/siderolabs/omni/commit/77f02198c1e7fb215548f3a0e2be30a0e19aaf6d) test: more unit-tests for auth components +* [`0bf6ddf`](https://github.com/siderolabs/omni/commit/0bf6ddfa46e0ea6ad255ede00a600c390344e221) fix: pass through HTTP request if auth is disabled +* [`4f3a67b`](https://github.com/siderolabs/omni/commit/4f3a67b08e03a1bad65c2acb8d65f0281fdd2f9e) fix: unit-tests for auth package and fixes +* [`e3390cb`](https://github.com/siderolabs/omni/commit/e3390cbbac1d0e78b72512c6ebb64a8f53dcde17) chore: rename arges-theila to omni +* [`14d2614`](https://github.com/siderolabs/omni/commit/14d2614538ec696d468a0850bd4ee7bc6884c3b1) chore: allow slashes in secretPath +* [`e423edc`](https://github.com/siderolabs/omni/commit/e423edc072714e7f693249b60079f5f700cc0a65) fix: add unit-tests for auth message and fix issues +* [`b5cfa1a`](https://github.com/siderolabs/omni/commit/b5cfa1a84e93b6bbf5533c599917f293fc5cdf66) feat: add vault client +* [`b47791c`](https://github.com/siderolabs/omni/commit/b47791ce303cbb9a8aab279685d17f92a480c7f4) feat: sign grpc requests on cli with pgp key & verify it on server +* [`d6ef4d9`](https://github.com/siderolabs/omni/commit/d6ef4d9c36758cb0091e2c528b848952f312941a) feat: split account ID and name +* [`e412e1a`](https://github.com/siderolabs/omni/commit/e412e1a69edad0d19d7e46fa3aa076dcb8e6d4b6) chore: workaround the bind problem +* [`e23cc59`](https://github.com/siderolabs/omni/commit/e23cc59bb8cb8f9df81738d4c58aed08d80fa9c4) chore: bump minimum Talos version to v1.2.4 +* [`0638a29`](https://github.com/siderolabs/omni/commit/0638a29d78c092641573aa2b8d2e594a7ff6aab4) feat: stop using websockets +* [`8f3c19d`](https://github.com/siderolabs/omni/commit/8f3c19d0f0ecfbe5beabc7dc508dcafa720e83e2) feat: update install media to be identifiable +* [`70d1e35`](https://github.com/siderolabs/omni/commit/70d1e354466618bb07c13445a16ca639be12009e) feat: implement resource encryption +* [`7653638`](https://github.com/siderolabs/omni/commit/76536386499889994b65f66a8a40f18b5535c5ba) fix: fix NPE in integration tests +* [`e39849f`](https://github.com/siderolabs/omni/commit/e39849f4047f028251123781bd8be350ebbfd65d) chore: update Makefile and Dockerfile with kres +* [`4709473`](https://github.com/siderolabs/omni/commit/4709473ec20fbf92a3240fb3376a322f1321103a) fix: return an error if external etcd client fails to be built +* [`5366661`](https://github.com/siderolabs/omni/commit/536666140556ba9b997a2b5d4441ea4b5f42d1c5) refactor: use generic transform controller +* [`a2a5f16`](https://github.com/siderolabs/omni/commit/a2a5f167f21df6375767d018981651d60bb2f768) feat: limit access to Talos API via Omni to `os:reader` +* [`e254201`](https://github.com/siderolabs/omni/commit/e2542013938991faa8f1c521fc524b8fcf31ea34) feat: merge internal/external states into one +* [`3258ca4`](https://github.com/siderolabs/omni/commit/3258ca487c818a34924f138640f44a2e51d307fb) feat: add `ControlPlaneStatus` controller +* [`1c0f286`](https://github.com/siderolabs/omni/commit/1c0f286a28f5134333130708d031dbfa11051a42) refactor: use `MachineStatus` Talos resource +* [`0a6b19f`](https://github.com/siderolabs/omni/commit/0a6b19fb916ea301a8f5f6ccd9bbdaa7cb4c39e0) chore: drop support for Talos resource API +* [`ee5f6d5`](https://github.com/siderolabs/omni/commit/ee5f6d58a2b22a87930d3c8bb9963f71c92f3908) feat: add auth resource types & implement CLI auth +* [`36736e1`](https://github.com/siderolabs/omni/commit/36736e14e5c837d38568a473834d14073b88a153) fix: use correct protobuf URL for cosi resource spec +* [`b98c56d`](https://github.com/siderolabs/omni/commit/b98c56dafe33beef7792bd861ac4e637fe13c494) feat: bump minimum version for Talos to v1.2.3 +* [`b93bc9c`](https://github.com/siderolabs/omni/commit/b93bc9cd913b017c66502d96d99c52e4d971e231) chore: move containers and optional package to the separate module +* [`e1af4d8`](https://github.com/siderolabs/omni/commit/e1af4d8a0bee31721d8946ef452afe04da6b494d) chore: update COSI to v0.2.0-alpha.1 +* [`788dd37`](https://github.com/siderolabs/omni/commit/788dd37c0be32745547ee8268aa0f004041dc96f) feat: implement and enable by default etcd backend +</p> +</details> + +### Dependency Changes + +This release has no dependency changes + +## [Omni 0.1.0-alpha.0](https://github.com/siderolabs/arges-theila/releases/tag/v0.1.0-alpha.0) (2022-09-19) + +Welcome to the v0.1.0-alpha.0 release of Omni! +*This is a pre-release of Omni* + + + +Please try out the release binaries and report any issues at +https://github.com/siderolabs/arges-theila/issues. + +### Contributors + +* Artem Chernyshev +* Artem Chernyshev +* Andrey Smirnov +* Philipp Sauter +* evgeniybryzh +* Dmitriy Matrenichev +* Utku Ozdemir +* Noel Georgi +* Andrew Rynhard +* Andrew Rynhard +* Gerard de Leeuw +* Steve Francis +* Tim Jones +* Volodymyr Mazurets + +### Changes +<details><summary>267 commits</summary> +<p> + +* [`8a9c4f1`](https://github.com/siderolabs/arges-theila/commit/8a9c4f17ed6ee0d8e4a51b466d60a8278cd50f9c) feat: implement CLI configuration file (omniconfig) +* [`b0c92d5`](https://github.com/siderolabs/arges-theila/commit/b0c92d56da00529c106f042399c1163375046785) feat: implement etcd audit controller +* [`0e993a0`](https://github.com/siderolabs/arges-theila/commit/0e993a0977c711fb8767e3de2ad828fd5b9e688f) feat: properly support scaling down the cluster +* [`264cdc9`](https://github.com/siderolabs/arges-theila/commit/264cdc9e015fd87724c7a07128d1136153732540) refactor: prepare for etcd backend integration +* [`b519d17`](https://github.com/siderolabs/arges-theila/commit/b519d17971bb1c919286813b4c2465c2f5803a03) feat: show version in the UI +* [`a2fb539`](https://github.com/siderolabs/arges-theila/commit/a2fb5397f9efb22a1354c5675180ca49537bee55) feat: keep track of loadbalancer health in the controller +* [`4789c62`](https://github.com/siderolabs/arges-theila/commit/4789c62af0d1694d8d0a492cd6fb7d436e213fe5) feat: implement a new controller that can gather cluster machine data +* [`bd3712e`](https://github.com/siderolabs/arges-theila/commit/bd3712e13491ede4610ab1452ae85bde6d92b2db) fix: populate machine label field in the patches created by the UI +* [`ba70b4a`](https://github.com/siderolabs/arges-theila/commit/ba70b4a48623939d31775935bd0338c0d60ab65b) fix: rename to Omni, fix workers scale up, hide join token +* [`47b45c1`](https://github.com/siderolabs/arges-theila/commit/47b45c129160821576d808d9a46a9ec5d14c6469) fix: correct filenames for Digital Ocean images +* [`9d217cf`](https://github.com/siderolabs/arges-theila/commit/9d217cf16d432c5194110ae16a566b44b02a567e) feat: introduce new resources, deprecate `ClusterMachineTemplate` +* [`aee153b`](https://github.com/siderolabs/arges-theila/commit/aee153bedb2f7856913a54b282603b07bf20059b) fix: address style issue in the Pods paginator +* [`752dd44`](https://github.com/siderolabs/arges-theila/commit/752dd44ac42c95c644cad5640f6b2c5536a29676) chore: update Talos machinery to 1.2.0 and use client config struct +* [`88d7079`](https://github.com/siderolabs/arges-theila/commit/88d7079a6656605a1a8dfed56d392414583a283e) fix: regenerate sources from proto files that were rolled back. +* [`84062c5`](https://github.com/siderolabs/arges-theila/commit/84062c53417197417ff636a667289342089f390c) chore: update Talos to the latest master +* [`5a139e4`](https://github.com/siderolabs/arges-theila/commit/5a139e473abcdf7fd25ad7c61dad8cbdc964a453) fix: properly route theila internal requests in the gRPC proxy +* [`4be4fb6`](https://github.com/siderolabs/arges-theila/commit/4be4fb6a4e0bca29b32e1b732c227c9e7a0b1f43) feat: add support for 'talosconfig' generation +* [`9235b8b`](https://github.com/siderolabs/arges-theila/commit/9235b8b522d4bc0712012425b68ff89e455886b9) fix: properly layer gRPC proxies +* [`9a516cc`](https://github.com/siderolabs/arges-theila/commit/9a516ccb5c892ed8fe41f7cf69aaa5bb1d3fa471) fix: wait for selector of 'View All' to render in e2e tests. +* [`3cf3aa7`](https://github.com/siderolabs/arges-theila/commit/3cf3aa730e7833c0c1abe42a6afb87a85f14b58c) fix: some unhandled errors in the e2e tests. +* [`c32c7d5`](https://github.com/siderolabs/arges-theila/commit/c32c7d55c92007aa1aa10feab3c7a7de2b2afc42) fix: ignore updating cluster machines statuses without machine statuses +* [`4cfa307`](https://github.com/siderolabs/arges-theila/commit/4cfa307b85b410b44e482b259d14670b55e4a237) chore: run rekres, fix lint errors and bump Go to 1.19 +* [`eb2d449`](https://github.com/siderolabs/arges-theila/commit/eb2d4499f1a3da7bc1552a6b099c28bed6fd0e4d) fix: skip the machines in `tearingDown` phase in the controller +* [`9ebc769`](https://github.com/siderolabs/arges-theila/commit/9ebc769b89a2bab37fd081e555f84e3e4c99187e) fix: allow all services to be proxied by gRPC router +* [`ea2b01d`](https://github.com/siderolabs/arges-theila/commit/ea2b01d0a0e054b259d710317fe368882534cf4c) fix: properly handle non empty resource id in the K8s resource watch +* [`3bb7da3`](https://github.com/siderolabs/arges-theila/commit/3bb7da3a0fa6b746f6a7b9aa668e055bdf825e6a) feat: show a Cluster column in the Machine section +* [`8beb70b`](https://github.com/siderolabs/arges-theila/commit/8beb70b7f045a218f9cb753e1402a07542b0bf1c) fix: ignore tearing down clusters in the `Cluster` migrations +* [`319d4e7`](https://github.com/siderolabs/arges-theila/commit/319d4e7947cb78135f5a14c02afe5814c56a312c) fix: properly handle `null` memory modules list +* [`6c2120b`](https://github.com/siderolabs/arges-theila/commit/6c2120b5ae2bd947f473d002dfe165646032e811) chore: introduce migrations manager for COSI DB state +* [`ec52139`](https://github.com/siderolabs/arges-theila/commit/ec521397946cc15929472feb7c45435fb48df848) fix: filter out invalid memory modules info coming from Talos nodes +* [`8e87031`](https://github.com/siderolabs/arges-theila/commit/8e870313a3a31d052eecf81acb522433ff98ae79) fix: bump loadbalancer timeout settings +* [`bc0ed26`](https://github.com/siderolabs/arges-theila/commit/bc0ed2672064a6bf148cd9799b35a2790f5aa7f6) feat: introduce websocket, HTTP requests monitoring +* [`857401f`](https://github.com/siderolabs/arges-theila/commit/857401f54e3922a9ab85d7dc703a5afb70c6ee45) feat: add HTTP logging (static, gateway), and websocket logging +* [`eb612a3`](https://github.com/siderolabs/arges-theila/commit/eb612a38e9c71913ebecc9f345e17844d60800b8) fix: do hard stop of events sink gRPC server after 5 seconds +* [`3162513`](https://github.com/siderolabs/arges-theila/commit/31625135e2b971d6b9f92eb4096c010113030a80) fix: populate nodes filter dropdown properly and rewrite filter function +* [`5713a51`](https://github.com/siderolabs/arges-theila/commit/5713a516391a5190fac9b7044a9f71952ce15479) fix: make `TSelectList` search filter the items in the dropdown +* [`f2519ff`](https://github.com/siderolabs/arges-theila/commit/f2519ff51b88766a907f1d7717ef74031157fd56) feat: don't allow using nodes with not enough mem for the cluster +* [`9e474d6`](https://github.com/siderolabs/arges-theila/commit/9e474d69c76a898fc5b6fcd9fdc8e87f25b7dc53) feat: show disconnected warning in the machines list +* [`fa52b48`](https://github.com/siderolabs/arges-theila/commit/fa52b48f54362c7305681ca79a7d98237531f2b4) feat: redesign Installation Media selection menu +* [`01e301a`](https://github.com/siderolabs/arges-theila/commit/01e301a875699cf6fcc887cb31cd7939338f58e9) fix: query node list using `talosctl get members` instead of K8s nodes +* [`e694df5`](https://github.com/siderolabs/arges-theila/commit/e694df59c50fbee356a48c94ade95e924ea46bb2) fix: display all available Talos versions on cluster create page +* [`7a87525`](https://github.com/siderolabs/arges-theila/commit/7a87525ed1b928a8f8e3e6a39feb4c19009ec264) fix: use `v-model` instead of callbacks in the inputs +* [`d681f5f`](https://github.com/siderolabs/arges-theila/commit/d681f5f58788612f144fa1f8d90ec6c996badb0e) feat: support scaling up the clusters +* [`e992b95`](https://github.com/siderolabs/arges-theila/commit/e992b9574d7b8f76497f46e25764618ec274af1a) feat: show notification on image download progress +* [`8ea6d9f`](https://github.com/siderolabs/arges-theila/commit/8ea6d9f1724b271919e538ed55ff6582858470f9) fix: probably fix 'context canceled' on image download +* [`692612b`](https://github.com/siderolabs/arges-theila/commit/692612b7e628588fa7608cff683c5af406f24ca7) fix: improve the Talos image generation process +* [`a69c140`](https://github.com/siderolabs/arges-theila/commit/a69c140e26f4298fcaafb1f96c389269992fc069) feat: introduce Prometheus metrics +* [`e90ca78`](https://github.com/siderolabs/arges-theila/commit/e90ca7875c501391f860f5df9f2a4e4f8e2f2d7a) fix: make grpc api listen only on siderolink interface +* [`99fc28c`](https://github.com/siderolabs/arges-theila/commit/99fc28c36c62a8d8c654c05f9b9c64ff37cedba8) fix: display correct cluster/machine status on ui +* [`eaf7655`](https://github.com/siderolabs/arges-theila/commit/eaf7655395401cd88e6bd47f4f8aa958abee30f1) fix: add a pause before integration tests +* [`19ff1c9`](https://github.com/siderolabs/arges-theila/commit/19ff1c909bedf63fe6cf2f5cc0e44f34046ca568) chore: rename download button +* [`e1c4e1b`](https://github.com/siderolabs/arges-theila/commit/e1c4e1b171eab08585a3315ca5838c88a4d2eb24) feat: add download options for all talos images +* [`24e7863`](https://github.com/siderolabs/arges-theila/commit/24e786369bfc0bb4966712296395db91751e657b) fix: delete cached clients from gRPC proxy when the cluster is destroyed +* [`58c89ef`](https://github.com/siderolabs/arges-theila/commit/58c89ef3fe621ef6909c5d38a0d47cc861667f45) feat: implement `argesctl delete` command +* [`3c99b49`](https://github.com/siderolabs/arges-theila/commit/3c99b49a9b680b091d92455a0d3bc325f8f68ca6) test: add a test which removes allocated machine +* [`75dd28f`](https://github.com/siderolabs/arges-theila/commit/75dd28f56d7ce9a92b96822a867fbfe2655cd0fa) chore: fill in resource definitions for table headers +* [`028f168`](https://github.com/siderolabs/arges-theila/commit/028f16886c41b7aa7eafb65308cc4adf4d624037) feat: End-to-end tests with playwright +* [`6be6b36`](https://github.com/siderolabs/arges-theila/commit/6be6b3605583ce8e8068746624ca86ed6adc37af) chore: bump goimports from 0.1.10 to 0.1.11 and node from 18.5.0 to 18.6.0 +* [`af4da08`](https://github.com/siderolabs/arges-theila/commit/af4da086d4b709f504eda7909a36a8f0cf84e480) test: implement kernel log streaming test +* [`1eacfee`](https://github.com/siderolabs/arges-theila/commit/1eacfee2c1084040ae2201eba957409218a92c66) feat: implement argesctl machine-logs output in 'zap-like' and 'dmesg' form. +* [`96ab7ab`](https://github.com/siderolabs/arges-theila/commit/96ab7ab8317898dd45d129d5cecd2aaf1d379fba) chore: ignore memory modules with zero size +* [`fd0575f`](https://github.com/siderolabs/arges-theila/commit/fd0575ff4050702c9d07e34c7d9d5596b4ad7311) chore: retrieve k8s versions from github registry +* [`8651527`](https://github.com/siderolabs/arges-theila/commit/86515275a77741bacc790d2006f3671a5cfb27c6) feat: redo errgroup to return error on first nil error +* [`944222d`](https://github.com/siderolabs/arges-theila/commit/944222d06607079b5d982afe4b19fc1dda7f1ec2) fix: show ClusterMachineStatus.Stage in 'Clusters' view +* [`f3f6b6e`](https://github.com/siderolabs/arges-theila/commit/f3f6b6eecd3ffc13b69845dff50d2e8ab31bc0d2) chore: refactor run method and no longer ignore log receiver listener errors +* [`b316377`](https://github.com/siderolabs/arges-theila/commit/b316377b277f87a184b969b3bbf20ebe6047a0a8) chore: rename 'Dmesg' to 'Console' +* [`19ee857`](https://github.com/siderolabs/arges-theila/commit/19ee8578a6f1c1bf742699d1b5720dc4c2674c82) test: add a way to recover deleted machines +* [`e5b5bdc`](https://github.com/siderolabs/arges-theila/commit/e5b5bdc39fa6f3812b15771366f942ddcbe7f328) fix: update SideroLink library for EEXIST fixes +* [`363de69`](https://github.com/siderolabs/arges-theila/commit/363de69a50b5c1e9d07fa42152cca935844d118b) fix: spec collector equality +* [`841f3b2`](https://github.com/siderolabs/arges-theila/commit/841f3b22aacc6d2875062ef324d900c5f2091f9d) feat: add ability to supply machine config patches on the machines +* [`907ca93`](https://github.com/siderolabs/arges-theila/commit/907ca93247267d80125866c2b60225ceca3ada27) test: fix link destroy test +* [`4c9f99d`](https://github.com/siderolabs/arges-theila/commit/4c9f99d32874cdaff1eb651bf6d74ef39167c273) fix: remove machine status if the machine is in tearing down phase +* [`d9747e5`](https://github.com/siderolabs/arges-theila/commit/d9747e552e52156a9baeae962a9478231e26c566) fix: make cluster machine status test more reliable +* [`3bfff3b`](https://github.com/siderolabs/arges-theila/commit/3bfff3bb0eea9d18956dee21aff7f3de900c6b82) fix: do not set up full theila runtime during clients tests +* [`4bf33bc`](https://github.com/siderolabs/arges-theila/commit/4bf33bc9d37404a733c5039784c80e92800fb3dc) fix: immediately fail the request if the cluster is down +* [`124a5c2`](https://github.com/siderolabs/arges-theila/commit/124a5c2947978e6bc86d1b19c9eacbcf7f870b53) fix: ensure the created date on resources is set +* [`14161bf`](https://github.com/siderolabs/arges-theila/commit/14161bf3dad4484868359d186d99d9198b6eed95) feat: add scale up integration test and minor log fixes +* [`7af06fd`](https://github.com/siderolabs/arges-theila/commit/7af06fd75959eb9e807680ac8a6ba4f0a7f59255) feat: make integration tests a subtests of one global test +* [`f7c1464`](https://github.com/siderolabs/arges-theila/commit/f7c1464a1002f63daab29b36d19ea16de0cd5794) feat: implement log receiver for logs from Talos +* [`5b800ea`](https://github.com/siderolabs/arges-theila/commit/5b800ea970215fb4e100ed7b3b73d7e218fd6d86) fix: accumulate bytes received/send in the link resource +* [`b3b1e9b`](https://github.com/siderolabs/arges-theila/commit/b3b1e9bbfbf62632dc0d8c2239a72793883101ce) feat: machine removal +* [`fb01bc4`](https://github.com/siderolabs/arges-theila/commit/fb01bc4b26c5b37f15bac923450e1f58fb7a3d89) fix: use Talos 1.2.0 +* [`3a50efe`](https://github.com/siderolabs/arges-theila/commit/3a50efe363c4724f369a02f672848ad7c284847c) feat: filter machines that can be added to cluster +* [`ba62db5`](https://github.com/siderolabs/arges-theila/commit/ba62db521b47049e92557bf8cfc5f737e496bf57) fix: properly parse `siderolink-api-advertised-url` if there's no port +* [`96f835a`](https://github.com/siderolabs/arges-theila/commit/96f835a91136f62d9dbdf5c1d1c46c729d57e51e) fix: properly display node selectors in FireFox +* [`12c20a4`](https://github.com/siderolabs/arges-theila/commit/12c20a42c9dfdea5f88e0e7942fbdb42ea543b95) fix: populate disks when machines are connected during cluster create +* [`0dc97f8`](https://github.com/siderolabs/arges-theila/commit/0dc97f8696a7c571d5318daf794700342e06f639) fix: adjust overview page to look closer to the mockups +* [`2b77af8`](https://github.com/siderolabs/arges-theila/commit/2b77af8d39e555970487c3265dfbd63412e90d2f) feat: add the chart showing the count of clusters +* [`a1dff65`](https://github.com/siderolabs/arges-theila/commit/a1dff6589d64207e6e7331d0407e7857f9c4079d) feat: implement ISO download with embedded kernel args +* [`37c03d8`](https://github.com/siderolabs/arges-theila/commit/37c03d8cb04b02e79f42e70eeea1e4368445604d) test: pull kubeconfig and interact with Kubernetes API +* [`75bfb08`](https://github.com/siderolabs/arges-theila/commit/75bfb08f0738fc9f67259caf12902db67860370f) fix: ignore the error on splitting host/port +* [`3be5a32`](https://github.com/siderolabs/arges-theila/commit/3be5a3254168cddec8f1629789c2ae50d9eaa08e) feat: make the whole cluster list item clickable, add dropdown menu item +* [`2c9dc99`](https://github.com/siderolabs/arges-theila/commit/2c9dc99000266b3d4c139f27dea4f6283709251e) fix: adjust the look of the Overview page a bit +* [`aa4a926`](https://github.com/siderolabs/arges-theila/commit/aa4a926cbb85bf63312493b937440a174aed5070) feat: add the button for downloading cluster Kubeconfig on overview page +* [`4532de6`](https://github.com/siderolabs/arges-theila/commit/4532de6f3d514a534c38a63731c43075698f5c01) feat: support basic auth in `argesctl` command +* [`b66bb3c`](https://github.com/siderolabs/arges-theila/commit/b66bb3cbcc85d7be4348ecd9a6d5d62f72a90e11) feat: add summary information Overview page +* [`3bdbce4`](https://github.com/siderolabs/arges-theila/commit/3bdbce41a3ed89a42556d837bc0c5cfe417e22e6) test: more cluster creation tests, two clusters, cleanup +* [`3b00bd5`](https://github.com/siderolabs/arges-theila/commit/3b00bd5bf417c5c9cb42471d27811c1849a40c78) fix: improve cluster deletion and node reset flow +* [`2d83d16`](https://github.com/siderolabs/arges-theila/commit/2d83d1694ec73da818004f91ede76a0bca30fe79) test: create a cluster and verify cluster machine statuses +* [`f471cfd`](https://github.com/siderolabs/arges-theila/commit/f471cfdcf7c9e70f37436e173c3a58c1965e8bb2) fix: copy all labels from the `ClusterMachine` to `ClusterMachineStatus` +* [`ec32f86`](https://github.com/siderolabs/arges-theila/commit/ec32f8632db104efd6fedc5421179175274d6339) test: add integration tests up to the cluster creation +* [`a8d3ee5`](https://github.com/siderolabs/arges-theila/commit/a8d3ee5b14a57ad1d9d88512a95032bbda61e734) feat: add kubeconfig command to argesctl and fix kubeconfig +* [`10b9a3b`](https://github.com/siderolabs/arges-theila/commit/10b9a3ba676a636e488805ed04a0c908c3d2cf53) test: implement API integration test +* [`3e6b891`](https://github.com/siderolabs/arges-theila/commit/3e6b8913f916dc5e8ac3ef49e14648defa6e1bf6) feat: aggregate cluster machine statuses in cluster status controller +* [`f6cbc58`](https://github.com/siderolabs/arges-theila/commit/f6cbc58a91124833f0cbae4ecd0c0416acbe8bfa) chore: ignore empty processor info +* [`c5fc71b`](https://github.com/siderolabs/arges-theila/commit/c5fc71b86a5492d548ae9098c5c74de240ebd800) fix: clean up Kubernetes client and configs when a cluster is destroyed +* [`e8478fe`](https://github.com/siderolabs/arges-theila/commit/e8478fe5280d5e8a32bb423ec96edacadabc7e43) fix: properly use tracker to cleanup `ClusterMachineConfig` resources +* [`044fcad`](https://github.com/siderolabs/arges-theila/commit/044fcadb66de61742ab871d10f3fcf0f453f6e27) fix: make `MachineStatusController` connect to configured nodes +* [`2867099`](https://github.com/siderolabs/arges-theila/commit/2867099a52d651c3b0f9d3abbae266f2792cafe7) feat: add api endpoint to fetch kubeconfig +* [`5f32667`](https://github.com/siderolabs/arges-theila/commit/5f3266747012b590dd7a7d0ebc23ee0e80abb2ab) test: support registry mirrors for development purposes +* [`5114695`](https://github.com/siderolabs/arges-theila/commit/5114695cfeb0b6c792002ff5f0f31c1944c269ab) refactor: consistent flag naming +* [`9ffb19e`](https://github.com/siderolabs/arges-theila/commit/9ffb19e77968c6e411903a2c59fd9a18063b46d4) chore: use latest node +* [`5512321`](https://github.com/siderolabs/arges-theila/commit/5512321f05b6b657a28abc25470664f6eb6e3d0a) refactor: set better defaults for cli args +* [`ff88242`](https://github.com/siderolabs/arges-theila/commit/ff882427f56e42039b79900380b61b86d3290269) chore: mark 'siderolink-wireguard-endpoint' flags as required +* [`4a9d9ad`](https://github.com/siderolabs/arges-theila/commit/4a9d9adef1e521d3c0293b6dc414f572bd8a93d4) feat: add the ClusterMachineStatus resource +* [`e4e8b62`](https://github.com/siderolabs/arges-theila/commit/e4e8b6264cb48edd014f97129f52aefaa129fd63) refactor: unify all Arges API under a single HTTP server +* [`5af9049`](https://github.com/siderolabs/arges-theila/commit/5af9049bdc2e09bf410e1b0646e4e08a4366f33b) chore: rename sidebar item +* [`a4fc47f`](https://github.com/siderolabs/arges-theila/commit/a4fc47f97d79259532b91a8d391e84b59554ed8e) chore: fix build warning +* [`547b83c`](https://github.com/siderolabs/arges-theila/commit/547b83c4a2a543d5b6ce4dca6cf6f5de87c33dcb) chore: bump siderolink version +* [`11c31f3`](https://github.com/siderolabs/arges-theila/commit/11c31f39d834e3352b086c1aec665065fd74e944) refactor: drop one of the layered gRPC servers +* [`0adbbb7`](https://github.com/siderolabs/arges-theila/commit/0adbbb7edfeacedd98a7e84c2f45ac458750a281) feat: introduce a way to copy kernel arguments from the UI +* [`ce5422a`](https://github.com/siderolabs/arges-theila/commit/ce5422a27771a94cc25be70ec756711d140b2758) fix: import new COSI library to fix YAML marshaling +* [`d6cec09`](https://github.com/siderolabs/arges-theila/commit/d6cec099cb6f4c3118e4263b9517176858bb9cfb) feat: implement Arges API client, and minimal `argesctl` +* [`65c8d68`](https://github.com/siderolabs/arges-theila/commit/65c8d683187d82dc730752294c1bc03657f5df78) feat: implement cluster creation view +* [`8365b00`](https://github.com/siderolabs/arges-theila/commit/8365b00df90ac55f99e0f82e1fa6d4367ebd6a3f) feat: re-enable old Theila UI +* [`63e703c`](https://github.com/siderolabs/arges-theila/commit/63e703c4e1dfb4bf645fbc9cd28ba2a722e04dc2) fix: update Talos to the latest master +* [`d33e27b`](https://github.com/siderolabs/arges-theila/commit/d33e27b49113729c5538fce688832152ff96a7ea) feat: implement clusters list view +* [`cb9e23c`](https://github.com/siderolabs/arges-theila/commit/cb9e23ca6f420ac7b71acf6b19e9012265f3c69b) feat: protect Theila state from external API access +* [`952c235`](https://github.com/siderolabs/arges-theila/commit/952c2359b32fdd077d85e312707f8b9c9e01ea0c) fix: properly allocated ports in the loadbalancer +* [`a58c479`](https://github.com/siderolabs/arges-theila/commit/a58c479e9e31f70e806a1f3482b9b984c5c0ca68) chore: report siderolink events kernel arg +* [`8a56fe3`](https://github.com/siderolabs/arges-theila/commit/8a56fe34ce1966fe28f9e432c696fdd779dfb638) refactor: move Theila resources to public `pkg/` +* [`1251699`](https://github.com/siderolabs/arges-theila/commit/12516996eda859db6677403ad1f72a3994ea180b) fix: reset the `MachineEventsSnapshot` after the node is reset +* [`9a2e6af`](https://github.com/siderolabs/arges-theila/commit/9a2e6af3113b795f57c4e3a86c1348b120fa3bbd) feat: implement bootstrap controller +* [`7107e27`](https://github.com/siderolabs/arges-theila/commit/7107e27ee6b9ba644fc803e4463cbfcf26cf97de) feat: implement apply and reset config controller +* [`1579eb0`](https://github.com/siderolabs/arges-theila/commit/1579eb09eb58f2cb679205e9e204369f3a362e07) feat: implement machine events handler and `ClusterStatus` +* [`7214f4a`](https://github.com/siderolabs/arges-theila/commit/7214f4a514a921d6b9df7515116613996416f383) feat: implement cluster load balancer controller +* [`9c4fafa`](https://github.com/siderolabs/arges-theila/commit/9c4fafaf6b8dc9b7ff08fe28704ca6a2e7efc097) feat: add a controller that manages load balancers for talos clusters +* [`7e3d80c`](https://github.com/siderolabs/arges-theila/commit/7e3d80ce956d621ed79e4db094808831e18db85b) feat: add a resources that specify configurations for load balancers +* [`dc0d356`](https://github.com/siderolabs/arges-theila/commit/dc0d356a181b4c37670d2ed4e8d7af370dccef60) feat: support Theila runtime watch with label selectors +* [`6a568a7`](https://github.com/siderolabs/arges-theila/commit/6a568a72922e34e91f5448d3c1caa2f0b3a02e96) feat: implement `ClusterMachineConfig` resource and it's controller +* [`3db0f1c`](https://github.com/siderolabs/arges-theila/commit/3db0f1c9d4e2d6f962b6f3216a4f9c7e2575dd21) feat: implement `TalosConfig` controller +* [`b7ae8e1`](https://github.com/siderolabs/arges-theila/commit/b7ae8e113dc68acd87c4cfe5e3c8349d32bc392d) feat: introduce `Cluster` controller that adds finalizers on Clusters +* [`8d7ea02`](https://github.com/siderolabs/arges-theila/commit/8d7ea0293e8f57388fd483dc82e79e6b4c76a53f) chore: use label selectors in `TalosConfig`, set labels on the resources +* [`cff9cb1`](https://github.com/siderolabs/arges-theila/commit/cff9cb19ba8718fdad509b5e91cb8221c6c1ff00) fix: separate advertised endpoint from the actual wireguard endpoint +* [`5be6cc3`](https://github.com/siderolabs/arges-theila/commit/5be6cc391adf8bcb58b8d47f09dad5aa75d1ad98) feat: implement cluster creation UI +* [`a1633eb`](https://github.com/siderolabs/arges-theila/commit/a1633eb18772b9e99d687dfddd12fc09fd1ea5c4) chore: add typed wrappers around State, Reader and Writer +* [`5515f3d`](https://github.com/siderolabs/arges-theila/commit/5515f3d004f54455a1eb1f4977bbb9d663fd1bca) feat: add `ClusterSecrets` resource and controller and tests +* [`7226f6c`](https://github.com/siderolabs/arges-theila/commit/7226f6cdc60eeb4d6040d1aa0711fed378c50b33) feat: add `Cluster`, `ClusterMachine` and `TalosConfig` resources +* [`ec44930`](https://github.com/siderolabs/arges-theila/commit/ec44930672ca8954c6ba68975c1799a087ec0c43) feat: enable vtprotobuf optimized marshaling +* [`15be219`](https://github.com/siderolabs/arges-theila/commit/15be2198872fb637f7ba2e1ff550e4466179f2b1) feat: generate TS constants from go `//tsgen:` comments +* [`caa4c4d`](https://github.com/siderolabs/arges-theila/commit/caa4c4d285dcd1176a70d87f28ee303cd0483ca8) fix: resource equality for proto specs +* [`beeca88`](https://github.com/siderolabs/arges-theila/commit/beeca886213332f313f7f3a477d7e7c508e6d058) refactor: clarify code that creates or gets links for nodes +* [`340c63a`](https://github.com/siderolabs/arges-theila/commit/340c63ad4ba918d4b11ab1f57fdbd3b5e5d8b3dc) feat: implement `Machines` page +* [`f7bc0c6`](https://github.com/siderolabs/arges-theila/commit/f7bc0c69c69fe515cfa729bc062c730756a53019) feat: accept nodes if they provide the correct join token +* [`bdf789a`](https://github.com/siderolabs/arges-theila/commit/bdf789a35da5491a4fcbd2af35a1c6efd22ab1fc) feat: immediately reconnect SideroLink peers after Arges restart +* [`6b74fa8`](https://github.com/siderolabs/arges-theila/commit/6b74fa82ca5757d6f3809853c1ac3e7754efb06d) feat: implement MachineStatusController +* [`f5db0e0`](https://github.com/siderolabs/arges-theila/commit/f5db0e05a87d5c11b4a1029b14020b19ca67035d) feat: add more info to the siderolink connection spec +* [`d3e4a71`](https://github.com/siderolabs/arges-theila/commit/d3e4a71af8fd79328e4edda6d9642b83902b2003) refactor: simplify the usage of gRPC resource CRUD API +* [`2430115`](https://github.com/siderolabs/arges-theila/commit/2430115af1aaac4226b7d5821e1fe706a1088501) feat: implement MachineController and small fixes +* [`e31d22d`](https://github.com/siderolabs/arges-theila/commit/e31d22d7639753df53c130461ae1f96b9126f3a5) feat: support running Theila without contexts +* [`a6b3646`](https://github.com/siderolabs/arges-theila/commit/a6b364626bd808687d5ad95307766344b16dd042) refactor: small fixes +* [`33d2b59`](https://github.com/siderolabs/arges-theila/commit/33d2b59c202f03785580209c885aa297c023fa60) refactor: clean up a bit SideroLink code, fix shutdown +* [`98ec883`](https://github.com/siderolabs/arges-theila/commit/98ec8830308755c7073a5d4510483e97d8e1d02d) chore: rename main executable to avoid clashing with Theila project +* [`828721d`](https://github.com/siderolabs/arges-theila/commit/828721d9aa5d912cce628256f75579309d1ad67d) feat: enable COSI persistence for resources +* [`f1f7883`](https://github.com/siderolabs/arges-theila/commit/f1f788344254e18bcab00a25b56a86289bfb1638) feat: set up siderolink endpoints in Theila +* [`6439335`](https://github.com/siderolabs/arges-theila/commit/64393353ca7cf430f82bfe73a004da319da28261) refactor: migrate to `typed.Resource` in Theila internal state +* [`6195274`](https://github.com/siderolabs/arges-theila/commit/61952742a47ea89e89228f057d0d3de351766150) refactor: restructure folders in the project +* [`1abf72b`](https://github.com/siderolabs/arges-theila/commit/1abf72b4b2e382fe0cf9302b42242152c255a3ee) chore: update Talos libs to the latest version +* [`16dffd9`](https://github.com/siderolabs/arges-theila/commit/16dffd9058570477b3a648896a89e6445e5b0162) fix: display delta time for pod's age +* [`8b80726`](https://github.com/siderolabs/arges-theila/commit/8b807262b23cfa830f3ff444d49f11b3a1654703) feat: update favicon to sidero logo +* [`2da7378`](https://github.com/siderolabs/arges-theila/commit/2da737841c2ae0bf1f1f916dc6f45b1e3996d6e4) feat: show the extended hardware info +* [`d3c6004`](https://github.com/siderolabs/arges-theila/commit/d3c6004f9767bf0cff9191dc130308c848ede077) chore: allow getting resources without version and group +* [`eb19087`](https://github.com/siderolabs/arges-theila/commit/eb190875b30275195e52f1a95ed0bb3aae08424f) fix: remove t-header error notification +* [`5a28202`](https://github.com/siderolabs/arges-theila/commit/5a28202c939ef9683d14fb3d873e0bacb35577db) feat: restyle t-alert component +* [`9f2b482`](https://github.com/siderolabs/arges-theila/commit/9f2b48228bbfa39d33b07ae43e9fdb34192c3eed) fix: get rid of racy code in the kubeconfig request code +* [`c40824e`](https://github.com/siderolabs/arges-theila/commit/c40824ecc5d10cb5289e133b8b1f51213aa12f7f) feat: add text Highlight feature +* [`9018c81`](https://github.com/siderolabs/arges-theila/commit/9018c81bd0d7c58bb5c632c06f3c3904f6674e03) feat: use `~/.talos/config` as a primary source for clusters +* [`e10547b`](https://github.com/siderolabs/arges-theila/commit/e10547b5761ad96ab8b5766fe5c3f06fcdf86477) refactor: remove old components and not used code parts +* [`f704684`](https://github.com/siderolabs/arges-theila/commit/f7046846ea8e83a0e39647c4fcc49addf4c56061) fix: properly calculate servers capacity +* [`755a077`](https://github.com/siderolabs/arges-theila/commit/755a0779014b0a4177e0fc5180db20720be5a814) fix: use proper units for memory and CPU charts on the node monitor page +* [`d0a083d`](https://github.com/siderolabs/arges-theila/commit/d0a083d1c15c319e236dd258fabcc9a231f797a1) release(v0.2.0-alpha.0): prepare release +* [`53878ee`](https://github.com/siderolabs/arges-theila/commit/53878eea09c18f2bc0dd55ca11a6743587748319) fix: properly update servers menu item when the context is changed +* [`b4cb9c7`](https://github.com/siderolabs/arges-theila/commit/b4cb9c7989ec5299785b86acb3fa0ee648efd259) feat: restyle TMonitor page +* [`f0377e2`](https://github.com/siderolabs/arges-theila/commit/f0377e2ad5da702af71f2706141f4d7c638c7a15) fix: invert chart value for cpu, storage and memory on the overview page +* [`6ea6ecf`](https://github.com/siderolabs/arges-theila/commit/6ea6ecf12c4d8b5253b4dfc2e64f5b5d787d022a) fix: update capi-utils to fix talosconfig requests for CAPI clusters +* [`e3796d3`](https://github.com/siderolabs/arges-theila/commit/e3796d3876d33248fd0998901273a14d29a487a3) chore: update capi-utils +* [`39186eb`](https://github.com/siderolabs/arges-theila/commit/39186ebe50da531f35d21ac2488f8a58c1ef8e78) feat: implement overview page, cluster dropdown, ongoing tasks +* [`59f2b27`](https://github.com/siderolabs/arges-theila/commit/59f2b27be4d7f5a591fdeae533d649494356250d) docs: update README.md +* [`2b7831f`](https://github.com/siderolabs/arges-theila/commit/2b7831f2d22106ac8a82f890d73c2705841b0739) feat: add Kubernetes and Servers pages +* [`4451a5b`](https://github.com/siderolabs/arges-theila/commit/4451a5bc9f5c6b058c6bcf1252b7c83a001cafbe) fix: properly set TaskStatus namespace in the initial call +* [`4545464`](https://github.com/siderolabs/arges-theila/commit/454546425f2fd7e4418aa8a03465f3a062de804e) fix: add new fields to the TaskStatus spec, update Talos +* [`891cf3b`](https://github.com/siderolabs/arges-theila/commit/891cf3b79c8430deeed8a168955afd6e97083baa) docs: describe client context types, usage +* [`309b515`](https://github.com/siderolabs/arges-theila/commit/309b51545ead2ee144244591df2e5ead2849fb11) feat: update k8s upgrades tasks structure for the new UI representation +* [`5aa8ca2`](https://github.com/siderolabs/arges-theila/commit/5aa8ca24bd3159879c46c8e8a134702b174e3362) feat: add NodesPage +* [`db434e0`](https://github.com/siderolabs/arges-theila/commit/db434e07b9f23562bd746a0f78e3868b079006e2) feat: add TPagination component +* [`0b51727`](https://github.com/siderolabs/arges-theila/commit/0b51727efed31f13f52fa20b360071e7e2a6d9eb) feat: add Pods, Dashboard, Upgrade views, etc +* [`c549b8b`](https://github.com/siderolabs/arges-theila/commit/c549b8b9ee8a563f14b2e791f91a7b3cb0430aa7) feat: add Overview and Upgrade Kubernetes pages +* [`cec2e85`](https://github.com/siderolabs/arges-theila/commit/cec2e854f4f3999109220902bccaee6c25d1f502) chore: define constants for all used resource types +* [`962bdaf`](https://github.com/siderolabs/arges-theila/commit/962bdaf6406ab8e5febea0ad8d32da9c86fa39e7) feat: add TSideBar +* [`fa28ccb`](https://github.com/siderolabs/arges-theila/commit/fa28ccb67f52c1dd9096b23388427d78be526275) feat: add TheHeader component +* [`f3418a5`](https://github.com/siderolabs/arges-theila/commit/f3418a59e38e551bd0be7cc7ae66ef4645719aa7) feat: button;icons;config +* [`db30f50`](https://github.com/siderolabs/arges-theila/commit/db30f503730bdbd8ed359d4070dea0214df67fcd) fix: add `frontend/node_modules` to gitignore +* [`a675b86`](https://github.com/siderolabs/arges-theila/commit/a675b86f7d55cecd4ae1277cbf057a6bc264940c) fix: properly pass label selector to the metadata in ClusterListItem +* [`7911d6a`](https://github.com/siderolabs/arges-theila/commit/7911d6a31abdb51e86586a025b705ddfeb1dd19e) chore: add ability to start local development server for the frontend +* [`076fee1`](https://github.com/siderolabs/arges-theila/commit/076fee10c6583dc49e6530b02cab1f757da0e853) feat: use CAPI utils for CAPI requests +* [`5ed5ba2`](https://github.com/siderolabs/arges-theila/commit/5ed5ba2a122585a97cf65c3ff081126752cd26fa) fix: more websocket client bugfixes +* [`6fe22ad`](https://github.com/siderolabs/arges-theila/commit/6fe22ad370026380ba75b38e261870addc341e6f) fix: reset reconnect timeouts after the client is reconnected +* [`c4b144a`](https://github.com/siderolabs/arges-theila/commit/c4b144af272a46dbdc8d1bb35784e09ba1b79987) fix: talosconfig/kubeconfig when using the default context +* [`b439a37`](https://github.com/siderolabs/arges-theila/commit/b439a371c13a8d46d986a1dae3d6f4b7cba4a298) fix: properly handle Same-Origin header in websockets +* [`ffffed1`](https://github.com/siderolabs/arges-theila/commit/ffffed100cec18209bae723b9919eb8613950649) fix: read node name from nodename resource instead of hostname +* [`2d6f984`](https://github.com/siderolabs/arges-theila/commit/2d6f9844440a6d18b3093dea6228ac6a237dc86b) fix: use secure websockets if the page itself is using https +* [`799f2d2`](https://github.com/siderolabs/arges-theila/commit/799f2d2d00762d5270dd4a3f4b4b312b32dbb7dd) feat: rework the node overview page +* [`0d0eaf4`](https://github.com/siderolabs/arges-theila/commit/0d0eaf4b2721dfa1b04bce24e4a1e476579e3a74) fix: make charts height resize depending on the screen height +* [`7de0101`](https://github.com/siderolabs/arges-theila/commit/7de0101bf0e613653caadd5733db0e29a6bb5bfb) fix: use polyfill to fix streaming APIs on Firefox +* [`0cff2b0`](https://github.com/siderolabs/arges-theila/commit/0cff2b02b5d8b2c2c644067cf6bd3ed573cb784d) feat: small UI adjustments +* [`d70bd41`](https://github.com/siderolabs/arges-theila/commit/d70bd41992e13fb3dacc1740532083a8f6ce9afa) feat: implement accept Sidero server functional +* [`f3a6e16`](https://github.com/siderolabs/arges-theila/commit/f3a6e16a79e1bca9ea6c87eb0d3e0f2a6c65ff2e) feat: add top processes list to the Overview page +* [`3cf97e4`](https://github.com/siderolabs/arges-theila/commit/3cf97e4b9e07f8383da8a6fb7a993b70c8f82503) refactor: use the same object for gRPC metadata context and messages +* [`243206f`](https://github.com/siderolabs/arges-theila/commit/243206f95aa6ba944bd4361db6274e7072bae1fc) release(v0.1.0-alpha.2): prepare release +* [`e5b6f29`](https://github.com/siderolabs/arges-theila/commit/e5b6f29fd298904e06284a67681cc0ce5135145f) feat: implement node Reset +* [`bcb7d23`](https://github.com/siderolabs/arges-theila/commit/bcb7d237c31f42a35f5c3b53e7615ddae1ce0a8b) fix: node IP not being truncated +* [`e576d33`](https://github.com/siderolabs/arges-theila/commit/e576d33ba40f629eed14668f2d9bf77d7fef62c2) feat: add upgrade UI for CAPI clusters +* [`10cdce7`](https://github.com/siderolabs/arges-theila/commit/10cdce7fcc219af969a85a41d18fb904936faa0a) fix: server labels key/value order and chevron orientation +* [`4007177`](https://github.com/siderolabs/arges-theila/commit/40071775d6de1eea697f67e55441c384c86e75d9) feat: implement Kubernetes upgrade UI components +* [`f4917ee`](https://github.com/siderolabs/arges-theila/commit/f4917eecfb3173acf7518883c738118c8537d657) fix: accumulate chart updates into a single update +* [`414d76c`](https://github.com/siderolabs/arges-theila/commit/414d76c1c926695e5d66787b34decae92e151b45) feat: implement upgrade controller +* [`36742ea`](https://github.com/siderolabs/arges-theila/commit/36742ea5ab1e8a983b73f73443c1cf122a90d054) feat: introduce create, delete and update gRPC APIs +* [`2b3d314`](https://github.com/siderolabs/arges-theila/commit/2b3d314a460b385d8c13bdd025fadb37b5508bdc) feat: install internal COSI runtime alongside with K8s and Talos +* [`ae7f784`](https://github.com/siderolabs/arges-theila/commit/ae7f784d08621d18075b1763f026a7513d9d9dcb) refactor: move all generated TypeScript files under `frontend/src/api` +* [`61bad64`](https://github.com/siderolabs/arges-theila/commit/61bad64540c28fb0520a39a6c64d64c3e9353361) release(v0.1.0-alpha.1): prepare release +* [`8e5e722`](https://github.com/siderolabs/arges-theila/commit/8e5e7229470713d2fbd5ad0df027bd825f5481e3) feat: implement node reboot controls +* [`9765a88`](https://github.com/siderolabs/arges-theila/commit/9765a88069f05c49f5a7d854675ee37e1c7a8273) feat: dmesg logs page +* [`ecbbd67`](https://github.com/siderolabs/arges-theila/commit/ecbbd67936b1fb570d706fe3b93b81f6089b5124) feat: use updated timestamp to display event time on the graph +* [`7c56773`](https://github.com/siderolabs/arges-theila/commit/7c56773448a496fe1ceeec3c47978975ce336b3a) refactor: use Metadata to pass context in all gRPC calls +* [`abb4733`](https://github.com/siderolabs/arges-theila/commit/abb47330222217d7d8b5c36ff28902415bc755d8) feat: implement service logs viewer +* [`8e8e032`](https://github.com/siderolabs/arges-theila/commit/8e8e032b20d082bfd71a26c2af2bbc821d9c2a7b) feat: add ability to pick sort order on the servers page +* [`1a1c728`](https://github.com/siderolabs/arges-theila/commit/1a1c728ac929bb02db7f1bd0b991a747e63fe81a) fix: resolve the issue with idFn value generating undefined ids +* [`2e83fe2`](https://github.com/siderolabs/arges-theila/commit/2e83fe23a7feb51b73bc7b53997636b641ae42b9) feat: allow filtering servers by picking from predefined categories +* [`48f776e`](https://github.com/siderolabs/arges-theila/commit/48f776e10f6c79772481393d7397557419520046) fix: navigate home when changing the context +* [`a1ce0ca`](https://github.com/siderolabs/arges-theila/commit/a1ce0ca8c8fabb2267c3dc6f6b1509f131e18ba8) fix: resolve services search issues +* [`5b768f8`](https://github.com/siderolabs/arges-theila/commit/5b768f85277ee31131994ae0b253700a5d26978d) feat: make stacked lists searchable +* [`ec1bc5b`](https://github.com/siderolabs/arges-theila/commit/ec1bc5b48943e473c756ebc7a8c943a34cdeaeac) feat: implement stats component and add stats to the servers page +* [`1a85999`](https://github.com/siderolabs/arges-theila/commit/1a8599981f93fc5ce68e23b1b4cd7aabbb43c90c) feat: align Sidero servers list outlook with the wireframes +* [`524264c`](https://github.com/siderolabs/arges-theila/commit/524264c515a9efdce9f06a3c2ebd59c2979f9b2a) fix: display error message and use proper layout for the spinner +* [`5263d16`](https://github.com/siderolabs/arges-theila/commit/5263d16cfb936aad9ba461e0cc7b150ff9b806d5) feat: introduce node stats page +* [`8feb35e`](https://github.com/siderolabs/arges-theila/commit/8feb35e95a6d588e1d9c605231308976be452a2e) feat: make root sidebar sections collapsible +* [`36ad656`](https://github.com/siderolabs/arges-theila/commit/36ad656a3bbdc1e2915a87c0d09c31738ae3f3c4) feat: detect cluster capabilities +* [`a25d90d`](https://github.com/siderolabs/arges-theila/commit/a25d90d58a85b3b73432858f134fa09cd1338d5c) feat: support switching context in the UI +* [`67903e2`](https://github.com/siderolabs/arges-theila/commit/67903e23f49623ae9a9a6b297282c62aa8579aa8) refactor: separate Watch from StackedList +* [`76b9e1d`](https://github.com/siderolabs/arges-theila/commit/76b9e1dc88cccf74cebb28470eae5e9249809d40) release(v0.1.0-alpha.0): prepare release +* [`7bde4c8`](https://github.com/siderolabs/arges-theila/commit/7bde4c8c6e16c197578cbb4e037a05d50194958f) fix: cobra command was initialized but not actually used +* [`04624c9`](https://github.com/siderolabs/arges-theila/commit/04624c95cec587ae0b0d8888d95d484ef8d98cfa) feat: support getting Talos and Kubernetes client configs for a cluster +* [`219b9c8`](https://github.com/siderolabs/arges-theila/commit/219b9c8663fe03af65796b0b6299cff5e66b3efc) feat: implement notifications component +* [`f8b19a0`](https://github.com/siderolabs/arges-theila/commit/f8b19a0585e6e19c0e7da4e4afad5bbd264e0029) feat: decouple watch list from the view +* [`2f8c96e`](https://github.com/siderolabs/arges-theila/commit/2f8c96e44012e7bd0db9869eeb90ab48ff41e162) feat: implement appearance settings modal window +* [`de745d6`](https://github.com/siderolabs/arges-theila/commit/de745d6b7170a9c509cc835a8b675a1c788e80f4) feat: implement Talos runtime backend +* [`af69a0d`](https://github.com/siderolabs/arges-theila/commit/af69a0d58906a86974bc7dbec2c09ca9f78b152f) feat: support getting Kubernetes resource through gRPC gateway +* [`2c50010`](https://github.com/siderolabs/arges-theila/commit/2c50010b0d9f7b168354fedd698600d94123c354) feat: implement breadcrumbs component, add support for table header +* [`3fc1e80`](https://github.com/siderolabs/arges-theila/commit/3fc1e808875f6f502cd2657c4548dd886fbf465d) feat: implement nodes view +* [`961e93a`](https://github.com/siderolabs/arges-theila/commit/961e93a4af430eaa9efcd1e2922af8072fe4cf85) feat: implement clusters view +* [`e8248ff`](https://github.com/siderolabs/arges-theila/commit/e8248ffab89633cae8834631e39cf4dce5e4147a) feat: use plain zap instead of SugaredLogger everywhere +* [`81ba93d`](https://github.com/siderolabs/arges-theila/commit/81ba93dffdc37efdde06557a1c63511a7d61b2f2) chore: generate websocket protocol messages using protobuf +* [`37a878d`](https://github.com/siderolabs/arges-theila/commit/37a878dd396b650df8afaf6730f9afe52d35569c) feat: make JS websocket reconnect on connection loss +* [`23b3281`](https://github.com/siderolabs/arges-theila/commit/23b3281f8880800a9084e1c8a74617fcf966c846) feat: use dynamic watcher to allow listing any kinds of resources +* [`16475f5`](https://github.com/siderolabs/arges-theila/commit/16475f51cc9651736213b36c57381b24dcabdc62) feat: implement real time update server on top of web sockets +* [`76b39ae`](https://github.com/siderolabs/arges-theila/commit/76b39ae563d9f09ecac3451389e3d260abdad48d) feat: create hello world Vue app using Kres +* [`baab493`](https://github.com/siderolabs/arges-theila/commit/baab493f155cbd78c2e8af6ce45268c40ef6aeed) Initial commit +</p> +</details> + +### Dependency Changes + +This release has no dependency changes + diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..e55a1364 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,11 @@ +# Contributing + +## Developer Certificate of Origin + +All commits require a [DCO](https://developercertificate.org/) sign-off. +This is done by committing with the `--signoff` flag. + +## Development + +The build process for this project is designed to run entirely in containers. +To get started, run `make help` and follow the instructions. diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md new file mode 100644 index 00000000..0a7a0af8 --- /dev/null +++ b/DEVELOPMENT.md @@ -0,0 +1,232 @@ +# Developing Omni + +Decide on the CIDR for the local set of QEMU Talos machines. +In this document, we are going to use the `172.20.0.0/24` CIDR, but you can use any CIDR you want. + +With the CIDR `172.20.0.0/24`, the bridge IP is going to be `172.20.0.1`, so we are going to use the bridge IP +as the Omni endpoint QEMU VMs can reach. + +## Build Omni and omnictl + +```shell +make omni-linux-amd64 +``` + +```shell +make omnictl-linux-amd64 +``` + +## Dev Environment + +### mkcert + +First, install and run [mkcert](https://github.com/FiloSottile/mkcert) to generate the TLS root certificates, +and add them to your system's trust store. +After installing dependencies, you can run the following command (requires `sudo`) to generate the root certificates: + +```shell +make mkcert-install +``` + +or + +```shell +go run ./hack/generate-certs install +``` + +Then you will need to create `generate-certs.yml` which you customize using `generate-certs.example.yml` as an example. +The example file also contains a commented-out registry mirror configuration which speeds up local testing. +After that, you can run the following command to generate the certificates and `hack/compose/docker-compose.override.yml` file: + +```shell +make mkcert-generate +``` + +or + +```shell +go run ./hack/generate-certs -config ./hack/generate-certs.yml generate +``` + +This should result in the following (git-ignored) files: + +- `hack/generate-certs/ca-root/rootCA.pem` +- `hack/generate-certs/ca-root/rootCA-key.pem` +- `hack/generate-certs/certs/localhost.pem` +- `hack/generate-certs/certs/localhost-key.pem` +- `hack/compose/docker-compose.override.yml` + +After that, you can run the following command to start the docker-compose environment: + +```shell +make docker-compose-up WITH_DEBUG=1 +``` + +When you're done, you can run the following command to stop the docker-compose environment: + +```shell +make docker-compose-down +``` + +If you need to clean up `etcd` state, run: + +```shell +docker volume rm compose_etcd +``` + +If you want to remove all volumes created by docker compose (e.g. `etcd`, `logs`, `secondary-storage`), run: + +```shell +make docker-compose-down REMOVE_VOLUMES=true +``` + +### mkcert uninstall + +You can always remove the root certificates from your system's trust store using the following command: + +```shell +make mkcert-uninstall +``` + +or + +```shell +go run ./hack/generate-certs uninstall +``` + +## Start Talos VMs + +```shell +sudo -E _out/talosctl-linux-amd64 cluster create \ + --provisioner=qemu --cidr=172.20.0.0/24 --install-image=ghcr.io/siderolabs/installer:v1.3.2 --memory 2048 --memory-workers 2048 --disk 6144 --cpus 2 --controlplanes 1 --workers 5 \ + --extra-boot-kernel-args 'siderolink.api=grpc://<HOST_IP>:8090?jointoken=w7uVuW3zbVKIYQuzEcyetAHeYMeo5q2L9RvkAVfCfSCD talos.events.sink=[fdae:41e4:649b:9303::1]:8090 talos.logging.kernel=tcp://[fdae:41e4:649b:9303::1]:8092' + --skip-injecting-config --wait=false --with-init-node +``` + +> Note: `<HOST_IP>` is the IP address of the host machine, which is used by the Talos VMs to connect to Omni. +> Omni also prints these args in the startup logs. + +## Open Omni UI + +By default, Omni serves the frontend and API on `*:443`, so you can open the Omni UI in your browser with e.g. `https://my.host/`. + +You should see your Talos VMs registered in the `Machines` tab, and a cluster can be created in the `Clusters` tab. + +Node.js development server can be used to get immediate feedback on frontend changes: `https://my.host:8120/`. +When making frontend changes, `https://my.host/` will only update after stopping docker-compose environment with `^C` and running `make docker-compose-up WITH_DEBUG=1` again. +At the same time `https://my.host:8120/` will update immediately. + +## Use `omnictl` + +Download `omniconfig` from the Omni UI. + +Fetch some resources with `omnictl`: + +```shell +$ _out/omnictl-linux-amd64 --omniconfig=omniconfig get machines +NAMESPACE TYPE ID VERSION +default Machine 17e1d2c1-60f0-452e-87a9-bc949953643b 1 +default Machine 20141377-15f2-43e2-a0a9-ff68ca21d90e 1 +``` + +If the browser can't be launched from your machine (e.g., in a headless environment), you can use environment variable `BROWSER=echo` to see the URL instead. + +## Running Integration Tests + +Make sure the Omni database is clean, and it has some machines connected to it. + +Then run the integration tests: + +```shell +$ sudo -E make run-integration-test WITH_DEBUG=true +=== RUN TestSideroLinkDiscovery + siderolink.go:54: links discovered: 1 + siderolink.go:54: links discovered: 2 + siderolink.go:54: links discovered: 3 + siderolink.go:54: links discovered: 4 +--- PASS: TestSideroLinkDiscovery (0.00s) +PASS +``` + +Another way to run integration tests directly: + +```shell +$ make _out/omni-integration-test-linux-amd64 +$ sudo -E _out/omni-integration-test-linux-amd64 \ + --endpoint=https://my.host \ + --expected-machines=6 +``` + +Tests need a hint on number of available Talos VMs with `--expected-machines` flag: make it equal to the sum of `--controlplanes` and `--workers` in the `talosctl cluster create` above. + +Specific tests can be run by appending a flag `--test.run=TestSideroLinkDiscovery` to the command above. + +## Local Network Use + +When using Omni to provision Talos clusters in your LAN, it makes sense to launch it with default args, this way Omni advertises the first host IP address by default. + +## Etcd Backups + +You can set up Omni to periodically back up its etcd database to a local directory or s3 storage. +By default, Omni uses s3 storage. + +To enable etcd backups into the local directory, set the following command line flag: + +```shell +--etcd-backup-local-path /path/to/backup/dir +``` + +For s3 you should also create `EtcdBackupS3Configs.omni.sidero.dev` resource in the default namespace, since this is +the place where Omni gets s3 credentials and options from. +For example, for minio s3 with bucket `mybucket` and operating locally on port `9000` that would be: + +```yaml +metadata: + namespace: default + type: EtcdBackupS3Configs.omni.sidero.dev + id: etcd-backup-s3-conf + version: undefined + owner: + phase: running + created: 2023-12-12T17:43:12+00:00 + updated: 2023-12-12T17:43:12+00:00 +spec: + bucket: mybucket + region: us-east-1 + endpoint: http://127.0.0.1:9000 + accesskeyid: access + secretaccesskey: secret123 + sessiontoken: "" +``` + +Keep in mind that `etcd-backup-local-path` and `etcd-backup-s3` are mutually exclusive. + +### Manual Etcd Backups + +You can create manual etcd backup if s3 or local backup is enabled. +To do that, create a resource: + +```yaml +metadata: + namespace: ephemeral + type: EtcdManualBackups.omni.sidero.dev + id: <your-cluster-name> + version: undefined + owner: + phase: running +spec: + backupat: + seconds: <unix-timestamp> + nanos: 0 +``` + +`unix-timestamp` should be no more than one minute in the future or in the past. + +## Controller Dependency Graphs + +If Omni is built `WITH_DEBUG=1`, it provides an additional handler under `/debug` prefix: + +```shell +curl https://my.host/debug/controller-graph | dot -Tsvg -o controller.svg +curl https://my.host/debug/controller-resource-graph | dot -Tsvg -o controller-resource.svg +``` diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..a2af04e8 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,513 @@ +# syntax = docker/dockerfile-upstream:1.6.0-labs + +# THIS FILE WAS AUTOMATICALLY GENERATED, PLEASE DO NOT EDIT. +# +# Generated on 2024-02-26T21:35:48Z by kres latest. + +ARG JS_TOOLCHAIN +ARG TOOLCHAIN + +FROM ghcr.io/siderolabs/ca-certificates:v1.6.0 AS image-ca-certificates + +FROM ghcr.io/siderolabs/fhs:v1.6.0 AS image-fhs + +# base toolchain image +FROM ${JS_TOOLCHAIN} AS js-toolchain +COPY --from=golang:1.22-alpine /usr/local/go /usr/local/go +RUN apk --update --no-cache add bash curl protoc protobuf-dev +COPY ./go.mod . +COPY ./go.sum . +ENV GOPATH /go +ENV PATH ${PATH}:/usr/local/go/bin + +# runs markdownlint +FROM docker.io/node:21.6.2-alpine3.19 AS lint-markdown +WORKDIR /src +RUN npm i -g markdownlint-cli@0.39.0 +RUN npm i sentences-per-line@0.2.1 +COPY .markdownlint.json . +COPY ./docs ./docs +COPY ./CHANGELOG.md ./CHANGELOG.md +COPY ./CONTRIBUTING.md ./CONTRIBUTING.md +COPY ./DEVELOPMENT.md ./DEVELOPMENT.md +COPY ./README.md ./README.md +RUN markdownlint --ignore "CHANGELOG.md" --ignore "**/node_modules/**" --ignore '**/hack/chglog/**' --rules node_modules/sentences-per-line/index.js . + +# collects proto specs +FROM scratch AS proto-specs +ADD client/api/common/omni.proto /client/api/common/ +ADD client/api/omni/resources/resources.proto /client/api/omni/resources/ +ADD client/api/omni/management/management.proto /client/api/omni/management/ +ADD client/api/omni/oidc/oidc.proto /client/api/omni/oidc/ +ADD client/api/omni/specs/auth.proto /client/api/omni/specs/ +ADD client/api/omni/specs/virtual.proto /client/api/omni/specs/ +ADD client/api/omni/specs/ephemeral.proto /client/api/omni/specs/ +ADD client/api/omni/specs/oidc.proto /client/api/omni/specs/ +ADD client/api/omni/specs/omni.proto /client/api/omni/specs/ +ADD client/api/omni/specs/siderolink.proto /client/api/omni/specs/ +ADD client/api/omni/specs/system.proto /client/api/omni/specs/ +ADD https://raw.githubusercontent.com/googleapis/googleapis/master/google/rpc/status.proto /client/api/google/rpc/ +ADD https://raw.githubusercontent.com/siderolabs/talos/03a20da9da5916c63015d355f4b56823778e994f/api/common/common.proto /client/api/common/ +ADD https://raw.githubusercontent.com/siderolabs/talos/03a20da9da5916c63015d355f4b56823778e994f/api/machine/machine.proto /client/api/talos/machine/ +ADD https://raw.githubusercontent.com/cosi-project/specification/c644a4b0fd408ec41bd29193bcdbd1a5b7feead2/proto/v1alpha1/resource.proto /client/api/v1alpha1/ + +# collects proto specs +FROM scratch AS proto-specs-frontend +ADD client/api/common/omni.proto /frontend/src/api/common/ +ADD client/api/omni/resources/resources.proto /frontend/src/api/omni/resources/ +ADD client/api/omni/management/management.proto /frontend/src/api/omni/management/ +ADD client/api/omni/oidc/oidc.proto /frontend/src/api/omni/oidc/ +ADD https://raw.githubusercontent.com/siderolabs/go-api-signature/a034e9ff315ba4a56115acc7ad0fb99d0dc77800/api/auth/auth.proto /frontend/src/api/omni/auth/ +ADD client/api/omni/specs/omni.proto /frontend/src/api/omni/specs/ +ADD client/api/omni/specs/siderolink.proto /frontend/src/api/omni/specs/ +ADD client/api/omni/specs/system.proto /frontend/src/api/omni/specs/ +ADD client/api/omni/specs/auth.proto /frontend/src/api/omni/specs/ +ADD client/api/omni/specs/virtual.proto /frontend/src/api/omni/specs/ +ADD client/api/omni/specs/ephemeral.proto /frontend/src/api/omni/specs/ +ADD https://raw.githubusercontent.com/googleapis/googleapis/master/google/rpc/status.proto /frontend/src/api/google/rpc/ +ADD https://raw.githubusercontent.com/siderolabs/talos/03a20da9da5916c63015d355f4b56823778e994f/api/machine/machine.proto /frontend/src/api/talos/machine/ +ADD https://raw.githubusercontent.com/protocolbuffers/protobuf/master/src/google/protobuf/any.proto /frontend/src/api/google/protobuf/ +ADD https://raw.githubusercontent.com/protocolbuffers/protobuf/master/src/google/protobuf/duration.proto /frontend/src/api/google/protobuf/ +ADD https://raw.githubusercontent.com/protocolbuffers/protobuf/master/src/google/protobuf/empty.proto /frontend/src/api/google/protobuf/ +ADD https://raw.githubusercontent.com/protocolbuffers/protobuf/master/src/google/protobuf/timestamp.proto /frontend/src/api/google/protobuf/ +ADD https://raw.githubusercontent.com/googleapis/googleapis/master/google/rpc/code.proto /frontend/src/api/google/rpc/ +ADD https://raw.githubusercontent.com/siderolabs/talos/03a20da9da5916c63015d355f4b56823778e994f/api/common/common.proto /frontend/src/api/common/ +ADD https://raw.githubusercontent.com/cosi-project/specification/5c734257bfa6a3acb01417809797dbfbe0e73c71/proto/v1alpha1/resource.proto /frontend/src/api/v1alpha1/ + +# base toolchain image +FROM ${TOOLCHAIN} AS toolchain +RUN apk --update --no-cache add bash curl build-base protoc protobuf-dev + +# build tools +FROM --platform=${BUILDPLATFORM} toolchain AS tools +ENV GO111MODULE on +ARG CGO_ENABLED +ENV CGO_ENABLED ${CGO_ENABLED} +ARG GOTOOLCHAIN +ENV GOTOOLCHAIN ${GOTOOLCHAIN} +ARG GOEXPERIMENT +ENV GOEXPERIMENT ${GOEXPERIMENT} +ENV GOPATH /go +ARG PROTOBUF_GO_VERSION +RUN --mount=type=cache,target=/root/.cache/go-build --mount=type=cache,target=/go/pkg go install google.golang.org/protobuf/cmd/protoc-gen-go@v${PROTOBUF_GO_VERSION} +RUN mv /go/bin/protoc-gen-go /bin +ARG GRPC_GO_VERSION +RUN --mount=type=cache,target=/root/.cache/go-build --mount=type=cache,target=/go/pkg go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v${GRPC_GO_VERSION} +RUN mv /go/bin/protoc-gen-go-grpc /bin +ARG GRPC_GATEWAY_VERSION +RUN --mount=type=cache,target=/root/.cache/go-build --mount=type=cache,target=/go/pkg go install github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-grpc-gateway@v${GRPC_GATEWAY_VERSION} +RUN mv /go/bin/protoc-gen-grpc-gateway /bin +ARG VTPROTOBUF_VERSION +RUN --mount=type=cache,target=/root/.cache/go-build --mount=type=cache,target=/go/pkg go install github.com/planetscale/vtprotobuf/cmd/protoc-gen-go-vtproto@v${VTPROTOBUF_VERSION} +RUN mv /go/bin/protoc-gen-go-vtproto /bin +ARG DEEPCOPY_VERSION +RUN --mount=type=cache,target=/root/.cache/go-build --mount=type=cache,target=/go/pkg go install github.com/siderolabs/deep-copy@${DEEPCOPY_VERSION} \ + && mv /go/bin/deep-copy /bin/deep-copy +ARG GOLANGCILINT_VERSION +RUN --mount=type=cache,target=/root/.cache/go-build --mount=type=cache,target=/go/pkg go install github.com/golangci/golangci-lint/cmd/golangci-lint@${GOLANGCILINT_VERSION} \ + && mv /go/bin/golangci-lint /bin/golangci-lint +RUN --mount=type=cache,target=/root/.cache/go-build --mount=type=cache,target=/go/pkg go install golang.org/x/vuln/cmd/govulncheck@latest \ + && mv /go/bin/govulncheck /bin/govulncheck +ARG GOIMPORTS_VERSION +RUN --mount=type=cache,target=/root/.cache/go-build --mount=type=cache,target=/go/pkg go install golang.org/x/tools/cmd/goimports@${GOIMPORTS_VERSION} \ + && mv /go/bin/goimports /bin/goimports +ARG GOFUMPT_VERSION +RUN go install mvdan.cc/gofumpt@${GOFUMPT_VERSION} \ + && mv /go/bin/gofumpt /bin/gofumpt + +# tools and sources +FROM js-toolchain AS js +WORKDIR /src +ARG PROTOBUF_GRPC_GATEWAY_TS_VERSION +RUN --mount=type=cache,target=/root/.cache/go-build --mount=type=cache,target=/go/pkg go install github.com/siderolabs/protoc-gen-grpc-gateway-ts@v${PROTOBUF_GRPC_GATEWAY_TS_VERSION} +RUN mv /go/bin/protoc-gen-grpc-gateway-ts /bin +COPY frontend/package.json ./ +COPY frontend/package-lock.json ./ +RUN --mount=type=cache,target=/src/node_modules npm version ${VERSION} +RUN --mount=type=cache,target=/src/node_modules npm ci +COPY frontend/.eslintrc.yaml ./ +COPY frontend/babel.config.js ./ +COPY frontend/jest.config.js ./ +COPY frontend/tsconfig.json ./ +COPY ./frontend/src ./src +COPY ./frontend/tests ./tests +COPY ./frontend/public ./public +COPY ./frontend/babel.config.js ./babel.config.js +COPY ./frontend/jest.config.js ./jest.config.js +COPY ./frontend/postcss.config.js ./postcss.config.js +COPY ./frontend/tailwind.config.js ./tailwind.config.js +COPY ./frontend/vue.config.js ./vue.config.js + +FROM tools AS embed-generate +ARG SHA +ARG TAG +WORKDIR /src +RUN mkdir -p internal/version/data && \ + echo -n ${SHA} > internal/version/data/sha && \ + echo -n ${TAG} > internal/version/data/tag + +# runs protobuf compiler +FROM tools AS proto-compile +COPY --from=proto-specs / / +RUN protoc -I/client/api --go_out=paths=source_relative:/client/api --go-grpc_out=paths=source_relative:/client/api --go-vtproto_out=paths=source_relative:/client/api --go-vtproto_opt=features=marshal+unmarshal+size+equal+clone /client/api/common/omni.proto +RUN protoc -I/client/api --grpc-gateway_out=paths=source_relative:/client/api --grpc-gateway_opt=generate_unbound_methods=true --go_out=paths=source_relative:/client/api --go-grpc_out=paths=source_relative:/client/api --go-vtproto_out=paths=source_relative:/client/api --go-vtproto_opt=features=marshal+unmarshal+size+equal+clone /client/api/omni/resources/resources.proto /client/api/omni/management/management.proto /client/api/omni/oidc/oidc.proto /client/api/omni/specs/auth.proto /client/api/omni/specs/virtual.proto /client/api/omni/specs/ephemeral.proto /client/api/omni/specs/oidc.proto /client/api/omni/specs/omni.proto /client/api/omni/specs/siderolink.proto /client/api/omni/specs/system.proto +RUN protoc -I/client/api --grpc-gateway_out=paths=source_relative:/client/api --grpc-gateway_opt=generate_unbound_methods=true --grpc-gateway_opt=standalone=true /client/api/google/rpc/status.proto /client/api/common/common.proto /client/api/talos/machine/machine.proto /client/api/v1alpha1/resource.proto +RUN rm /client/api/common/omni.proto +RUN rm /client/api/omni/resources/resources.proto +RUN rm /client/api/omni/management/management.proto +RUN rm /client/api/omni/oidc/oidc.proto +RUN rm /client/api/omni/specs/auth.proto +RUN rm /client/api/omni/specs/virtual.proto +RUN rm /client/api/omni/specs/ephemeral.proto +RUN rm /client/api/omni/specs/oidc.proto +RUN rm /client/api/omni/specs/omni.proto +RUN rm /client/api/omni/specs/siderolink.proto +RUN rm /client/api/omni/specs/system.proto +RUN goimports -w -local github.com/siderolabs/omni/client,github.com/siderolabs/omni /client/api +RUN gofumpt -w /client/api + +# builds frontend +FROM js AS frontend +ARG NODE_BUILD_ARGS +RUN --mount=type=cache,target=/src/node_modules npm run build ${NODE_BUILD_ARGS} +RUN mkdir -p /internal/frontend/dist +RUN cp -rf ./dist/* /internal/frontend/dist + +# runs eslint +FROM js AS lint-eslint +RUN --mount=type=cache,target=/src/node_modules npm run lint + +# runs protobuf compiler +FROM js AS proto-compile-frontend +COPY --from=proto-specs-frontend / / +RUN protoc -I/frontend/src/api --grpc-gateway-ts_out=source_relative:/frontend/src/api --grpc-gateway-ts_opt=use_proto_names=true /frontend/src/api/common/omni.proto +RUN protoc -I/frontend/src/api --grpc-gateway-ts_out=source_relative:/frontend/src/api --grpc-gateway-ts_opt=use_proto_names=true /frontend/src/api/omni/resources/resources.proto +RUN protoc -I/frontend/src/api --grpc-gateway-ts_out=source_relative:/frontend/src/api --grpc-gateway-ts_opt=use_proto_names=true /frontend/src/api/omni/management/management.proto +RUN protoc -I/frontend/src/api --grpc-gateway-ts_out=source_relative:/frontend/src/api --grpc-gateway-ts_opt=use_proto_names=true /frontend/src/api/omni/oidc/oidc.proto +RUN protoc -I/frontend/src/api --grpc-gateway-ts_out=source_relative:/frontend/src/api --grpc-gateway-ts_opt=use_proto_names=true /frontend/src/api/omni/auth/auth.proto +RUN protoc -I/frontend/src/api --grpc-gateway-ts_out=source_relative:/frontend/src/api --grpc-gateway-ts_opt=use_proto_names=true /frontend/src/api/omni/specs/omni.proto +RUN protoc -I/frontend/src/api --grpc-gateway-ts_out=source_relative:/frontend/src/api --grpc-gateway-ts_opt=use_proto_names=true /frontend/src/api/omni/specs/siderolink.proto +RUN protoc -I/frontend/src/api --grpc-gateway-ts_out=source_relative:/frontend/src/api --grpc-gateway-ts_opt=use_proto_names=true /frontend/src/api/omni/specs/system.proto +RUN protoc -I/frontend/src/api --grpc-gateway-ts_out=source_relative:/frontend/src/api --grpc-gateway-ts_opt=use_proto_names=true /frontend/src/api/omni/specs/auth.proto +RUN protoc -I/frontend/src/api --grpc-gateway-ts_out=source_relative:/frontend/src/api --grpc-gateway-ts_opt=use_proto_names=true /frontend/src/api/omni/specs/virtual.proto +RUN protoc -I/frontend/src/api --grpc-gateway-ts_out=source_relative:/frontend/src/api --grpc-gateway-ts_opt=use_proto_names=true /frontend/src/api/omni/specs/ephemeral.proto +RUN protoc -I/frontend/src/api --grpc-gateway-ts_out=source_relative:/frontend/src/api --grpc-gateway-ts_opt=use_proto_names=true /frontend/src/api/google/rpc/status.proto +RUN protoc -I/frontend/src/api --grpc-gateway-ts_out=source_relative:/frontend/src/api --grpc-gateway-ts_opt=use_proto_names=true /frontend/src/api/talos/machine/machine.proto +RUN protoc -I/frontend/src/api --grpc-gateway-ts_out=source_relative:/frontend/src/api --grpc-gateway-ts_opt=use_proto_names=true /frontend/src/api/google/protobuf/any.proto +RUN protoc -I/frontend/src/api --grpc-gateway-ts_out=source_relative:/frontend/src/api --grpc-gateway-ts_opt=use_proto_names=true /frontend/src/api/google/protobuf/duration.proto +RUN protoc -I/frontend/src/api --grpc-gateway-ts_out=source_relative:/frontend/src/api --grpc-gateway-ts_opt=use_proto_names=true /frontend/src/api/google/protobuf/empty.proto +RUN protoc -I/frontend/src/api --grpc-gateway-ts_out=source_relative:/frontend/src/api --grpc-gateway-ts_opt=use_proto_names=true /frontend/src/api/google/protobuf/timestamp.proto +RUN protoc -I/frontend/src/api --grpc-gateway-ts_out=source_relative:/frontend/src/api --grpc-gateway-ts_opt=use_proto_names=true /frontend/src/api/google/rpc/code.proto +RUN protoc -I/frontend/src/api --grpc-gateway-ts_out=source_relative:/frontend/src/api --grpc-gateway-ts_opt=use_proto_names=true /frontend/src/api/common/common.proto +RUN protoc -I/frontend/src/api --grpc-gateway-ts_out=source_relative:/frontend/src/api --grpc-gateway-ts_opt=use_proto_names=true /frontend/src/api/v1alpha1/resource.proto +RUN rm /frontend/src/api/common/omni.proto +RUN rm /frontend/src/api/omni/resources/resources.proto +RUN rm /frontend/src/api/omni/management/management.proto +RUN rm /frontend/src/api/omni/oidc/oidc.proto +RUN rm /frontend/src/api/omni/specs/omni.proto +RUN rm /frontend/src/api/omni/specs/siderolink.proto +RUN rm /frontend/src/api/omni/specs/system.proto +RUN rm /frontend/src/api/omni/specs/auth.proto +RUN rm /frontend/src/api/omni/specs/virtual.proto +RUN rm /frontend/src/api/omni/specs/ephemeral.proto + +# runs js unit-tests +FROM js AS unit-tests-frontend +RUN --mount=type=cache,target=/src/node_modules CI=true npm run test + +FROM embed-generate AS embed-abbrev-generate +WORKDIR /src +ARG ABBREV_TAG +RUN echo -n 'undefined' > internal/version/data/sha && \ + echo -n ${ABBREV_TAG} > internal/version/data/tag + +# tools and sources +FROM tools AS base +WORKDIR /src +COPY client/go.mod client/go.mod +COPY client/go.sum client/go.sum +COPY go.mod go.mod +COPY go.sum go.sum +RUN cd client +RUN --mount=type=cache,target=/go/pkg go mod download +RUN --mount=type=cache,target=/go/pkg go mod verify +RUN cd . +RUN --mount=type=cache,target=/go/pkg go mod download +RUN --mount=type=cache,target=/go/pkg go mod verify +COPY ./client/api ./client/api +COPY ./client/pkg ./client/pkg +COPY ./cmd ./cmd +COPY ./internal ./internal +COPY --from=frontend /internal/frontend/dist ./internal/frontend/dist +RUN --mount=type=cache,target=/go/pkg go list -mod=readonly all >/dev/null + +# cleaned up specs and compiled versions +FROM scratch AS generate-frontend +ADD https://www.talos.dev/v1.6/schemas/config.schema.json frontend/src/schemas/config.schema.json +COPY --from=proto-compile-frontend frontend/ frontend/ + +# run go generate +FROM base AS go-generate-0 +WORKDIR /src +COPY .license-header.go.txt hack/.license-header.go.txt +RUN --mount=type=cache,target=/root/.cache/go-build --mount=type=cache,target=/go/pkg go generate ./internal/... +RUN goimports -w -local github.com/siderolabs/omni/client,github.com/siderolabs/omni ./internal + +# runs gofumpt +FROM base AS lint-gofumpt +RUN FILES="$(gofumpt -l .)" && test -z "${FILES}" || (echo -e "Source code is not formatted with 'gofumpt -w .':\n${FILES}"; exit 1) + +# runs gofumpt +FROM base AS lint-gofumpt-client +RUN FILES="$(gofumpt -l client)" && test -z "${FILES}" || (echo -e "Source code is not formatted with 'gofumpt -w client':\n${FILES}"; exit 1) + +# runs goimports +FROM base AS lint-goimports +RUN FILES="$(goimports -l -local github.com/siderolabs/omni/ .)" && test -z "${FILES}" || (echo -e "Source code is not formatted with 'goimports -w -local github.com/siderolabs/omni/ .':\n${FILES}"; exit 1) + +# runs goimports +FROM base AS lint-goimports-client +RUN FILES="$(goimports -l -local github.com/siderolabs/omni/client/ client)" && test -z "${FILES}" || (echo -e "Source code is not formatted with 'goimports -w -local github.com/siderolabs/omni/client/ client':\n${FILES}"; exit 1) + +# runs golangci-lint +FROM base AS lint-golangci-lint +WORKDIR /src +COPY .golangci.yml . +ENV GOGC 50 +RUN --mount=type=cache,target=/root/.cache/go-build --mount=type=cache,target=/root/.cache/golangci-lint --mount=type=cache,target=/go/pkg golangci-lint run --config .golangci.yml + +# runs golangci-lint +FROM base AS lint-golangci-lint-client +WORKDIR /src/client +COPY client/.golangci.yml . +ENV GOGC 50 +RUN --mount=type=cache,target=/root/.cache/go-build --mount=type=cache,target=/root/.cache/golangci-lint --mount=type=cache,target=/go/pkg golangci-lint run --config .golangci.yml + +# runs govulncheck +FROM base AS lint-govulncheck +WORKDIR /src +RUN --mount=type=cache,target=/root/.cache/go-build --mount=type=cache,target=/go/pkg govulncheck ./... + +# runs govulncheck +FROM base AS lint-govulncheck-client +WORKDIR /src/client +RUN --mount=type=cache,target=/root/.cache/go-build --mount=type=cache,target=/go/pkg govulncheck ./... + +# runs unit-tests with race detector +FROM base AS unit-tests-client-race +WORKDIR /src/client +ARG TESTPKGS +RUN --mount=type=cache,target=/root/.cache/go-build --mount=type=cache,target=/go/pkg --mount=type=cache,target=/tmp CGO_ENABLED=1 go test -v -race -count 1 ${TESTPKGS} + +# runs unit-tests +FROM base AS unit-tests-client-run +WORKDIR /src/client +ARG TESTPKGS +RUN --mount=type=cache,target=/root/.cache/go-build --mount=type=cache,target=/go/pkg --mount=type=cache,target=/tmp go test -v -covermode=atomic -coverprofile=coverage.txt -coverpkg=${TESTPKGS} -count 1 ${TESTPKGS} + +# runs unit-tests with race detector +FROM base AS unit-tests-race +WORKDIR /src +ARG TESTPKGS +RUN --mount=type=cache,target=/root/.cache/go-build --mount=type=cache,target=/go/pkg --mount=type=cache,target=/tmp CGO_ENABLED=1 go test -v -race -count 1 ${TESTPKGS} + +# runs unit-tests +FROM base AS unit-tests-run +WORKDIR /src +ARG TESTPKGS +RUN --mount=type=cache,target=/root/.cache/go-build --mount=type=cache,target=/go/pkg --mount=type=cache,target=/tmp go test -v -covermode=atomic -coverprofile=coverage.txt -coverpkg=${TESTPKGS} -count 1 ${TESTPKGS} + +# cleaned up specs and compiled versions +FROM scratch AS generate +COPY --from=proto-compile /client/api/ /client/api/ +COPY --from=go-generate-0 /src/frontend frontend +COPY --from=embed-abbrev-generate /src/internal/version internal/version + +FROM scratch AS unit-tests-client +COPY --from=unit-tests-client-run /src/client/coverage.txt /coverage-unit-tests-client.txt + +FROM scratch AS unit-tests +COPY --from=unit-tests-run /src/coverage.txt /coverage-unit-tests.txt + +# builds omni-darwin-amd64 +FROM base AS omni-darwin-amd64-build +COPY --from=generate / / +COPY --from=embed-generate / / +WORKDIR /src/cmd/omni +ARG GO_BUILDFLAGS +ARG GO_LDFLAGS +ARG VERSION_PKG="internal/version" +ARG SHA +ARG TAG +RUN --mount=type=cache,target=/root/.cache/go-build --mount=type=cache,target=/go/pkg GOARCH=amd64 GOOS=darwin go build ${GO_BUILDFLAGS} -ldflags "${GO_LDFLAGS} -X ${VERSION_PKG}.Name=omni -X ${VERSION_PKG}.SHA=${SHA} -X ${VERSION_PKG}.Tag=${TAG}" -o /omni-darwin-amd64 + +# builds omni-darwin-arm64 +FROM base AS omni-darwin-arm64-build +COPY --from=generate / / +COPY --from=embed-generate / / +WORKDIR /src/cmd/omni +ARG GO_BUILDFLAGS +ARG GO_LDFLAGS +ARG VERSION_PKG="internal/version" +ARG SHA +ARG TAG +RUN --mount=type=cache,target=/root/.cache/go-build --mount=type=cache,target=/go/pkg GOARCH=arm64 GOOS=darwin go build ${GO_BUILDFLAGS} -ldflags "${GO_LDFLAGS} -X ${VERSION_PKG}.Name=omni -X ${VERSION_PKG}.SHA=${SHA} -X ${VERSION_PKG}.Tag=${TAG}" -o /omni-darwin-arm64 + +# builds omni-integration-test-linux-amd64 +FROM base AS omni-integration-test-linux-amd64-build +COPY --from=generate / / +COPY --from=embed-generate / / +WORKDIR /src/cmd/omni-integration-test +ARG GO_BUILDFLAGS +ARG GO_LDFLAGS +ARG VERSION_PKG="internal/version" +ARG SHA +ARG TAG +RUN --mount=type=cache,target=/root/.cache/go-build --mount=type=cache,target=/go/pkg GOARCH=amd64 GOOS=linux go build ${GO_BUILDFLAGS} -ldflags "${GO_LDFLAGS} -X ${VERSION_PKG}.Name=omni-integration-test -X ${VERSION_PKG}.SHA=${SHA} -X ${VERSION_PKG}.Tag=${TAG}" -o /omni-integration-test-linux-amd64 + +# builds omni-linux-amd64 +FROM base AS omni-linux-amd64-build +COPY --from=generate / / +COPY --from=embed-generate / / +WORKDIR /src/cmd/omni +ARG GO_BUILDFLAGS +ARG GO_LDFLAGS +ARG VERSION_PKG="internal/version" +ARG SHA +ARG TAG +RUN --mount=type=cache,target=/root/.cache/go-build --mount=type=cache,target=/go/pkg GOARCH=amd64 GOOS=linux go build ${GO_BUILDFLAGS} -ldflags "${GO_LDFLAGS} -X ${VERSION_PKG}.Name=omni -X ${VERSION_PKG}.SHA=${SHA} -X ${VERSION_PKG}.Tag=${TAG}" -o /omni-linux-amd64 + +# builds omni-linux-arm64 +FROM base AS omni-linux-arm64-build +COPY --from=generate / / +COPY --from=embed-generate / / +WORKDIR /src/cmd/omni +ARG GO_BUILDFLAGS +ARG GO_LDFLAGS +ARG VERSION_PKG="internal/version" +ARG SHA +ARG TAG +RUN --mount=type=cache,target=/root/.cache/go-build --mount=type=cache,target=/go/pkg GOARCH=arm64 GOOS=linux go build ${GO_BUILDFLAGS} -ldflags "${GO_LDFLAGS} -X ${VERSION_PKG}.Name=omni -X ${VERSION_PKG}.SHA=${SHA} -X ${VERSION_PKG}.Tag=${TAG}" -o /omni-linux-arm64 + +# builds omnictl-darwin-amd64 +FROM base AS omnictl-darwin-amd64-build +COPY --from=generate / / +COPY --from=embed-generate / / +WORKDIR /src/cmd/omnictl +ARG GO_BUILDFLAGS +ARG GO_LDFLAGS +ARG VERSION_PKG="internal/version" +ARG SHA +ARG TAG +RUN --mount=type=cache,target=/root/.cache/go-build --mount=type=cache,target=/go/pkg GOARCH=amd64 GOOS=darwin go build ${GO_BUILDFLAGS} -ldflags "${GO_LDFLAGS} -X ${VERSION_PKG}.Name=omnictl -X ${VERSION_PKG}.SHA=${SHA} -X ${VERSION_PKG}.Tag=${TAG}" -o /omnictl-darwin-amd64 + +# builds omnictl-darwin-arm64 +FROM base AS omnictl-darwin-arm64-build +COPY --from=generate / / +COPY --from=embed-generate / / +WORKDIR /src/cmd/omnictl +ARG GO_BUILDFLAGS +ARG GO_LDFLAGS +ARG VERSION_PKG="internal/version" +ARG SHA +ARG TAG +RUN --mount=type=cache,target=/root/.cache/go-build --mount=type=cache,target=/go/pkg GOARCH=arm64 GOOS=darwin go build ${GO_BUILDFLAGS} -ldflags "${GO_LDFLAGS} -X ${VERSION_PKG}.Name=omnictl -X ${VERSION_PKG}.SHA=${SHA} -X ${VERSION_PKG}.Tag=${TAG}" -o /omnictl-darwin-arm64 + +# builds omnictl-linux-amd64 +FROM base AS omnictl-linux-amd64-build +COPY --from=generate / / +COPY --from=embed-generate / / +WORKDIR /src/cmd/omnictl +ARG GO_BUILDFLAGS +ARG GO_LDFLAGS +ARG VERSION_PKG="internal/version" +ARG SHA +ARG TAG +RUN --mount=type=cache,target=/root/.cache/go-build --mount=type=cache,target=/go/pkg GOARCH=amd64 GOOS=linux go build ${GO_BUILDFLAGS} -ldflags "${GO_LDFLAGS} -X ${VERSION_PKG}.Name=omnictl -X ${VERSION_PKG}.SHA=${SHA} -X ${VERSION_PKG}.Tag=${TAG}" -o /omnictl-linux-amd64 + +# builds omnictl-linux-arm64 +FROM base AS omnictl-linux-arm64-build +COPY --from=generate / / +COPY --from=embed-generate / / +WORKDIR /src/cmd/omnictl +ARG GO_BUILDFLAGS +ARG GO_LDFLAGS +ARG VERSION_PKG="internal/version" +ARG SHA +ARG TAG +RUN --mount=type=cache,target=/root/.cache/go-build --mount=type=cache,target=/go/pkg GOARCH=arm64 GOOS=linux go build ${GO_BUILDFLAGS} -ldflags "${GO_LDFLAGS} -X ${VERSION_PKG}.Name=omnictl -X ${VERSION_PKG}.SHA=${SHA} -X ${VERSION_PKG}.Tag=${TAG}" -o /omnictl-linux-arm64 + +# builds omnictl-windows-amd64.exe +FROM base AS omnictl-windows-amd64.exe-build +COPY --from=generate / / +COPY --from=embed-generate / / +WORKDIR /src/cmd/omnictl +ARG GO_BUILDFLAGS +ARG GO_LDFLAGS +ARG VERSION_PKG="internal/version" +ARG SHA +ARG TAG +RUN --mount=type=cache,target=/root/.cache/go-build --mount=type=cache,target=/go/pkg GOARCH=amd64 GOOS=windows go build ${GO_BUILDFLAGS} -ldflags "${GO_LDFLAGS} -X ${VERSION_PKG}.Name=omnictl -X ${VERSION_PKG}.SHA=${SHA} -X ${VERSION_PKG}.Tag=${TAG}" -o /omnictl-windows-amd64.exe + +FROM scratch AS omni-darwin-amd64 +COPY --from=omni-darwin-amd64-build /omni-darwin-amd64 /omni-darwin-amd64 + +FROM scratch AS omni-darwin-arm64 +COPY --from=omni-darwin-arm64-build /omni-darwin-arm64 /omni-darwin-arm64 + +FROM scratch AS omni-integration-test-linux-amd64 +COPY --from=omni-integration-test-linux-amd64-build /omni-integration-test-linux-amd64 /omni-integration-test-linux-amd64 + +FROM scratch AS omni-linux-amd64 +COPY --from=omni-linux-amd64-build /omni-linux-amd64 /omni-linux-amd64 + +FROM scratch AS omni-linux-arm64 +COPY --from=omni-linux-arm64-build /omni-linux-arm64 /omni-linux-arm64 + +FROM scratch AS omnictl-darwin-amd64 +COPY --from=omnictl-darwin-amd64-build /omnictl-darwin-amd64 /omnictl-darwin-amd64 + +FROM scratch AS omnictl-darwin-arm64 +COPY --from=omnictl-darwin-arm64-build /omnictl-darwin-arm64 /omnictl-darwin-arm64 + +FROM scratch AS omnictl-linux-amd64 +COPY --from=omnictl-linux-amd64-build /omnictl-linux-amd64 /omnictl-linux-amd64 + +FROM scratch AS omnictl-linux-arm64 +COPY --from=omnictl-linux-arm64-build /omnictl-linux-arm64 /omnictl-linux-arm64 + +FROM scratch AS omnictl-windows-amd64.exe +COPY --from=omnictl-windows-amd64.exe-build /omnictl-windows-amd64.exe /omnictl-windows-amd64.exe + +FROM omni-integration-test-linux-${TARGETARCH} AS omni-integration-test + +FROM scratch AS omni-integration-test-all +COPY --from=omni-integration-test-linux-amd64 / / + +FROM omni-linux-${TARGETARCH} AS omni + +FROM scratch AS omni-all +COPY --from=omni-darwin-amd64 / / +COPY --from=omni-darwin-arm64 / / +COPY --from=omni-linux-amd64 / / +COPY --from=omni-linux-arm64 / / + +FROM omnictl-linux-${TARGETARCH} AS omnictl + +FROM scratch AS omnictl-all +COPY --from=omnictl-darwin-amd64 / / +COPY --from=omnictl-darwin-arm64 / / +COPY --from=omnictl-linux-amd64 / / +COPY --from=omnictl-linux-arm64 / / +COPY --from=omnictl-windows-amd64.exe / / + +FROM scratch AS image-omni +ARG TARGETARCH +COPY --from=omni omni-linux-${TARGETARCH} /omni +COPY --from=omni omni-linux-${TARGETARCH} /omni +COPY --from=image-fhs / / +COPY --from=image-ca-certificates / / +COPY --from=omnictl-all / /omnictl/ +LABEL org.opencontainers.image.source https://github.com/siderolabs/omni +ENTRYPOINT ["/omni"] + diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..1b42f0fd --- /dev/null +++ b/LICENSE @@ -0,0 +1,95 @@ +Business Source License 1.1 + +Parameters + +Licensor: Sidero Labs, Inc. +Licensed Work: Omni + The Licensed Work is (c) 2024 Sidero Labs, Inc. +Additional Use Grant: None + +Change Date: 2028-02-22 + +Change License: Mozilla Public License, version 2.0 + +For information about alternative licensing arrangements for the Software, +please visit: https://www.siderolabs.com/contact/ + +Notice + +The Business Source License (this document, or the "License") is not an Open +Source license. However, the Licensed Work will eventually be made available +under an Open Source License, as stated in this License. + +License text copyright (c) 2017 MariaDB Corporation Ab, All Rights Reserved. +"Business Source License" is a trademark of MariaDB Corporation Ab. + +----------------------------------------------------------------------------- + +Business Source License 1.1 + +Terms + +The Licensor hereby grants you the right to copy, modify, create derivative +works, redistribute, and make non-production use of the Licensed Work. The +Licensor may make an Additional Use Grant, above, permitting limited +production use. + +Effective on the Change Date, or the fourth anniversary of the first publicly +available distribution of a specific version of the Licensed Work under this +License, whichever comes first, the Licensor hereby grants you rights under +the terms of the Change License, and the rights granted in the paragraph +above terminate. + +If your use of the Licensed Work does not comply with the requirements +currently in effect as described in this License, you must purchase a +commercial license from the Licensor, its affiliated entities, or authorized +resellers, or you must refrain from using the Licensed Work. + +All copies of the original and modified Licensed Work, and derivative works +of the Licensed Work, are subject to this License. This License applies +separately for each version of the Licensed Work and the Change Date may vary +for each version of the Licensed Work released by Licensor. + +You must conspicuously display this License on each original or modified copy +of the Licensed Work. If you receive the Licensed Work in original or +modified form from a third party, the terms and conditions set forth in this +License apply to your use of that work. + +Any use of the Licensed Work in violation of this License will automatically +terminate your rights under this License for the current and all other +versions of the Licensed Work. + +This License does not grant you any right in any trademark or logo of +Licensor or its affiliates (provided that you may use a trademark or logo of +Licensor as expressly required by this License). + +TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON +AN "AS IS" BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, +EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND +TITLE. + +MariaDB hereby grants you permission to use this License’s text to license +your works, and to refer to it using the trademark "Business Source License", +as long as you comply with the Covenants of Licensor below. + +Covenants of Licensor + +In consideration of the right to use this License’s text and the "Business +Source License" name and trademark, Licensor covenants to MariaDB, and to all +other recipients of the licensed work to be provided by Licensor: + +1. To specify as the Change License the GPL Version 2.0 or any later version, + or a license that is compatible with GPL Version 2.0 or a later version, + where "compatible" means that software provided under the Change License can + be included in a program with software provided under GPL Version 2.0 or a + later version. Licensor may specify additional Change Licenses without + limitation. + +2. To either: (a) specify an additional grant of rights to use that does not + impose any additional restriction on the right granted in this License, as + the Additional Use Grant; or (b) insert the text "None". + +3. To specify a Change Date. + +4. Not to modify this License in any other way. diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..bc546a6b --- /dev/null +++ b/Makefile @@ -0,0 +1,365 @@ +# THIS FILE WAS AUTOMATICALLY GENERATED, PLEASE DO NOT EDIT. +# +# Generated on 2024-02-26T21:35:48Z by kres latest. + +# common variables + +SHA := $(shell git describe --match=none --always --abbrev=8 --dirty) +TAG := $(shell git describe --tag --always --dirty) +ABBREV_TAG := $(shell git describe --tags >/dev/null 2>/dev/null && git describe --tag --always --match v[0-9]\* --abbrev=0 || echo 'undefined') +BRANCH := $(shell git rev-parse --abbrev-ref HEAD) +ARTIFACTS := _out +WITH_DEBUG ?= false +WITH_RACE ?= false +REGISTRY ?= ghcr.io +USERNAME ?= siderolabs +REGISTRY_AND_USERNAME ?= $(REGISTRY)/$(USERNAME) +PROTOBUF_GRPC_GATEWAY_TS_VERSION ?= 1.2.1 +TESTPKGS ?= ./... +NODE_BUILD_ARGS ?= +PROTOBUF_GO_VERSION ?= 1.32.0 +GRPC_GO_VERSION ?= 1.3.0 +GRPC_GATEWAY_VERSION ?= 2.19.1 +VTPROTOBUF_VERSION ?= 0.6.0 +DEEPCOPY_VERSION ?= v0.5.6 +GOLANGCILINT_VERSION ?= v1.56.2 +GOFUMPT_VERSION ?= v0.6.0 +GO_VERSION ?= 1.22.0 +GOIMPORTS_VERSION ?= v0.18.0 +GO_BUILDFLAGS ?= +GO_LDFLAGS ?= +CGO_ENABLED ?= 0 +GOTOOLCHAIN ?= local +KRES_IMAGE ?= ghcr.io/siderolabs/kres:latest +CONFORMANCE_IMAGE ?= ghcr.io/siderolabs/conform:latest + +# docker build settings + +BUILD := docker buildx build +PLATFORM ?= linux/amd64 +PROGRESS ?= auto +PUSH ?= false +CI_ARGS ?= +COMMON_ARGS = --file=Dockerfile +COMMON_ARGS += --provenance=false +COMMON_ARGS += --progress=$(PROGRESS) +COMMON_ARGS += --platform=$(PLATFORM) +COMMON_ARGS += --push=$(PUSH) +COMMON_ARGS += --build-arg=ARTIFACTS="$(ARTIFACTS)" +COMMON_ARGS += --build-arg=SHA="$(SHA)" +COMMON_ARGS += --build-arg=TAG="$(TAG)" +COMMON_ARGS += --build-arg=ABBREV_TAG="$(ABBREV_TAG)" +COMMON_ARGS += --build-arg=USERNAME="$(USERNAME)" +COMMON_ARGS += --build-arg=REGISTRY="$(REGISTRY)" +COMMON_ARGS += --build-arg=JS_TOOLCHAIN="$(JS_TOOLCHAIN)" +COMMON_ARGS += --build-arg=PROTOBUF_GRPC_GATEWAY_TS_VERSION="$(PROTOBUF_GRPC_GATEWAY_TS_VERSION)" +COMMON_ARGS += --build-arg=NODE_BUILD_ARGS="$(NODE_BUILD_ARGS)" +COMMON_ARGS += --build-arg=TOOLCHAIN="$(TOOLCHAIN)" +COMMON_ARGS += --build-arg=CGO_ENABLED="$(CGO_ENABLED)" +COMMON_ARGS += --build-arg=GO_BUILDFLAGS="$(GO_BUILDFLAGS)" +COMMON_ARGS += --build-arg=GO_LDFLAGS="$(GO_LDFLAGS)" +COMMON_ARGS += --build-arg=GOTOOLCHAIN="$(GOTOOLCHAIN)" +COMMON_ARGS += --build-arg=GOEXPERIMENT="$(GOEXPERIMENT)" +COMMON_ARGS += --build-arg=PROTOBUF_GO_VERSION="$(PROTOBUF_GO_VERSION)" +COMMON_ARGS += --build-arg=GRPC_GO_VERSION="$(GRPC_GO_VERSION)" +COMMON_ARGS += --build-arg=GRPC_GATEWAY_VERSION="$(GRPC_GATEWAY_VERSION)" +COMMON_ARGS += --build-arg=VTPROTOBUF_VERSION="$(VTPROTOBUF_VERSION)" +COMMON_ARGS += --build-arg=DEEPCOPY_VERSION="$(DEEPCOPY_VERSION)" +COMMON_ARGS += --build-arg=GOLANGCILINT_VERSION="$(GOLANGCILINT_VERSION)" +COMMON_ARGS += --build-arg=GOIMPORTS_VERSION="$(GOIMPORTS_VERSION)" +COMMON_ARGS += --build-arg=GOFUMPT_VERSION="$(GOFUMPT_VERSION)" +COMMON_ARGS += --build-arg=TESTPKGS="$(TESTPKGS)" +JS_TOOLCHAIN ?= docker.io/node:21.6.2-alpine3.19 +TOOLCHAIN ?= docker.io/golang:1.22-alpine + +# extra variables + +REMOVE_VOLUMES ?= false + +# help menu + +export define HELP_MENU_HEADER +# Getting Started + +To build this project, you must have the following installed: + +- git +- make +- docker (19.03 or higher) + +## Creating a Builder Instance + +The build process makes use of experimental Docker features (buildx). +To enable experimental features, add 'experimental: "true"' to '/etc/docker/daemon.json' on +Linux or enable experimental features in Docker GUI for Windows or Mac. + +To create a builder instance, run: + + docker buildx create --name local --use + +If running builds that needs to be cached aggresively create a builder instance with the following: + + docker buildx create --name local --use --config=config.toml + +config.toml contents: + +[worker.oci] + gc = true + gckeepstorage = 50000 + + [[worker.oci.gcpolicy]] + keepBytes = 10737418240 + keepDuration = 604800 + filters = [ "type==source.local", "type==exec.cachemount", "type==source.git.checkout"] + [[worker.oci.gcpolicy]] + all = true + keepBytes = 53687091200 + +If you already have a compatible builder instance, you may use that instead. + +## Artifacts + +All artifacts will be output to ./$(ARTIFACTS). Images will be tagged with the +registry "$(REGISTRY)", username "$(USERNAME)", and a dynamic tag (e.g. $(IMAGE):$(TAG)). +The registry and username can be overridden by exporting REGISTRY, and USERNAME +respectively. + +endef + +ifneq (, $(filter $(WITH_RACE), t true TRUE y yes 1)) +GO_BUILDFLAGS += -race +CGO_ENABLED := 1 +GO_LDFLAGS += -linkmode=external -extldflags '-static' +endif + +ifneq (, $(filter $(WITH_DEBUG), t true TRUE y yes 1)) +GO_BUILDFLAGS += -tags sidero.debug +else +GO_LDFLAGS += -s +endif + +all: unit-tests-frontend lint-eslint frontend unit-tests-client unit-tests omni image-omni omni-integration-test omnictl dev-server docker-compose-up docker-compose-down mkcert-install mkcert-generate mkcert-uninstall run-integration-test lint + +.PHONY: clean +clean: ## Cleans up all artifacts. + @rm -rf $(ARTIFACTS) + +target-%: ## Builds the specified target defined in the Dockerfile. The build result will only remain in the build cache. + @$(BUILD) --target=$* $(COMMON_ARGS) $(TARGET_ARGS) $(CI_ARGS) . + +local-%: ## Builds the specified target defined in the Dockerfile using the local output type. The build result will be output to the specified local destination. + @$(MAKE) target-$* TARGET_ARGS="--output=type=local,dest=$(DEST) $(TARGET_ARGS)" + +generate-frontend: ## Generate .proto definitions. + @$(MAKE) local-$@ DEST=./ + +.PHONY: js +js: ## Prepare js base toolchain. + @$(MAKE) target-$@ + +.PHONY: unit-tests-frontend +unit-tests-frontend: ## Performs unit tests + @$(MAKE) target-$@ + +lint-eslint: ## Runs eslint linter. + @$(MAKE) target-$@ + +.PHONY: $(ARTIFACTS)/frontend-js +$(ARTIFACTS)/frontend-js: + @$(MAKE) target-frontend + +.PHONY: frontend +frontend: $(ARTIFACTS)/frontend-js ## Builds js release for frontend. + +generate: ## Generate .proto definitions. + @$(MAKE) local-$@ DEST=./ + +lint-golangci-lint-client: ## Runs golangci-lint linter. + @$(MAKE) target-$@ + +lint-gofumpt-client: ## Runs gofumpt linter. + @$(MAKE) target-$@ + +.PHONY: fmt +fmt: ## Formats the source code + @docker run --rm -it -v $(PWD):/src -w /src golang:$(GO_VERSION) \ + bash -c "export GOTOOLCHAIN=local; \ + export GO111MODULE=on; export GOPROXY=https://proxy.golang.org; \ + go install mvdan.cc/gofumpt@$(GOFUMPT_VERSION) && \ + gofumpt -w ." + +lint-govulncheck-client: ## Runs govulncheck linter. + @$(MAKE) target-$@ + +lint-goimports-client: ## Runs goimports linter. + @$(MAKE) target-$@ + +lint-golangci-lint: ## Runs golangci-lint linter. + @$(MAKE) target-$@ + +lint-gofumpt: ## Runs gofumpt linter. + @$(MAKE) target-$@ + +lint-govulncheck: ## Runs govulncheck linter. + @$(MAKE) target-$@ + +lint-goimports: ## Runs goimports linter. + @$(MAKE) target-$@ + +.PHONY: base +base: frontend ## Prepare base toolchain + @$(MAKE) target-$@ + +.PHONY: unit-tests-client +unit-tests-client: ## Performs unit tests + @$(MAKE) local-$@ DEST=$(ARTIFACTS) + +.PHONY: unit-tests-client-race +unit-tests-client-race: ## Performs unit tests with race detection enabled. + @$(MAKE) target-$@ + +.PHONY: unit-tests +unit-tests: ## Performs unit tests + @$(MAKE) local-$@ DEST=$(ARTIFACTS) + +.PHONY: unit-tests-race +unit-tests-race: ## Performs unit tests with race detection enabled. + @$(MAKE) target-$@ + +.PHONY: $(ARTIFACTS)/omni-darwin-amd64 +$(ARTIFACTS)/omni-darwin-amd64: + @$(MAKE) local-omni-darwin-amd64 DEST=$(ARTIFACTS) + +.PHONY: omni-darwin-amd64 +omni-darwin-amd64: $(ARTIFACTS)/omni-darwin-amd64 ## Builds executable for omni-darwin-amd64. + +.PHONY: $(ARTIFACTS)/omni-darwin-arm64 +$(ARTIFACTS)/omni-darwin-arm64: + @$(MAKE) local-omni-darwin-arm64 DEST=$(ARTIFACTS) + +.PHONY: omni-darwin-arm64 +omni-darwin-arm64: $(ARTIFACTS)/omni-darwin-arm64 ## Builds executable for omni-darwin-arm64. + +.PHONY: $(ARTIFACTS)/omni-linux-amd64 +$(ARTIFACTS)/omni-linux-amd64: + @$(MAKE) local-omni-linux-amd64 DEST=$(ARTIFACTS) + +.PHONY: omni-linux-amd64 +omni-linux-amd64: $(ARTIFACTS)/omni-linux-amd64 ## Builds executable for omni-linux-amd64. + +.PHONY: $(ARTIFACTS)/omni-linux-arm64 +$(ARTIFACTS)/omni-linux-arm64: + @$(MAKE) local-omni-linux-arm64 DEST=$(ARTIFACTS) + +.PHONY: omni-linux-arm64 +omni-linux-arm64: $(ARTIFACTS)/omni-linux-arm64 ## Builds executable for omni-linux-arm64. + +.PHONY: omni +omni: omni-darwin-amd64 omni-darwin-arm64 omni-linux-amd64 omni-linux-arm64 ## Builds executables for omni. + +.PHONY: lint-markdown +lint-markdown: ## Runs markdownlint. + @$(MAKE) target-$@ + +.PHONY: lint +lint: lint-golangci-lint-client lint-gofumpt-client lint-govulncheck-client lint-goimports-client lint-golangci-lint lint-gofumpt lint-govulncheck lint-goimports lint-markdown ## Run all linters for the project. + +.PHONY: image-omni +image-omni: ## Builds image for omni. + @$(MAKE) target-$@ TARGET_ARGS="--tag=$(REGISTRY)/$(USERNAME)/omni:$(TAG)" + +.PHONY: $(ARTIFACTS)/omni-integration-test-linux-amd64 +$(ARTIFACTS)/omni-integration-test-linux-amd64: + @$(MAKE) local-omni-integration-test-linux-amd64 DEST=$(ARTIFACTS) + +.PHONY: omni-integration-test-linux-amd64 +omni-integration-test-linux-amd64: $(ARTIFACTS)/omni-integration-test-linux-amd64 ## Builds executable for omni-integration-test-linux-amd64. + +.PHONY: omni-integration-test +omni-integration-test: omni-integration-test-linux-amd64 ## Builds executables for omni-integration-test. + +.PHONY: $(ARTIFACTS)/omnictl-darwin-amd64 +$(ARTIFACTS)/omnictl-darwin-amd64: + @$(MAKE) local-omnictl-darwin-amd64 DEST=$(ARTIFACTS) + +.PHONY: omnictl-darwin-amd64 +omnictl-darwin-amd64: $(ARTIFACTS)/omnictl-darwin-amd64 ## Builds executable for omnictl-darwin-amd64. + +.PHONY: $(ARTIFACTS)/omnictl-darwin-arm64 +$(ARTIFACTS)/omnictl-darwin-arm64: + @$(MAKE) local-omnictl-darwin-arm64 DEST=$(ARTIFACTS) + +.PHONY: omnictl-darwin-arm64 +omnictl-darwin-arm64: $(ARTIFACTS)/omnictl-darwin-arm64 ## Builds executable for omnictl-darwin-arm64. + +.PHONY: $(ARTIFACTS)/omnictl-linux-amd64 +$(ARTIFACTS)/omnictl-linux-amd64: + @$(MAKE) local-omnictl-linux-amd64 DEST=$(ARTIFACTS) + +.PHONY: omnictl-linux-amd64 +omnictl-linux-amd64: $(ARTIFACTS)/omnictl-linux-amd64 ## Builds executable for omnictl-linux-amd64. + +.PHONY: $(ARTIFACTS)/omnictl-linux-arm64 +$(ARTIFACTS)/omnictl-linux-arm64: + @$(MAKE) local-omnictl-linux-arm64 DEST=$(ARTIFACTS) + +.PHONY: omnictl-linux-arm64 +omnictl-linux-arm64: $(ARTIFACTS)/omnictl-linux-arm64 ## Builds executable for omnictl-linux-arm64. + +.PHONY: $(ARTIFACTS)/omnictl-windows-amd64.exe +$(ARTIFACTS)/omnictl-windows-amd64.exe: + @$(MAKE) local-omnictl-windows-amd64.exe DEST=$(ARTIFACTS) + +.PHONY: omnictl-windows-amd64.exe +omnictl-windows-amd64.exe: $(ARTIFACTS)/omnictl-windows-amd64.exe ## Builds executable for omnictl-windows-amd64.exe. + +.PHONY: omnictl +omnictl: omnictl-darwin-amd64 omnictl-darwin-arm64 omnictl-linux-amd64 omnictl-linux-arm64 omnictl-windows-amd64.exe ## Builds executables for omnictl. + +.PHONY: dev-server +dev-server: + hack/dev-server.sh + +.PHONY: docker-compose-up +docker-compose-up: + ARTIFACTS="$(ARTIFACTS)" SHA="$(SHA)" TAG="$(TAG)" USERNAME="$(USERNAME)" REGISTRY="$(REGISTRY)" JS_TOOLCHAIN="$(JS_TOOLCHAIN)" PROTOBUF_TS_VERSION="$(PROTOBUF_TS_VERSION)" PROTOBUF_GRPC_GATEWAY_TS_VERSION="$(PROTOBUF_GRPC_GATEWAY_TS_VERSION)" NODE_BUILD_ARGS="$(NODE_BUILD_ARGS)" TOOLCHAIN="$(TOOLCHAIN)" CGO_ENABLED="$(CGO_ENABLED)" GO_BUILDFLAGS="$(GO_BUILDFLAGS)" GOLANGCILINT_VERSION="$(GOLANGCILINT_VERSION)" GOFUMPT_VERSION="$(GOFUMPT_VERSION)" GOIMPORTS_VERSION="$(GOIMPORTS_VERSION)" PROTOBUF_GO_VERSION="$(PROTOBUF_GO_VERSION)" GRPC_GO_VERSION="$(GRPC_GO_VERSION)" GRPC_GATEWAY_VERSION="$(GRPC_GATEWAY_VERSION)" VTPROTOBUF_VERSION="$(VTPROTOBUF_VERSION)" DEEPCOPY_VERSION="$(DEEPCOPY_VERSION)" TESTPKGS="$(TESTPKGS)" COMPOSE_DOCKER_CLI_BUILD=1 DOCKER_BUILDKIT=1 GO_LDFLAGS="$(GO_LDFLAGS)" docker compose --file ./hack/compose/docker-compose.yml --file ./hack/compose/docker-compose.override.yml up --build + +.PHONY: docker-compose-down +docker-compose-down: + ARTIFACTS="$(ARTIFACTS)" SHA="$(SHA)" TAG="$(TAG)" USERNAME="$(USERNAME)" REGISTRY="$(REGISTRY)" JS_TOOLCHAIN="$(JS_TOOLCHAIN)" PROTOBUF_TS_VERSION="$(PROTOBUF_TS_VERSION)" PROTOBUF_GRPC_GATEWAY_TS_VERSION="$(PROTOBUF_GRPC_GATEWAY_TS_VERSION)" NODE_BUILD_ARGS="$(NODE_BUILD_ARGS)" TOOLCHAIN="$(TOOLCHAIN)" CGO_ENABLED="$(CGO_ENABLED)" GO_BUILDFLAGS="$(GO_BUILDFLAGS)" GOLANGCILINT_VERSION="$(GOLANGCILINT_VERSION)" GOFUMPT_VERSION="$(GOFUMPT_VERSION)" GOIMPORTS_VERSION="$(GOIMPORTS_VERSION)" PROTOBUF_GO_VERSION="$(PROTOBUF_GO_VERSION)" GRPC_GO_VERSION="$(GRPC_GO_VERSION)" GRPC_GATEWAY_VERSION="$(GRPC_GATEWAY_VERSION)" VTPROTOBUF_VERSION="$(VTPROTOBUF_VERSION)" DEEPCOPY_VERSION="$(DEEPCOPY_VERSION)" TESTPKGS="$(TESTPKGS)" COMPOSE_DOCKER_CLI_BUILD=1 DOCKER_BUILDKIT=1 GO_LDFLAGS="$(GO_LDFLAGS)" docker compose --file ./hack/compose/docker-compose.yml --file ./hack/compose/docker-compose.override.yml down --rmi local --remove-orphans --volumes=$(REMOVE_VOLUMES) + +.PHONY: mkcert-install +mkcert-install: + go run ./hack/generate-certs install + +.PHONY: mkcert-generate +mkcert-generate: + go run ./hack/generate-certs -config ./hack/generate-certs.yml generate + +.PHONY: mkcert-uninstall +mkcert-uninstall: + go run ./hack/generate-certs uninstall + +run-integration-test: omni-integration-test-linux-amd64 omnictl-linux-amd64 omni-linux-amd64 + @hack/test/integration.sh + +.PHONY: rekres +rekres: + @docker pull $(KRES_IMAGE) + @docker run --rm --net=host --user $(shell id -u):$(shell id -g) -v $(PWD):/src -w /src -e GITHUB_TOKEN $(KRES_IMAGE) + +.PHONY: help +help: ## This help menu. + @echo "$$HELP_MENU_HEADER" + @grep -E '^[a-zA-Z%_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' + +.PHONY: release-notes +release-notes: + mkdir -p $(ARTIFACTS) + @ARTIFACTS=$(ARTIFACTS) ./hack/release.sh $@ $(ARTIFACTS)/RELEASE_NOTES.md $(TAG) + +.PHONY: conformance +conformance: + @docker pull $(CONFORMANCE_IMAGE) + @docker run --rm -it -v $(PWD):/src -w /src $(CONFORMANCE_IMAGE) enforce + diff --git a/README.md b/README.md new file mode 100644 index 00000000..aaa3eff6 --- /dev/null +++ b/README.md @@ -0,0 +1,70 @@ +<!-- markdownlint-disable first-line-heading sentences-per-line --> + +<p align="center"> + <h1 align="center">Omni</h1> + <p align="center">SaaS-simple deployment of Kubernetes - on your own hardware.</p> + <p align="center"> + <a href="https://github.com/siderolabs/omni/releases/latest"> + <img alt="Release" src="https://img.shields.io/github/release/siderolabs/omni.svg?logo=github&logoColor=white&style=flat-square"> + </a> + <a href="https://github.com/siderolabs/omni/releases/latest"> + <img alt="Pre-release" src="https://img.shields.io/github/release-pre/siderolabs/omni.svg?label=pre-release&logo=GitHub&logoColor=white&style=flat-square"> + </a> + </p> +</p> + +--- + +Kubernetes is wonderful, but requires scarce time and expertise to set up and manage. +Other solutions demand you have already set up Linux correctly, have all your servers in the same network, and meet their other criteria. +And hybrid clusters that span cloud and data center? +Good luck with that! + +Omni allows you to start with bare metal, virtual machines or a cloud provider, and create clusters spanning all of your locations, with a few clicks. + +You provide the machines – edge compute, bare metal, VMs, or in your cloud account. Boot from an Omni image. Click to allocate to a cluster. That’s it! + +- Vanilla Kubernetes, on your machines, under your control. +- Elegant UI for management and operations +- Security taken care of – ties into your Enterprise ID provider +- Highly Available Kubernetes API endpoint built in +- Firewall friendly. Manage Edge nodes securely +- From single-node clusters to the largest scale +- Support for GPUs and most CSIs. + +## Development + +For instructions on developing Omni, see [DEVELOPMENT.md](DEVELOPMENT.md). + +## Community + +- Support: Questions, bugs, feature requests [GitHub Issues](https://github.com/siderolabs/omni/issues) +- Slack: Join our [slack channel](https://slack.dev.talos-systems.io) +- Twitter: [@SideroLabs](https://twitter.com/SideroLabs) +- Email: [info@SideroLabs.com](mailto:info@SideroLabs.com) + +If you're interested in this project and would like to help in engineering efforts or have general usage questions, we are happy to have you! +We hold a weekly meeting that all audiences are welcome to attend. + +### Office Hours + +- When: Mondays at 16:30 UTC. +- Where: [Google Meet](https://meet.google.com/day-pxhv-zky). + +You can subscribe to this meeting by joining the community forum above. + +> Note: You can convert the meeting hours to your [local time](https://everytimezone.com/s/599e61d6). + +## Contributing + +Contributions are welcomed and appreciated! +See [Contributing](CONTRIBUTING.md) for our guidelines. + +## Licenses + +The Omni code is released under a combination of two licenses: + +- The main Omni Server code is licensed under [Business Source License 1.1 (BSL-1.1)](LICENSE). +- The [Omni client library](client) is licensed under [Mozilla Public License 2.0 (MPL-2.0)](client/LICENSE). + +When contributing to an Omni feature, you can find the relevant license in the comments at the top of each file. diff --git a/client/.golangci.yml b/client/.golangci.yml new file mode 100644 index 00000000..894c4c4d --- /dev/null +++ b/client/.golangci.yml @@ -0,0 +1,178 @@ +# THIS FILE WAS AUTOMATICALLY GENERATED, PLEASE DO NOT EDIT. +# +# Generated on 2024-02-09T09:47:03Z by kres decf506. + +# options for analysis running +run: + timeout: 10m + issues-exit-code: 1 + tests: true + build-tags: [] + skip-dirs: [] + skip-dirs-use-default: true + skip-files: [] + modules-download-mode: readonly + +# output configuration options +output: + format: colored-line-number + print-issued-lines: true + print-linter-name: true + uniq-by-line: true + path-prefix: "" + +# all available settings of specific linters +linters-settings: + dogsled: + max-blank-identifiers: 2 + dupl: + threshold: 150 + errcheck: + check-type-assertions: true + check-blank: true + exhaustive: + default-signifies-exhaustive: false + funlen: + lines: 60 + statements: 40 + gci: + local-prefixes: github.com/siderolabs/omni/client/ + gocognit: + min-complexity: 30 + ireturn: + allow: + - anon + - error + - empty + - stdlib + - github.com\/talos-systems\/kres\/internal\/dag.Node + nestif: + min-complexity: 5 + goconst: + min-len: 3 + min-occurrences: 3 + gocritic: + disabled-checks: [] + gocyclo: + min-complexity: 20 + godot: + check-all: false + godox: + keywords: # default keywords are TODO, BUG, and FIXME, these can be overwritten by this setting + - NOTE + - OPTIMIZE # marks code that should be optimized before merging + - HACK # marks hack-arounds that should be removed before merging + gofmt: + simplify: true + goimports: + local-prefixes: github.com/siderolabs/omni/client/ + golint: + min-confidence: 0.8 + gomnd: + settings: {} + gomodguard: {} + govet: + check-shadowing: true + enable-all: true + lll: + line-length: 200 + tab-width: 4 + misspell: + locale: US + ignore-words: [] + nakedret: + max-func-lines: 30 + prealloc: + simple: true + range-loops: true # Report preallocation suggestions on range loops, true by default + for-loops: false # Report preallocation suggestions on for loops, false by default + nolintlint: + allow-unused: false + allow-leading-space: false + allow-no-explanation: [] + require-explanation: false + require-specific: true + rowserrcheck: {} + testpackage: {} + unparam: + check-exported: false + unused: + check-exported: false + whitespace: + multi-if: false # Enforces newlines (or comments) after every multi-line if statement + multi-func: false # Enforces newlines (or comments) after every multi-line function signature + wsl: + strict-append: true + allow-assign-and-call: true + allow-multiline-assign: true + allow-cuddle-declarations: false + allow-trailing-comment: false + force-case-trailing-whitespace: 0 + force-err-cuddling: false + allow-separated-leading-comment: false + gofumpt: + extra-rules: false + cyclop: + # the maximal code complexity to report + max-complexity: 20 + # depguard: + # Main: + # deny: + # - github.com/OpenPeeDeeP/depguard # this is just an example + +linters: + enable-all: true + disable-all: false + fast: false + disable: + - exhaustruct + - exhaustivestruct + - forbidigo + - funlen + - gas + - gochecknoglobals + - gochecknoinits + - godox + - goerr113 + - gomnd + - gomoddirectives + - ireturn + - nestif + - nonamedreturns + - nosnakecase + - paralleltest + - tagliatelle + - thelper + - typecheck + - varnamelen + - wrapcheck + - depguard # Disabled because starting with golangci-lint 1.53.0 it doesn't allow denylist alone anymore + - tagalign + - inamedparam + - testifylint # complains about our assert recorder and has a number of false positives for assert.Greater(t, thing, 1) + - protogetter # complains about us using Value field on typed spec, instead of GetValue which has a different signature + - perfsprint # complains about us using fmt.Sprintf in non-performance critical code, updating just kres took too long + # abandoned linters for which golangci shows the warning that the repo is archived by the owner + - interfacer + - maligned + - golint + - scopelint + - varcheck + - deadcode + - structcheck + - ifshort + # disabled as it seems to be broken - goes into imported libraries and reports issues there + - musttag + +issues: + exclude: [] + exclude-rules: [] + exclude-use-default: false + exclude-case-sensitive: false + max-issues-per-linter: 10 + max-same-issues: 3 + new: false + +severity: + default-severity: error + case-sensitive: false diff --git a/client/.license-header.go.txt b/client/.license-header.go.txt new file mode 100644 index 00000000..66e08199 --- /dev/null +++ b/client/.license-header.go.txt @@ -0,0 +1,3 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. diff --git a/client/CONTRIBUTING.md b/client/CONTRIBUTING.md new file mode 100644 index 00000000..cbfa41b6 --- /dev/null +++ b/client/CONTRIBUTING.md @@ -0,0 +1,6 @@ +# Contributing + +## Developer Certificate of Origin + +All commits require a [DCO](https://developercertificate.org/) sign-off. +This is done by committing with the `--signoff` flag. \ No newline at end of file diff --git a/client/LICENSE b/client/LICENSE new file mode 100644 index 00000000..a612ad98 --- /dev/null +++ b/client/LICENSE @@ -0,0 +1,373 @@ +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. diff --git a/client/README.md b/client/README.md new file mode 100644 index 00000000..cca71f6f --- /dev/null +++ b/client/README.md @@ -0,0 +1,41 @@ +<!-- markdownlint-disable MD041 --> + +<p align="center"> + <h1 align="center">Omni API</h1> + <p align="center">Omni client code and gRPC API libraries.</p> +</p> + +--- + +[**Omni**](https://www.siderolabs.com/platform/saas-for-kubernetes/) SaaS deployment of Kubernetes. +Omni is supported by the people at [Sidero Labs](https://www.SideroLabs.com/). +This respository contains client code and gRPC API definitions used to access Omni SaaS. + +## Documentation + +For instructions on using Omni, see the [Documentation](https://omni.siderolabs.com/docs/). + +## Community + +- Slack: Join our [slack channel](https://slack.dev.talos-systems.io) +- Support: Questions, bugs, feature requests [GitHub Discussions](https://github.com/talos-systems/talos/discussions) +- Forum: [community](https://groups.google.com/a/SideroLabs.com/forum/#!forum/community) +- Twitter: [@SideroLabs](https://twitter.com/SideroLabs) +- Email: [info@SideroLabs.com](mailto:info@SideroLabs.com) + +## Contributing + +Contributions are welcomed and appreciated! +See [Contributing](CONTRIBUTING.md) for our guidelines. + +## License + +<a href="https://github.com/siderolabs/omni/client/blob/main/LICENSE"> + <img alt="GitHub" src="https://img.shields.io/github/license/siderolabs/omni/client?style=flat-square"> +</a> + +Some software we distribute is under the General Public License family +of licenses or other licenses that require we provide you with the +source code. +If you would like a copy of the source code for this +software, please contact us via email: info at SideroLabs.com. diff --git a/client/api/common/common.proto b/client/api/common/common.proto new file mode 100644 index 00000000..97bb7fbb --- /dev/null +++ b/client/api/common/common.proto @@ -0,0 +1,116 @@ +syntax = "proto3"; + +package common; + +option go_package = "github.com/siderolabs/talos/pkg/machinery/api/common"; + +import "google/protobuf/any.proto"; +import "google/protobuf/descriptor.proto"; +import "google/rpc/status.proto"; + +// An alternative to using options could be extracting versions from comments. +// Unfortunately, they are not available: https://github.com/golang/protobuf/issues/1134 +// Also, while option numbers can be the same, +// names should be different: https://github.com/protocolbuffers/protobuf/issues/4861 + +extend google.protobuf.MessageOptions { + // Indicates the Talos version when this deprecated message will be removed from API. + string remove_deprecated_message = 93117; +} + +extend google.protobuf.FieldOptions { + // Indicates the Talos version when this deprecated filed will be removed from API. + string remove_deprecated_field = 93117; +} + +extend google.protobuf.EnumOptions { + // Indicates the Talos version when this deprecated enum will be removed from API. + string remove_deprecated_enum = 93117; +} + +extend google.protobuf.EnumValueOptions { + // Indicates the Talos version when this deprecated enum value will be removed from API. + string remove_deprecated_enum_value = 93117; +} + +extend google.protobuf.MethodOptions { + // Indicates the Talos version when this deprecated method will be removed from API. + string remove_deprecated_method = 93117; +} + +extend google.protobuf.ServiceOptions { + // Indicates the Talos version when this deprecated service will be removed from API. + string remove_deprecated_service = 93117; +} + +enum Code { + FATAL = 0; + LOCKED = 1; + CANCELED = 2; +} + +message Error { + Code code = 1; + string message = 2; + repeated google.protobuf.Any details = 3; +} + +// Common metadata message nested in all reply message types +message Metadata { + // hostname of the server response comes from (injected by proxy) + string hostname = 1; + // error is set if request failed to the upstream (rest of response is + // undefined) + string error = 2; + // error as gRPC Status + google.rpc.Status status = 3; +} + +message Data { + Metadata metadata = 1; + bytes bytes = 2; +} + +message DataResponse { + repeated Data messages = 1; +} + +message Empty { + Metadata metadata = 1; +} + +message EmptyResponse { + repeated Empty messages = 1; +} + +enum ContainerDriver { + CONTAINERD = 0; + CRI = 1; +} + +message URL { + string full_path = 1; +} + +message PEMEncodedCertificateAndKey { + bytes crt = 1; + bytes key = 2; +} + +message PEMEncodedKey { + bytes key = 1; +} + +message NetIP { + bytes ip = 1; +} + +message NetIPPort { + bytes ip = 1; + int32 port = 2; +} + +message NetIPPrefix { + bytes ip = 1; + int32 prefix_length = 2; +} diff --git a/client/api/common/omni.pb.go b/client/api/common/omni.pb.go new file mode 100644 index 00000000..1c770c9c --- /dev/null +++ b/client/api/common/omni.pb.go @@ -0,0 +1,206 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.32.0 +// protoc v4.24.4 +// source: common/omni.proto + +package common + +import ( + reflect "reflect" + sync "sync" + + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// Data source. +type Runtime int32 + +const ( + // Kubernetes control plane. + Runtime_Kubernetes Runtime = 0 + // Talos apid. + Runtime_Talos Runtime = 1 + // Omni internal runtime. + Runtime_Omni Runtime = 2 +) + +// Enum value maps for Runtime. +var ( + Runtime_name = map[int32]string{ + 0: "Kubernetes", + 1: "Talos", + 2: "Omni", + } + Runtime_value = map[string]int32{ + "Kubernetes": 0, + "Talos": 1, + "Omni": 2, + } +) + +func (x Runtime) Enum() *Runtime { + p := new(Runtime) + *p = x + return p +} + +func (x Runtime) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Runtime) Descriptor() protoreflect.EnumDescriptor { + return file_common_omni_proto_enumTypes[0].Descriptor() +} + +func (Runtime) Type() protoreflect.EnumType { + return &file_common_omni_proto_enumTypes[0] +} + +func (x Runtime) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use Runtime.Descriptor instead. +func (Runtime) EnumDescriptor() ([]byte, []int) { + return file_common_omni_proto_rawDescGZIP(), []int{0} +} + +// Context represents Kubernetes or Talos config source. +type Context struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Name fetches the config from the top level Kubeconfig or Talosconfig. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *Context) Reset() { + *x = Context{} + if protoimpl.UnsafeEnabled { + mi := &file_common_omni_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Context) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Context) ProtoMessage() {} + +func (x *Context) ProtoReflect() protoreflect.Message { + mi := &file_common_omni_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Context.ProtoReflect.Descriptor instead. +func (*Context) Descriptor() ([]byte, []int) { + return file_common_omni_proto_rawDescGZIP(), []int{0} +} + +func (x *Context) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +var File_common_omni_proto protoreflect.FileDescriptor + +var file_common_omni_proto_rawDesc = []byte{ + 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x6f, 0x6d, 0x6e, 0x69, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x22, 0x29, 0x0a, 0x07, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, + 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x2a, 0x2e, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x10, + 0x00, 0x12, 0x09, 0x0a, 0x05, 0x54, 0x61, 0x6c, 0x6f, 0x73, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, + 0x4f, 0x6d, 0x6e, 0x69, 0x10, 0x02, 0x42, 0x2e, 0x5a, 0x2c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x73, 0x69, 0x64, 0x65, 0x72, 0x6f, 0x6c, 0x61, 0x62, 0x73, 0x2f, + 0x6f, 0x6d, 0x6e, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_common_omni_proto_rawDescOnce sync.Once + file_common_omni_proto_rawDescData = file_common_omni_proto_rawDesc +) + +func file_common_omni_proto_rawDescGZIP() []byte { + file_common_omni_proto_rawDescOnce.Do(func() { + file_common_omni_proto_rawDescData = protoimpl.X.CompressGZIP(file_common_omni_proto_rawDescData) + }) + return file_common_omni_proto_rawDescData +} + +var file_common_omni_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_common_omni_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_common_omni_proto_goTypes = []interface{}{ + (Runtime)(0), // 0: common.Runtime + (*Context)(nil), // 1: common.Context +} +var file_common_omni_proto_depIdxs = []int32{ + 0, // [0:0] is the sub-list for method output_type + 0, // [0:0] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_common_omni_proto_init() } +func file_common_omni_proto_init() { + if File_common_omni_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_common_omni_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Context); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_common_omni_proto_rawDesc, + NumEnums: 1, + NumMessages: 1, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_common_omni_proto_goTypes, + DependencyIndexes: file_common_omni_proto_depIdxs, + EnumInfos: file_common_omni_proto_enumTypes, + MessageInfos: file_common_omni_proto_msgTypes, + }.Build() + File_common_omni_proto = out.File + file_common_omni_proto_rawDesc = nil + file_common_omni_proto_goTypes = nil + file_common_omni_proto_depIdxs = nil +} diff --git a/client/api/common/omni.proto b/client/api/common/omni.proto new file mode 100644 index 00000000..f70a74e8 --- /dev/null +++ b/client/api/common/omni.proto @@ -0,0 +1,22 @@ +syntax = "proto3"; + +package common; + +option go_package = "github.com/siderolabs/omni/client/api/common"; + +// Data source. +enum Runtime { + // Kubernetes control plane. + Kubernetes = 0; + // Talos apid. + Talos = 1; + // Omni internal runtime. + Omni = 2; +} +// Context represents Kubernetes or Talos config source. +message Context { + reserved 2, 3; + + // Name fetches the config from the top level Kubeconfig or Talosconfig. + string name = 1; +} diff --git a/client/api/common/omni_vtproto.pb.go b/client/api/common/omni_vtproto.pb.go new file mode 100644 index 00000000..7ee6648f --- /dev/null +++ b/client/api/common/omni_vtproto.pb.go @@ -0,0 +1,195 @@ +// Code generated by protoc-gen-go-vtproto. DO NOT EDIT. +// protoc-gen-go-vtproto version: v0.6.0 +// source: common/omni.proto + +package common + +import ( + fmt "fmt" + io "io" + + protohelpers "github.com/planetscale/vtprotobuf/protohelpers" + proto "google.golang.org/protobuf/proto" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +func (m *Context) CloneVT() *Context { + if m == nil { + return (*Context)(nil) + } + r := new(Context) + r.Name = m.Name + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *Context) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (this *Context) EqualVT(that *Context) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Name != that.Name { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *Context) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*Context) + if !ok { + return false + } + return this.EqualVT(that) +} +func (m *Context) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Context) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *Context) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *Context) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *Context) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Context: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Context: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} diff --git a/client/api/google/rpc/status.proto b/client/api/google/rpc/status.proto new file mode 100644 index 00000000..923e1693 --- /dev/null +++ b/client/api/google/rpc/status.proto @@ -0,0 +1,49 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.rpc; + +import "google/protobuf/any.proto"; + +option cc_enable_arenas = true; +option go_package = "google.golang.org/genproto/googleapis/rpc/status;status"; +option java_multiple_files = true; +option java_outer_classname = "StatusProto"; +option java_package = "com.google.rpc"; +option objc_class_prefix = "RPC"; + +// The `Status` type defines a logical error model that is suitable for +// different programming environments, including REST APIs and RPC APIs. It is +// used by [gRPC](https://github.com/grpc). Each `Status` message contains +// three pieces of data: error code, error message, and error details. +// +// You can find out more about this error model and how to work with it in the +// [API Design Guide](https://cloud.google.com/apis/design/errors). +message Status { + // The status code, which should be an enum value of + // [google.rpc.Code][google.rpc.Code]. + int32 code = 1; + + // A developer-facing error message, which should be in English. Any + // user-facing error message should be localized and sent in the + // [google.rpc.Status.details][google.rpc.Status.details] field, or localized + // by the client. + string message = 2; + + // A list of messages that carry the error details. There is a common set of + // message types for APIs to use. + repeated google.protobuf.Any details = 3; +} diff --git a/client/api/omni/management/management.pb.go b/client/api/omni/management/management.pb.go new file mode 100644 index 00000000..ea708bff --- /dev/null +++ b/client/api/omni/management/management.pb.go @@ -0,0 +1,1825 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.32.0 +// protoc v4.24.4 +// source: omni/management/management.proto + +package management + +import ( + reflect "reflect" + sync "sync" + + common "github.com/siderolabs/talos/pkg/machinery/api/common" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + durationpb "google.golang.org/protobuf/types/known/durationpb" + emptypb "google.golang.org/protobuf/types/known/emptypb" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type KubernetesSyncManifestResponse_ResponseType int32 + +const ( + KubernetesSyncManifestResponse_UNKNOWN KubernetesSyncManifestResponse_ResponseType = 0 + KubernetesSyncManifestResponse_MANIFEST KubernetesSyncManifestResponse_ResponseType = 1 + KubernetesSyncManifestResponse_ROLLOUT KubernetesSyncManifestResponse_ResponseType = 2 +) + +// Enum value maps for KubernetesSyncManifestResponse_ResponseType. +var ( + KubernetesSyncManifestResponse_ResponseType_name = map[int32]string{ + 0: "UNKNOWN", + 1: "MANIFEST", + 2: "ROLLOUT", + } + KubernetesSyncManifestResponse_ResponseType_value = map[string]int32{ + "UNKNOWN": 0, + "MANIFEST": 1, + "ROLLOUT": 2, + } +) + +func (x KubernetesSyncManifestResponse_ResponseType) Enum() *KubernetesSyncManifestResponse_ResponseType { + p := new(KubernetesSyncManifestResponse_ResponseType) + *p = x + return p +} + +func (x KubernetesSyncManifestResponse_ResponseType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (KubernetesSyncManifestResponse_ResponseType) Descriptor() protoreflect.EnumDescriptor { + return file_omni_management_management_proto_enumTypes[0].Descriptor() +} + +func (KubernetesSyncManifestResponse_ResponseType) Type() protoreflect.EnumType { + return &file_omni_management_management_proto_enumTypes[0] +} + +func (x KubernetesSyncManifestResponse_ResponseType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use KubernetesSyncManifestResponse_ResponseType.Descriptor instead. +func (KubernetesSyncManifestResponse_ResponseType) EnumDescriptor() ([]byte, []int) { + return file_omni_management_management_proto_rawDescGZIP(), []int{16, 0} +} + +type KubeconfigResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Kubeconfig is the kubeconfig for the cluster. + Kubeconfig []byte `protobuf:"bytes,1,opt,name=kubeconfig,proto3" json:"kubeconfig,omitempty"` +} + +func (x *KubeconfigResponse) Reset() { + *x = KubeconfigResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_management_management_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *KubeconfigResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*KubeconfigResponse) ProtoMessage() {} + +func (x *KubeconfigResponse) ProtoReflect() protoreflect.Message { + mi := &file_omni_management_management_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use KubeconfigResponse.ProtoReflect.Descriptor instead. +func (*KubeconfigResponse) Descriptor() ([]byte, []int) { + return file_omni_management_management_proto_rawDescGZIP(), []int{0} +} + +func (x *KubeconfigResponse) GetKubeconfig() []byte { + if x != nil { + return x.Kubeconfig + } + return nil +} + +type TalosconfigResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // talosconfig is the talos client configuration to access the cluster via the proxy. + Talosconfig []byte `protobuf:"bytes,1,opt,name=talosconfig,proto3" json:"talosconfig,omitempty"` +} + +func (x *TalosconfigResponse) Reset() { + *x = TalosconfigResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_management_management_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TalosconfigResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TalosconfigResponse) ProtoMessage() {} + +func (x *TalosconfigResponse) ProtoReflect() protoreflect.Message { + mi := &file_omni_management_management_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TalosconfigResponse.ProtoReflect.Descriptor instead. +func (*TalosconfigResponse) Descriptor() ([]byte, []int) { + return file_omni_management_management_proto_rawDescGZIP(), []int{1} +} + +func (x *TalosconfigResponse) GetTalosconfig() []byte { + if x != nil { + return x.Talosconfig + } + return nil +} + +type OmniconfigResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // omniconfig is the omnictl client configuration to access the omni instance. + Omniconfig []byte `protobuf:"bytes,1,opt,name=omniconfig,proto3" json:"omniconfig,omitempty"` +} + +func (x *OmniconfigResponse) Reset() { + *x = OmniconfigResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_management_management_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *OmniconfigResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OmniconfigResponse) ProtoMessage() {} + +func (x *OmniconfigResponse) ProtoReflect() protoreflect.Message { + mi := &file_omni_management_management_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use OmniconfigResponse.ProtoReflect.Descriptor instead. +func (*OmniconfigResponse) Descriptor() ([]byte, []int) { + return file_omni_management_management_proto_rawDescGZIP(), []int{2} +} + +func (x *OmniconfigResponse) GetOmniconfig() []byte { + if x != nil { + return x.Omniconfig + } + return nil +} + +type MachineLogsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // MachineId is the ID of the machine. + MachineId string `protobuf:"bytes,1,opt,name=machine_id,json=machineId,proto3" json:"machine_id,omitempty"` + // Follow is whether to follow the logs. + Follow bool `protobuf:"varint,2,opt,name=follow,proto3" json:"follow,omitempty"` + // TailLines is the number of lines to tail. + TailLines int32 `protobuf:"varint,3,opt,name=tail_lines,json=tailLines,proto3" json:"tail_lines,omitempty"` +} + +func (x *MachineLogsRequest) Reset() { + *x = MachineLogsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_management_management_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MachineLogsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MachineLogsRequest) ProtoMessage() {} + +func (x *MachineLogsRequest) ProtoReflect() protoreflect.Message { + mi := &file_omni_management_management_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MachineLogsRequest.ProtoReflect.Descriptor instead. +func (*MachineLogsRequest) Descriptor() ([]byte, []int) { + return file_omni_management_management_proto_rawDescGZIP(), []int{3} +} + +func (x *MachineLogsRequest) GetMachineId() string { + if x != nil { + return x.MachineId + } + return "" +} + +func (x *MachineLogsRequest) GetFollow() bool { + if x != nil { + return x.Follow + } + return false +} + +func (x *MachineLogsRequest) GetTailLines() int32 { + if x != nil { + return x.TailLines + } + return 0 +} + +type ValidateConfigRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Config represents raw configuration string to validate. + Config string `protobuf:"bytes,1,opt,name=config,proto3" json:"config,omitempty"` +} + +func (x *ValidateConfigRequest) Reset() { + *x = ValidateConfigRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_management_management_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ValidateConfigRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ValidateConfigRequest) ProtoMessage() {} + +func (x *ValidateConfigRequest) ProtoReflect() protoreflect.Message { + mi := &file_omni_management_management_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ValidateConfigRequest.ProtoReflect.Descriptor instead. +func (*ValidateConfigRequest) Descriptor() ([]byte, []int) { + return file_omni_management_management_proto_rawDescGZIP(), []int{4} +} + +func (x *ValidateConfigRequest) GetConfig() string { + if x != nil { + return x.Config + } + return "" +} + +type TalosconfigRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Admin indicates whether to generate an admin talosconfig or a regular one. + Admin bool `protobuf:"varint,1,opt,name=admin,proto3" json:"admin,omitempty"` +} + +func (x *TalosconfigRequest) Reset() { + *x = TalosconfigRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_management_management_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TalosconfigRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TalosconfigRequest) ProtoMessage() {} + +func (x *TalosconfigRequest) ProtoReflect() protoreflect.Message { + mi := &file_omni_management_management_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TalosconfigRequest.ProtoReflect.Descriptor instead. +func (*TalosconfigRequest) Descriptor() ([]byte, []int) { + return file_omni_management_management_proto_rawDescGZIP(), []int{5} +} + +func (x *TalosconfigRequest) GetAdmin() bool { + if x != nil { + return x.Admin + } + return false +} + +type CreateServiceAccountRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ArmoredPgpPublicKey string `protobuf:"bytes,1,opt,name=armored_pgp_public_key,json=armoredPgpPublicKey,proto3" json:"armored_pgp_public_key,omitempty"` + // UseUserRole indicates whether to use the role of the creating user. + // When true, role will be ignored and the service account will be created with the role of the creating user. + UseUserRole bool `protobuf:"varint,3,opt,name=use_user_role,json=useUserRole,proto3" json:"use_user_role,omitempty"` + Role string `protobuf:"bytes,4,opt,name=role,proto3" json:"role,omitempty"` +} + +func (x *CreateServiceAccountRequest) Reset() { + *x = CreateServiceAccountRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_management_management_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateServiceAccountRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateServiceAccountRequest) ProtoMessage() {} + +func (x *CreateServiceAccountRequest) ProtoReflect() protoreflect.Message { + mi := &file_omni_management_management_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateServiceAccountRequest.ProtoReflect.Descriptor instead. +func (*CreateServiceAccountRequest) Descriptor() ([]byte, []int) { + return file_omni_management_management_proto_rawDescGZIP(), []int{6} +} + +func (x *CreateServiceAccountRequest) GetArmoredPgpPublicKey() string { + if x != nil { + return x.ArmoredPgpPublicKey + } + return "" +} + +func (x *CreateServiceAccountRequest) GetUseUserRole() bool { + if x != nil { + return x.UseUserRole + } + return false +} + +func (x *CreateServiceAccountRequest) GetRole() string { + if x != nil { + return x.Role + } + return "" +} + +type CreateServiceAccountResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + PublicKeyId string `protobuf:"bytes,1,opt,name=public_key_id,json=publicKeyId,proto3" json:"public_key_id,omitempty"` +} + +func (x *CreateServiceAccountResponse) Reset() { + *x = CreateServiceAccountResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_management_management_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateServiceAccountResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateServiceAccountResponse) ProtoMessage() {} + +func (x *CreateServiceAccountResponse) ProtoReflect() protoreflect.Message { + mi := &file_omni_management_management_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateServiceAccountResponse.ProtoReflect.Descriptor instead. +func (*CreateServiceAccountResponse) Descriptor() ([]byte, []int) { + return file_omni_management_management_proto_rawDescGZIP(), []int{7} +} + +func (x *CreateServiceAccountResponse) GetPublicKeyId() string { + if x != nil { + return x.PublicKeyId + } + return "" +} + +type RenewServiceAccountRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + ArmoredPgpPublicKey string `protobuf:"bytes,2,opt,name=armored_pgp_public_key,json=armoredPgpPublicKey,proto3" json:"armored_pgp_public_key,omitempty"` +} + +func (x *RenewServiceAccountRequest) Reset() { + *x = RenewServiceAccountRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_management_management_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RenewServiceAccountRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RenewServiceAccountRequest) ProtoMessage() {} + +func (x *RenewServiceAccountRequest) ProtoReflect() protoreflect.Message { + mi := &file_omni_management_management_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RenewServiceAccountRequest.ProtoReflect.Descriptor instead. +func (*RenewServiceAccountRequest) Descriptor() ([]byte, []int) { + return file_omni_management_management_proto_rawDescGZIP(), []int{8} +} + +func (x *RenewServiceAccountRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *RenewServiceAccountRequest) GetArmoredPgpPublicKey() string { + if x != nil { + return x.ArmoredPgpPublicKey + } + return "" +} + +type RenewServiceAccountResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + PublicKeyId string `protobuf:"bytes,1,opt,name=public_key_id,json=publicKeyId,proto3" json:"public_key_id,omitempty"` +} + +func (x *RenewServiceAccountResponse) Reset() { + *x = RenewServiceAccountResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_management_management_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RenewServiceAccountResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RenewServiceAccountResponse) ProtoMessage() {} + +func (x *RenewServiceAccountResponse) ProtoReflect() protoreflect.Message { + mi := &file_omni_management_management_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RenewServiceAccountResponse.ProtoReflect.Descriptor instead. +func (*RenewServiceAccountResponse) Descriptor() ([]byte, []int) { + return file_omni_management_management_proto_rawDescGZIP(), []int{9} +} + +func (x *RenewServiceAccountResponse) GetPublicKeyId() string { + if x != nil { + return x.PublicKeyId + } + return "" +} + +type DestroyServiceAccountRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *DestroyServiceAccountRequest) Reset() { + *x = DestroyServiceAccountRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_management_management_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DestroyServiceAccountRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DestroyServiceAccountRequest) ProtoMessage() {} + +func (x *DestroyServiceAccountRequest) ProtoReflect() protoreflect.Message { + mi := &file_omni_management_management_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DestroyServiceAccountRequest.ProtoReflect.Descriptor instead. +func (*DestroyServiceAccountRequest) Descriptor() ([]byte, []int) { + return file_omni_management_management_proto_rawDescGZIP(), []int{10} +} + +func (x *DestroyServiceAccountRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type ListServiceAccountsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ServiceAccounts []*ListServiceAccountsResponse_ServiceAccount `protobuf:"bytes,1,rep,name=service_accounts,json=serviceAccounts,proto3" json:"service_accounts,omitempty"` +} + +func (x *ListServiceAccountsResponse) Reset() { + *x = ListServiceAccountsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_management_management_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListServiceAccountsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListServiceAccountsResponse) ProtoMessage() {} + +func (x *ListServiceAccountsResponse) ProtoReflect() protoreflect.Message { + mi := &file_omni_management_management_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListServiceAccountsResponse.ProtoReflect.Descriptor instead. +func (*ListServiceAccountsResponse) Descriptor() ([]byte, []int) { + return file_omni_management_management_proto_rawDescGZIP(), []int{11} +} + +func (x *ListServiceAccountsResponse) GetServiceAccounts() []*ListServiceAccountsResponse_ServiceAccount { + if x != nil { + return x.ServiceAccounts + } + return nil +} + +type KubeconfigRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ServiceAccount bool `protobuf:"varint,1,opt,name=service_account,json=serviceAccount,proto3" json:"service_account,omitempty"` + ServiceAccountTtl *durationpb.Duration `protobuf:"bytes,2,opt,name=service_account_ttl,json=serviceAccountTtl,proto3" json:"service_account_ttl,omitempty"` + ServiceAccountUser string `protobuf:"bytes,3,opt,name=service_account_user,json=serviceAccountUser,proto3" json:"service_account_user,omitempty"` + ServiceAccountGroups []string `protobuf:"bytes,4,rep,name=service_account_groups,json=serviceAccountGroups,proto3" json:"service_account_groups,omitempty"` +} + +func (x *KubeconfigRequest) Reset() { + *x = KubeconfigRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_management_management_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *KubeconfigRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*KubeconfigRequest) ProtoMessage() {} + +func (x *KubeconfigRequest) ProtoReflect() protoreflect.Message { + mi := &file_omni_management_management_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use KubeconfigRequest.ProtoReflect.Descriptor instead. +func (*KubeconfigRequest) Descriptor() ([]byte, []int) { + return file_omni_management_management_proto_rawDescGZIP(), []int{12} +} + +func (x *KubeconfigRequest) GetServiceAccount() bool { + if x != nil { + return x.ServiceAccount + } + return false +} + +func (x *KubeconfigRequest) GetServiceAccountTtl() *durationpb.Duration { + if x != nil { + return x.ServiceAccountTtl + } + return nil +} + +func (x *KubeconfigRequest) GetServiceAccountUser() string { + if x != nil { + return x.ServiceAccountUser + } + return "" +} + +func (x *KubeconfigRequest) GetServiceAccountGroups() []string { + if x != nil { + return x.ServiceAccountGroups + } + return nil +} + +type KubernetesUpgradePreChecksRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + NewVersion string `protobuf:"bytes,1,opt,name=new_version,json=newVersion,proto3" json:"new_version,omitempty"` +} + +func (x *KubernetesUpgradePreChecksRequest) Reset() { + *x = KubernetesUpgradePreChecksRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_management_management_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *KubernetesUpgradePreChecksRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*KubernetesUpgradePreChecksRequest) ProtoMessage() {} + +func (x *KubernetesUpgradePreChecksRequest) ProtoReflect() protoreflect.Message { + mi := &file_omni_management_management_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use KubernetesUpgradePreChecksRequest.ProtoReflect.Descriptor instead. +func (*KubernetesUpgradePreChecksRequest) Descriptor() ([]byte, []int) { + return file_omni_management_management_proto_rawDescGZIP(), []int{13} +} + +func (x *KubernetesUpgradePreChecksRequest) GetNewVersion() string { + if x != nil { + return x.NewVersion + } + return "" +} + +type KubernetesUpgradePreChecksResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + Reason string `protobuf:"bytes,2,opt,name=reason,proto3" json:"reason,omitempty"` +} + +func (x *KubernetesUpgradePreChecksResponse) Reset() { + *x = KubernetesUpgradePreChecksResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_management_management_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *KubernetesUpgradePreChecksResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*KubernetesUpgradePreChecksResponse) ProtoMessage() {} + +func (x *KubernetesUpgradePreChecksResponse) ProtoReflect() protoreflect.Message { + mi := &file_omni_management_management_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use KubernetesUpgradePreChecksResponse.ProtoReflect.Descriptor instead. +func (*KubernetesUpgradePreChecksResponse) Descriptor() ([]byte, []int) { + return file_omni_management_management_proto_rawDescGZIP(), []int{14} +} + +func (x *KubernetesUpgradePreChecksResponse) GetOk() bool { + if x != nil { + return x.Ok + } + return false +} + +func (x *KubernetesUpgradePreChecksResponse) GetReason() string { + if x != nil { + return x.Reason + } + return "" +} + +type KubernetesSyncManifestRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + DryRun bool `protobuf:"varint,1,opt,name=dry_run,json=dryRun,proto3" json:"dry_run,omitempty"` +} + +func (x *KubernetesSyncManifestRequest) Reset() { + *x = KubernetesSyncManifestRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_management_management_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *KubernetesSyncManifestRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*KubernetesSyncManifestRequest) ProtoMessage() {} + +func (x *KubernetesSyncManifestRequest) ProtoReflect() protoreflect.Message { + mi := &file_omni_management_management_proto_msgTypes[15] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use KubernetesSyncManifestRequest.ProtoReflect.Descriptor instead. +func (*KubernetesSyncManifestRequest) Descriptor() ([]byte, []int) { + return file_omni_management_management_proto_rawDescGZIP(), []int{15} +} + +func (x *KubernetesSyncManifestRequest) GetDryRun() bool { + if x != nil { + return x.DryRun + } + return false +} + +type KubernetesSyncManifestResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ResponseType KubernetesSyncManifestResponse_ResponseType `protobuf:"varint,1,opt,name=response_type,json=responseType,proto3,enum=management.KubernetesSyncManifestResponse_ResponseType" json:"response_type,omitempty"` + Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` + Object []byte `protobuf:"bytes,3,opt,name=object,proto3" json:"object,omitempty"` + Diff string `protobuf:"bytes,4,opt,name=diff,proto3" json:"diff,omitempty"` + Skipped bool `protobuf:"varint,5,opt,name=skipped,proto3" json:"skipped,omitempty"` +} + +func (x *KubernetesSyncManifestResponse) Reset() { + *x = KubernetesSyncManifestResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_management_management_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *KubernetesSyncManifestResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*KubernetesSyncManifestResponse) ProtoMessage() {} + +func (x *KubernetesSyncManifestResponse) ProtoReflect() protoreflect.Message { + mi := &file_omni_management_management_proto_msgTypes[16] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use KubernetesSyncManifestResponse.ProtoReflect.Descriptor instead. +func (*KubernetesSyncManifestResponse) Descriptor() ([]byte, []int) { + return file_omni_management_management_proto_rawDescGZIP(), []int{16} +} + +func (x *KubernetesSyncManifestResponse) GetResponseType() KubernetesSyncManifestResponse_ResponseType { + if x != nil { + return x.ResponseType + } + return KubernetesSyncManifestResponse_UNKNOWN +} + +func (x *KubernetesSyncManifestResponse) GetPath() string { + if x != nil { + return x.Path + } + return "" +} + +func (x *KubernetesSyncManifestResponse) GetObject() []byte { + if x != nil { + return x.Object + } + return nil +} + +func (x *KubernetesSyncManifestResponse) GetDiff() string { + if x != nil { + return x.Diff + } + return "" +} + +func (x *KubernetesSyncManifestResponse) GetSkipped() bool { + if x != nil { + return x.Skipped + } + return false +} + +type CreateSchematicRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Extensions []string `protobuf:"bytes,1,rep,name=extensions,proto3" json:"extensions,omitempty"` + ExtraKernelArgs []string `protobuf:"bytes,2,rep,name=extra_kernel_args,json=extraKernelArgs,proto3" json:"extra_kernel_args,omitempty"` + MetaValues map[uint32]string `protobuf:"bytes,3,rep,name=meta_values,json=metaValues,proto3" json:"meta_values,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *CreateSchematicRequest) Reset() { + *x = CreateSchematicRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_management_management_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateSchematicRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateSchematicRequest) ProtoMessage() {} + +func (x *CreateSchematicRequest) ProtoReflect() protoreflect.Message { + mi := &file_omni_management_management_proto_msgTypes[17] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateSchematicRequest.ProtoReflect.Descriptor instead. +func (*CreateSchematicRequest) Descriptor() ([]byte, []int) { + return file_omni_management_management_proto_rawDescGZIP(), []int{17} +} + +func (x *CreateSchematicRequest) GetExtensions() []string { + if x != nil { + return x.Extensions + } + return nil +} + +func (x *CreateSchematicRequest) GetExtraKernelArgs() []string { + if x != nil { + return x.ExtraKernelArgs + } + return nil +} + +func (x *CreateSchematicRequest) GetMetaValues() map[uint32]string { + if x != nil { + return x.MetaValues + } + return nil +} + +type CreateSchematicResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SchematicId string `protobuf:"bytes,1,opt,name=schematic_id,json=schematicId,proto3" json:"schematic_id,omitempty"` + PxeUrl string `protobuf:"bytes,2,opt,name=pxe_url,json=pxeUrl,proto3" json:"pxe_url,omitempty"` +} + +func (x *CreateSchematicResponse) Reset() { + *x = CreateSchematicResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_management_management_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateSchematicResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateSchematicResponse) ProtoMessage() {} + +func (x *CreateSchematicResponse) ProtoReflect() protoreflect.Message { + mi := &file_omni_management_management_proto_msgTypes[18] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateSchematicResponse.ProtoReflect.Descriptor instead. +func (*CreateSchematicResponse) Descriptor() ([]byte, []int) { + return file_omni_management_management_proto_rawDescGZIP(), []int{18} +} + +func (x *CreateSchematicResponse) GetSchematicId() string { + if x != nil { + return x.SchematicId + } + return "" +} + +func (x *CreateSchematicResponse) GetPxeUrl() string { + if x != nil { + return x.PxeUrl + } + return "" +} + +type ListServiceAccountsResponse_ServiceAccount struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + PgpPublicKeys []*ListServiceAccountsResponse_ServiceAccount_PgpPublicKey `protobuf:"bytes,2,rep,name=pgp_public_keys,json=pgpPublicKeys,proto3" json:"pgp_public_keys,omitempty"` + Role string `protobuf:"bytes,4,opt,name=role,proto3" json:"role,omitempty"` +} + +func (x *ListServiceAccountsResponse_ServiceAccount) Reset() { + *x = ListServiceAccountsResponse_ServiceAccount{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_management_management_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListServiceAccountsResponse_ServiceAccount) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListServiceAccountsResponse_ServiceAccount) ProtoMessage() {} + +func (x *ListServiceAccountsResponse_ServiceAccount) ProtoReflect() protoreflect.Message { + mi := &file_omni_management_management_proto_msgTypes[19] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListServiceAccountsResponse_ServiceAccount.ProtoReflect.Descriptor instead. +func (*ListServiceAccountsResponse_ServiceAccount) Descriptor() ([]byte, []int) { + return file_omni_management_management_proto_rawDescGZIP(), []int{11, 0} +} + +func (x *ListServiceAccountsResponse_ServiceAccount) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *ListServiceAccountsResponse_ServiceAccount) GetPgpPublicKeys() []*ListServiceAccountsResponse_ServiceAccount_PgpPublicKey { + if x != nil { + return x.PgpPublicKeys + } + return nil +} + +func (x *ListServiceAccountsResponse_ServiceAccount) GetRole() string { + if x != nil { + return x.Role + } + return "" +} + +type ListServiceAccountsResponse_ServiceAccount_PgpPublicKey struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Armored string `protobuf:"bytes,2,opt,name=armored,proto3" json:"armored,omitempty"` + Expiration *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=expiration,proto3" json:"expiration,omitempty"` +} + +func (x *ListServiceAccountsResponse_ServiceAccount_PgpPublicKey) Reset() { + *x = ListServiceAccountsResponse_ServiceAccount_PgpPublicKey{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_management_management_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListServiceAccountsResponse_ServiceAccount_PgpPublicKey) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListServiceAccountsResponse_ServiceAccount_PgpPublicKey) ProtoMessage() {} + +func (x *ListServiceAccountsResponse_ServiceAccount_PgpPublicKey) ProtoReflect() protoreflect.Message { + mi := &file_omni_management_management_proto_msgTypes[20] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListServiceAccountsResponse_ServiceAccount_PgpPublicKey.ProtoReflect.Descriptor instead. +func (*ListServiceAccountsResponse_ServiceAccount_PgpPublicKey) Descriptor() ([]byte, []int) { + return file_omni_management_management_proto_rawDescGZIP(), []int{11, 0, 0} +} + +func (x *ListServiceAccountsResponse_ServiceAccount_PgpPublicKey) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *ListServiceAccountsResponse_ServiceAccount_PgpPublicKey) GetArmored() string { + if x != nil { + return x.Armored + } + return "" +} + +func (x *ListServiceAccountsResponse_ServiceAccount_PgpPublicKey) GetExpiration() *timestamppb.Timestamp { + if x != nil { + return x.Expiration + } + return nil +} + +var File_omni_management_management_proto protoreflect.FileDescriptor + +var file_omni_management_management_proto_rawDesc = []byte{ + 0x0a, 0x20, 0x6f, 0x6d, 0x6e, 0x69, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x12, 0x0a, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x1a, 0x1b, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, + 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x13, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x22, 0x34, 0x0a, 0x12, 0x4b, 0x75, 0x62, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x6b, 0x75, 0x62, 0x65, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x6b, 0x75, 0x62, + 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x37, 0x0a, 0x13, 0x54, 0x61, 0x6c, 0x6f, 0x73, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, + 0x0a, 0x0b, 0x74, 0x61, 0x6c, 0x6f, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x74, 0x61, 0x6c, 0x6f, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x22, 0x34, 0x0a, 0x12, 0x4f, 0x6d, 0x6e, 0x69, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x6f, 0x6d, 0x6e, 0x69, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x6f, 0x6d, 0x6e, 0x69, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x6a, 0x0a, 0x12, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, + 0x65, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, + 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x66, + 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x66, 0x6f, 0x6c, + 0x6c, 0x6f, 0x77, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x69, 0x6c, 0x5f, 0x6c, 0x69, 0x6e, 0x65, + 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x74, 0x61, 0x69, 0x6c, 0x4c, 0x69, 0x6e, + 0x65, 0x73, 0x22, 0x2f, 0x0a, 0x15, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x22, 0x2a, 0x0a, 0x12, 0x54, 0x61, 0x6c, 0x6f, 0x73, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x64, 0x6d, + 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x22, + 0x90, 0x01, 0x0a, 0x1b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x33, 0x0a, 0x16, 0x61, 0x72, 0x6d, 0x6f, 0x72, 0x65, 0x64, 0x5f, 0x70, 0x67, 0x70, 0x5f, 0x70, + 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x13, 0x61, 0x72, 0x6d, 0x6f, 0x72, 0x65, 0x64, 0x50, 0x67, 0x70, 0x50, 0x75, 0x62, 0x6c, 0x69, + 0x63, 0x4b, 0x65, 0x79, 0x12, 0x22, 0x0a, 0x0d, 0x75, 0x73, 0x65, 0x5f, 0x75, 0x73, 0x65, 0x72, + 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x75, 0x73, 0x65, + 0x55, 0x73, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x4a, 0x04, 0x08, 0x02, + 0x10, 0x03, 0x22, 0x42, 0x0a, 0x1c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0d, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x75, 0x62, 0x6c, 0x69, + 0x63, 0x4b, 0x65, 0x79, 0x49, 0x64, 0x22, 0x65, 0x0a, 0x1a, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x33, 0x0a, 0x16, 0x61, 0x72, 0x6d, 0x6f, + 0x72, 0x65, 0x64, 0x5f, 0x70, 0x67, 0x70, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, + 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x61, 0x72, 0x6d, 0x6f, 0x72, 0x65, + 0x64, 0x50, 0x67, 0x70, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x22, 0x41, 0x0a, + 0x1b, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0d, + 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x49, 0x64, + 0x22, 0x32, 0x0a, 0x1c, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xa4, 0x03, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x61, 0x0a, 0x10, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, + 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x0f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x1a, 0xa1, 0x02, 0x0a, 0x0e, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x6b, + 0x0a, 0x0f, 0x70, 0x67, 0x70, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, + 0x50, 0x67, 0x70, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x52, 0x0d, 0x70, 0x67, + 0x70, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x72, + 0x6f, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x1a, + 0x74, 0x0a, 0x0c, 0x50, 0x67, 0x70, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x18, 0x0a, 0x07, 0x61, 0x72, 0x6d, 0x6f, 0x72, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x61, 0x72, 0x6d, 0x6f, 0x72, 0x65, 0x64, 0x12, 0x3a, 0x0a, 0x0a, 0x65, 0x78, 0x70, + 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x22, 0xef, 0x01, 0x0a, 0x11, + 0x4b, 0x75, 0x62, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x49, 0x0a, 0x13, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x74, 0x74, + 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x54, 0x74, 0x6c, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x55, 0x73, 0x65, 0x72, 0x12, 0x34, 0x0a, 0x16, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x14, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x22, 0x44, 0x0a, + 0x21, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x55, 0x70, 0x67, 0x72, 0x61, + 0x64, 0x65, 0x50, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6e, 0x65, 0x77, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x22, 0x4c, 0x0a, 0x22, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, + 0x73, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, + 0x73, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, + 0x6e, 0x22, 0x38, 0x0a, 0x1d, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x53, + 0x79, 0x6e, 0x63, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x22, 0x90, 0x02, 0x0a, 0x1e, + 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x4d, 0x61, + 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5c, + 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x37, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x53, 0x79, 0x6e, + 0x63, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0c, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, + 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x69, 0x66, 0x66, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x69, 0x66, 0x66, 0x12, 0x18, 0x0a, 0x07, + 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, + 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x22, 0x36, 0x0a, 0x0c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, + 0x4e, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x4d, 0x41, 0x4e, 0x49, 0x46, 0x45, 0x53, 0x54, 0x10, + 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x4f, 0x4c, 0x4c, 0x4f, 0x55, 0x54, 0x10, 0x02, 0x22, 0xf8, + 0x01, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x74, + 0x69, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x65, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x65, 0x78, 0x74, + 0x72, 0x61, 0x5f, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x65, 0x78, 0x74, 0x72, 0x61, 0x4b, 0x65, 0x72, 0x6e, 0x65, + 0x6c, 0x41, 0x72, 0x67, 0x73, 0x12, 0x53, 0x0a, 0x0b, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, + 0x65, 0x74, 0x61, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, + 0x6d, 0x65, 0x74, 0x61, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x4d, 0x65, + 0x74, 0x61, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x55, 0x0a, 0x17, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x74, 0x69, + 0x63, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x74, 0x69, 0x63, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x78, 0x65, 0x5f, 0x75, + 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x78, 0x65, 0x55, 0x72, 0x6c, + 0x32, 0xd5, 0x08, 0x0a, 0x11, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4b, 0x0a, 0x0a, 0x4b, 0x75, 0x62, 0x65, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1d, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x0b, 0x54, 0x61, 0x6c, 0x6f, 0x73, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x12, 0x1e, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x54, 0x61, 0x6c, 0x6f, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x54, 0x61, 0x6c, 0x6f, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x44, 0x0a, 0x0a, 0x4f, 0x6d, 0x6e, 0x69, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1e, 0x2e, 0x6d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x4f, 0x6d, 0x6e, 0x69, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x0b, 0x4d, 0x61, 0x63, + 0x68, 0x69, 0x6e, 0x65, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x1e, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4c, 0x6f, 0x67, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x30, 0x01, 0x12, 0x4b, 0x0a, 0x0e, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x21, 0x2e, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x69, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x27, 0x2e, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x66, 0x0a, 0x13, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x26, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x27, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x65, 0x6e, + 0x65, 0x77, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x56, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x27, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x59, 0x0a, 0x15, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x28, 0x2e, 0x6d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x7b, 0x0a, 0x1a, 0x4b, + 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, + 0x50, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x12, 0x2d, 0x2e, 0x6d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, + 0x73, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, + 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x72, 0x0a, 0x17, 0x4b, 0x75, 0x62, 0x65, + 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, + 0x73, 0x74, 0x73, 0x12, 0x29, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x4d, + 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, + 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x4b, 0x75, 0x62, 0x65, + 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, + 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x0f, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x12, + 0x22, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x74, 0x69, 0x63, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x37, 0x5a, 0x35, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x73, 0x69, 0x64, 0x65, 0x72, 0x6f, 0x6c, 0x61, 0x62, + 0x73, 0x2f, 0x6f, 0x6d, 0x6e, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x6f, 0x6d, 0x6e, 0x69, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_omni_management_management_proto_rawDescOnce sync.Once + file_omni_management_management_proto_rawDescData = file_omni_management_management_proto_rawDesc +) + +func file_omni_management_management_proto_rawDescGZIP() []byte { + file_omni_management_management_proto_rawDescOnce.Do(func() { + file_omni_management_management_proto_rawDescData = protoimpl.X.CompressGZIP(file_omni_management_management_proto_rawDescData) + }) + return file_omni_management_management_proto_rawDescData +} + +var file_omni_management_management_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_omni_management_management_proto_msgTypes = make([]protoimpl.MessageInfo, 22) +var file_omni_management_management_proto_goTypes = []interface{}{ + (KubernetesSyncManifestResponse_ResponseType)(0), // 0: management.KubernetesSyncManifestResponse.ResponseType + (*KubeconfigResponse)(nil), // 1: management.KubeconfigResponse + (*TalosconfigResponse)(nil), // 2: management.TalosconfigResponse + (*OmniconfigResponse)(nil), // 3: management.OmniconfigResponse + (*MachineLogsRequest)(nil), // 4: management.MachineLogsRequest + (*ValidateConfigRequest)(nil), // 5: management.ValidateConfigRequest + (*TalosconfigRequest)(nil), // 6: management.TalosconfigRequest + (*CreateServiceAccountRequest)(nil), // 7: management.CreateServiceAccountRequest + (*CreateServiceAccountResponse)(nil), // 8: management.CreateServiceAccountResponse + (*RenewServiceAccountRequest)(nil), // 9: management.RenewServiceAccountRequest + (*RenewServiceAccountResponse)(nil), // 10: management.RenewServiceAccountResponse + (*DestroyServiceAccountRequest)(nil), // 11: management.DestroyServiceAccountRequest + (*ListServiceAccountsResponse)(nil), // 12: management.ListServiceAccountsResponse + (*KubeconfigRequest)(nil), // 13: management.KubeconfigRequest + (*KubernetesUpgradePreChecksRequest)(nil), // 14: management.KubernetesUpgradePreChecksRequest + (*KubernetesUpgradePreChecksResponse)(nil), // 15: management.KubernetesUpgradePreChecksResponse + (*KubernetesSyncManifestRequest)(nil), // 16: management.KubernetesSyncManifestRequest + (*KubernetesSyncManifestResponse)(nil), // 17: management.KubernetesSyncManifestResponse + (*CreateSchematicRequest)(nil), // 18: management.CreateSchematicRequest + (*CreateSchematicResponse)(nil), // 19: management.CreateSchematicResponse + (*ListServiceAccountsResponse_ServiceAccount)(nil), // 20: management.ListServiceAccountsResponse.ServiceAccount + (*ListServiceAccountsResponse_ServiceAccount_PgpPublicKey)(nil), // 21: management.ListServiceAccountsResponse.ServiceAccount.PgpPublicKey + nil, // 22: management.CreateSchematicRequest.MetaValuesEntry + (*durationpb.Duration)(nil), // 23: google.protobuf.Duration + (*timestamppb.Timestamp)(nil), // 24: google.protobuf.Timestamp + (*emptypb.Empty)(nil), // 25: google.protobuf.Empty + (*common.Data)(nil), // 26: common.Data +} +var file_omni_management_management_proto_depIdxs = []int32{ + 20, // 0: management.ListServiceAccountsResponse.service_accounts:type_name -> management.ListServiceAccountsResponse.ServiceAccount + 23, // 1: management.KubeconfigRequest.service_account_ttl:type_name -> google.protobuf.Duration + 0, // 2: management.KubernetesSyncManifestResponse.response_type:type_name -> management.KubernetesSyncManifestResponse.ResponseType + 22, // 3: management.CreateSchematicRequest.meta_values:type_name -> management.CreateSchematicRequest.MetaValuesEntry + 21, // 4: management.ListServiceAccountsResponse.ServiceAccount.pgp_public_keys:type_name -> management.ListServiceAccountsResponse.ServiceAccount.PgpPublicKey + 24, // 5: management.ListServiceAccountsResponse.ServiceAccount.PgpPublicKey.expiration:type_name -> google.protobuf.Timestamp + 13, // 6: management.ManagementService.Kubeconfig:input_type -> management.KubeconfigRequest + 6, // 7: management.ManagementService.Talosconfig:input_type -> management.TalosconfigRequest + 25, // 8: management.ManagementService.Omniconfig:input_type -> google.protobuf.Empty + 4, // 9: management.ManagementService.MachineLogs:input_type -> management.MachineLogsRequest + 5, // 10: management.ManagementService.ValidateConfig:input_type -> management.ValidateConfigRequest + 7, // 11: management.ManagementService.CreateServiceAccount:input_type -> management.CreateServiceAccountRequest + 9, // 12: management.ManagementService.RenewServiceAccount:input_type -> management.RenewServiceAccountRequest + 25, // 13: management.ManagementService.ListServiceAccounts:input_type -> google.protobuf.Empty + 11, // 14: management.ManagementService.DestroyServiceAccount:input_type -> management.DestroyServiceAccountRequest + 14, // 15: management.ManagementService.KubernetesUpgradePreChecks:input_type -> management.KubernetesUpgradePreChecksRequest + 16, // 16: management.ManagementService.KubernetesSyncManifests:input_type -> management.KubernetesSyncManifestRequest + 18, // 17: management.ManagementService.CreateSchematic:input_type -> management.CreateSchematicRequest + 1, // 18: management.ManagementService.Kubeconfig:output_type -> management.KubeconfigResponse + 2, // 19: management.ManagementService.Talosconfig:output_type -> management.TalosconfigResponse + 3, // 20: management.ManagementService.Omniconfig:output_type -> management.OmniconfigResponse + 26, // 21: management.ManagementService.MachineLogs:output_type -> common.Data + 25, // 22: management.ManagementService.ValidateConfig:output_type -> google.protobuf.Empty + 8, // 23: management.ManagementService.CreateServiceAccount:output_type -> management.CreateServiceAccountResponse + 10, // 24: management.ManagementService.RenewServiceAccount:output_type -> management.RenewServiceAccountResponse + 12, // 25: management.ManagementService.ListServiceAccounts:output_type -> management.ListServiceAccountsResponse + 25, // 26: management.ManagementService.DestroyServiceAccount:output_type -> google.protobuf.Empty + 15, // 27: management.ManagementService.KubernetesUpgradePreChecks:output_type -> management.KubernetesUpgradePreChecksResponse + 17, // 28: management.ManagementService.KubernetesSyncManifests:output_type -> management.KubernetesSyncManifestResponse + 19, // 29: management.ManagementService.CreateSchematic:output_type -> management.CreateSchematicResponse + 18, // [18:30] is the sub-list for method output_type + 6, // [6:18] is the sub-list for method input_type + 6, // [6:6] is the sub-list for extension type_name + 6, // [6:6] is the sub-list for extension extendee + 0, // [0:6] is the sub-list for field type_name +} + +func init() { file_omni_management_management_proto_init() } +func file_omni_management_management_proto_init() { + if File_omni_management_management_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_omni_management_management_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*KubeconfigResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_management_management_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TalosconfigResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_management_management_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OmniconfigResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_management_management_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MachineLogsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_management_management_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ValidateConfigRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_management_management_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TalosconfigRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_management_management_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateServiceAccountRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_management_management_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateServiceAccountResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_management_management_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RenewServiceAccountRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_management_management_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RenewServiceAccountResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_management_management_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DestroyServiceAccountRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_management_management_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListServiceAccountsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_management_management_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*KubeconfigRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_management_management_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*KubernetesUpgradePreChecksRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_management_management_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*KubernetesUpgradePreChecksResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_management_management_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*KubernetesSyncManifestRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_management_management_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*KubernetesSyncManifestResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_management_management_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateSchematicRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_management_management_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateSchematicResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_management_management_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListServiceAccountsResponse_ServiceAccount); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_management_management_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListServiceAccountsResponse_ServiceAccount_PgpPublicKey); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_omni_management_management_proto_rawDesc, + NumEnums: 1, + NumMessages: 22, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_omni_management_management_proto_goTypes, + DependencyIndexes: file_omni_management_management_proto_depIdxs, + EnumInfos: file_omni_management_management_proto_enumTypes, + MessageInfos: file_omni_management_management_proto_msgTypes, + }.Build() + File_omni_management_management_proto = out.File + file_omni_management_management_proto_rawDesc = nil + file_omni_management_management_proto_goTypes = nil + file_omni_management_management_proto_depIdxs = nil +} diff --git a/client/api/omni/management/management.pb.gw.go b/client/api/omni/management/management.pb.gw.go new file mode 100644 index 00000000..fc24e361 --- /dev/null +++ b/client/api/omni/management/management.pb.gw.go @@ -0,0 +1,965 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: omni/management/management.proto + +/* +Package management is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package management + +import ( + "context" + "io" + "net/http" + + "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/types/known/emptypb" +) + +// Suppress "imported and not used" errors +var _ codes.Code +var _ io.Reader +var _ status.Status +var _ = runtime.String +var _ = utilities.NewDoubleArray +var _ = metadata.Join + +func request_ManagementService_Kubeconfig_0(ctx context.Context, marshaler runtime.Marshaler, client ManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq KubeconfigRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.Kubeconfig(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ManagementService_Kubeconfig_0(ctx context.Context, marshaler runtime.Marshaler, server ManagementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq KubeconfigRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.Kubeconfig(ctx, &protoReq) + return msg, metadata, err + +} + +func request_ManagementService_Talosconfig_0(ctx context.Context, marshaler runtime.Marshaler, client ManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq TalosconfigRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.Talosconfig(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ManagementService_Talosconfig_0(ctx context.Context, marshaler runtime.Marshaler, server ManagementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq TalosconfigRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.Talosconfig(ctx, &protoReq) + return msg, metadata, err + +} + +func request_ManagementService_Omniconfig_0(ctx context.Context, marshaler runtime.Marshaler, client ManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq emptypb.Empty + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.Omniconfig(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ManagementService_Omniconfig_0(ctx context.Context, marshaler runtime.Marshaler, server ManagementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq emptypb.Empty + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.Omniconfig(ctx, &protoReq) + return msg, metadata, err + +} + +func request_ManagementService_MachineLogs_0(ctx context.Context, marshaler runtime.Marshaler, client ManagementServiceClient, req *http.Request, pathParams map[string]string) (ManagementService_MachineLogsClient, runtime.ServerMetadata, error) { + var protoReq MachineLogsRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + stream, err := client.MachineLogs(ctx, &protoReq) + if err != nil { + return nil, metadata, err + } + header, err := stream.Header() + if err != nil { + return nil, metadata, err + } + metadata.HeaderMD = header + return stream, metadata, nil + +} + +func request_ManagementService_ValidateConfig_0(ctx context.Context, marshaler runtime.Marshaler, client ManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ValidateConfigRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.ValidateConfig(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ManagementService_ValidateConfig_0(ctx context.Context, marshaler runtime.Marshaler, server ManagementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ValidateConfigRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.ValidateConfig(ctx, &protoReq) + return msg, metadata, err + +} + +func request_ManagementService_CreateServiceAccount_0(ctx context.Context, marshaler runtime.Marshaler, client ManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CreateServiceAccountRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.CreateServiceAccount(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ManagementService_CreateServiceAccount_0(ctx context.Context, marshaler runtime.Marshaler, server ManagementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CreateServiceAccountRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.CreateServiceAccount(ctx, &protoReq) + return msg, metadata, err + +} + +func request_ManagementService_RenewServiceAccount_0(ctx context.Context, marshaler runtime.Marshaler, client ManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq RenewServiceAccountRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.RenewServiceAccount(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ManagementService_RenewServiceAccount_0(ctx context.Context, marshaler runtime.Marshaler, server ManagementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq RenewServiceAccountRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.RenewServiceAccount(ctx, &protoReq) + return msg, metadata, err + +} + +func request_ManagementService_ListServiceAccounts_0(ctx context.Context, marshaler runtime.Marshaler, client ManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq emptypb.Empty + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.ListServiceAccounts(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ManagementService_ListServiceAccounts_0(ctx context.Context, marshaler runtime.Marshaler, server ManagementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq emptypb.Empty + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.ListServiceAccounts(ctx, &protoReq) + return msg, metadata, err + +} + +func request_ManagementService_DestroyServiceAccount_0(ctx context.Context, marshaler runtime.Marshaler, client ManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DestroyServiceAccountRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.DestroyServiceAccount(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ManagementService_DestroyServiceAccount_0(ctx context.Context, marshaler runtime.Marshaler, server ManagementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DestroyServiceAccountRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.DestroyServiceAccount(ctx, &protoReq) + return msg, metadata, err + +} + +func request_ManagementService_KubernetesUpgradePreChecks_0(ctx context.Context, marshaler runtime.Marshaler, client ManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq KubernetesUpgradePreChecksRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.KubernetesUpgradePreChecks(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ManagementService_KubernetesUpgradePreChecks_0(ctx context.Context, marshaler runtime.Marshaler, server ManagementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq KubernetesUpgradePreChecksRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.KubernetesUpgradePreChecks(ctx, &protoReq) + return msg, metadata, err + +} + +func request_ManagementService_KubernetesSyncManifests_0(ctx context.Context, marshaler runtime.Marshaler, client ManagementServiceClient, req *http.Request, pathParams map[string]string) (ManagementService_KubernetesSyncManifestsClient, runtime.ServerMetadata, error) { + var protoReq KubernetesSyncManifestRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + stream, err := client.KubernetesSyncManifests(ctx, &protoReq) + if err != nil { + return nil, metadata, err + } + header, err := stream.Header() + if err != nil { + return nil, metadata, err + } + metadata.HeaderMD = header + return stream, metadata, nil + +} + +func request_ManagementService_CreateSchematic_0(ctx context.Context, marshaler runtime.Marshaler, client ManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CreateSchematicRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.CreateSchematic(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ManagementService_CreateSchematic_0(ctx context.Context, marshaler runtime.Marshaler, server ManagementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CreateSchematicRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.CreateSchematic(ctx, &protoReq) + return msg, metadata, err + +} + +// RegisterManagementServiceHandlerServer registers the http handlers for service ManagementService to "mux". +// UnaryRPC :call ManagementServiceServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterManagementServiceHandlerFromEndpoint instead. +func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server ManagementServiceServer) error { + + mux.Handle("POST", pattern_ManagementService_Kubeconfig_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/management.ManagementService/Kubeconfig", runtime.WithHTTPPathPattern("/management.ManagementService/Kubeconfig")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ManagementService_Kubeconfig_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_Kubeconfig_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ManagementService_Talosconfig_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/management.ManagementService/Talosconfig", runtime.WithHTTPPathPattern("/management.ManagementService/Talosconfig")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ManagementService_Talosconfig_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_Talosconfig_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ManagementService_Omniconfig_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/management.ManagementService/Omniconfig", runtime.WithHTTPPathPattern("/management.ManagementService/Omniconfig")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ManagementService_Omniconfig_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_Omniconfig_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ManagementService_MachineLogs_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + err := status.Error(codes.Unimplemented, "streaming calls are not yet supported in the in-process transport") + _, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + }) + + mux.Handle("POST", pattern_ManagementService_ValidateConfig_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/management.ManagementService/ValidateConfig", runtime.WithHTTPPathPattern("/management.ManagementService/ValidateConfig")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ManagementService_ValidateConfig_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_ValidateConfig_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ManagementService_CreateServiceAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/management.ManagementService/CreateServiceAccount", runtime.WithHTTPPathPattern("/management.ManagementService/CreateServiceAccount")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ManagementService_CreateServiceAccount_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_CreateServiceAccount_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ManagementService_RenewServiceAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/management.ManagementService/RenewServiceAccount", runtime.WithHTTPPathPattern("/management.ManagementService/RenewServiceAccount")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ManagementService_RenewServiceAccount_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_RenewServiceAccount_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ManagementService_ListServiceAccounts_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/management.ManagementService/ListServiceAccounts", runtime.WithHTTPPathPattern("/management.ManagementService/ListServiceAccounts")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ManagementService_ListServiceAccounts_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_ListServiceAccounts_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ManagementService_DestroyServiceAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/management.ManagementService/DestroyServiceAccount", runtime.WithHTTPPathPattern("/management.ManagementService/DestroyServiceAccount")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ManagementService_DestroyServiceAccount_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_DestroyServiceAccount_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ManagementService_KubernetesUpgradePreChecks_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/management.ManagementService/KubernetesUpgradePreChecks", runtime.WithHTTPPathPattern("/management.ManagementService/KubernetesUpgradePreChecks")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ManagementService_KubernetesUpgradePreChecks_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_KubernetesUpgradePreChecks_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ManagementService_KubernetesSyncManifests_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + err := status.Error(codes.Unimplemented, "streaming calls are not yet supported in the in-process transport") + _, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + }) + + mux.Handle("POST", pattern_ManagementService_CreateSchematic_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/management.ManagementService/CreateSchematic", runtime.WithHTTPPathPattern("/management.ManagementService/CreateSchematic")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ManagementService_CreateSchematic_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_CreateSchematic_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +// RegisterManagementServiceHandlerFromEndpoint is same as RegisterManagementServiceHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterManagementServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.DialContext(ctx, endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + + return RegisterManagementServiceHandler(ctx, mux, conn) +} + +// RegisterManagementServiceHandler registers the http handlers for service ManagementService to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterManagementServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterManagementServiceHandlerClient(ctx, mux, NewManagementServiceClient(conn)) +} + +// RegisterManagementServiceHandlerClient registers the http handlers for service ManagementService +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "ManagementServiceClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "ManagementServiceClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "ManagementServiceClient" to call the correct interceptors. +func RegisterManagementServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client ManagementServiceClient) error { + + mux.Handle("POST", pattern_ManagementService_Kubeconfig_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/management.ManagementService/Kubeconfig", runtime.WithHTTPPathPattern("/management.ManagementService/Kubeconfig")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ManagementService_Kubeconfig_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_Kubeconfig_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ManagementService_Talosconfig_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/management.ManagementService/Talosconfig", runtime.WithHTTPPathPattern("/management.ManagementService/Talosconfig")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ManagementService_Talosconfig_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_Talosconfig_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ManagementService_Omniconfig_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/management.ManagementService/Omniconfig", runtime.WithHTTPPathPattern("/management.ManagementService/Omniconfig")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ManagementService_Omniconfig_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_Omniconfig_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ManagementService_MachineLogs_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/management.ManagementService/MachineLogs", runtime.WithHTTPPathPattern("/management.ManagementService/MachineLogs")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ManagementService_MachineLogs_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_MachineLogs_0(annotatedContext, mux, outboundMarshaler, w, req, func() (proto.Message, error) { return resp.Recv() }, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ManagementService_ValidateConfig_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/management.ManagementService/ValidateConfig", runtime.WithHTTPPathPattern("/management.ManagementService/ValidateConfig")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ManagementService_ValidateConfig_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_ValidateConfig_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ManagementService_CreateServiceAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/management.ManagementService/CreateServiceAccount", runtime.WithHTTPPathPattern("/management.ManagementService/CreateServiceAccount")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ManagementService_CreateServiceAccount_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_CreateServiceAccount_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ManagementService_RenewServiceAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/management.ManagementService/RenewServiceAccount", runtime.WithHTTPPathPattern("/management.ManagementService/RenewServiceAccount")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ManagementService_RenewServiceAccount_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_RenewServiceAccount_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ManagementService_ListServiceAccounts_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/management.ManagementService/ListServiceAccounts", runtime.WithHTTPPathPattern("/management.ManagementService/ListServiceAccounts")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ManagementService_ListServiceAccounts_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_ListServiceAccounts_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ManagementService_DestroyServiceAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/management.ManagementService/DestroyServiceAccount", runtime.WithHTTPPathPattern("/management.ManagementService/DestroyServiceAccount")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ManagementService_DestroyServiceAccount_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_DestroyServiceAccount_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ManagementService_KubernetesUpgradePreChecks_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/management.ManagementService/KubernetesUpgradePreChecks", runtime.WithHTTPPathPattern("/management.ManagementService/KubernetesUpgradePreChecks")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ManagementService_KubernetesUpgradePreChecks_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_KubernetesUpgradePreChecks_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ManagementService_KubernetesSyncManifests_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/management.ManagementService/KubernetesSyncManifests", runtime.WithHTTPPathPattern("/management.ManagementService/KubernetesSyncManifests")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ManagementService_KubernetesSyncManifests_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_KubernetesSyncManifests_0(annotatedContext, mux, outboundMarshaler, w, req, func() (proto.Message, error) { return resp.Recv() }, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ManagementService_CreateSchematic_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/management.ManagementService/CreateSchematic", runtime.WithHTTPPathPattern("/management.ManagementService/CreateSchematic")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ManagementService_CreateSchematic_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_CreateSchematic_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +var ( + pattern_ManagementService_Kubeconfig_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"management.ManagementService", "Kubeconfig"}, "")) + + pattern_ManagementService_Talosconfig_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"management.ManagementService", "Talosconfig"}, "")) + + pattern_ManagementService_Omniconfig_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"management.ManagementService", "Omniconfig"}, "")) + + pattern_ManagementService_MachineLogs_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"management.ManagementService", "MachineLogs"}, "")) + + pattern_ManagementService_ValidateConfig_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"management.ManagementService", "ValidateConfig"}, "")) + + pattern_ManagementService_CreateServiceAccount_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"management.ManagementService", "CreateServiceAccount"}, "")) + + pattern_ManagementService_RenewServiceAccount_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"management.ManagementService", "RenewServiceAccount"}, "")) + + pattern_ManagementService_ListServiceAccounts_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"management.ManagementService", "ListServiceAccounts"}, "")) + + pattern_ManagementService_DestroyServiceAccount_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"management.ManagementService", "DestroyServiceAccount"}, "")) + + pattern_ManagementService_KubernetesUpgradePreChecks_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"management.ManagementService", "KubernetesUpgradePreChecks"}, "")) + + pattern_ManagementService_KubernetesSyncManifests_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"management.ManagementService", "KubernetesSyncManifests"}, "")) + + pattern_ManagementService_CreateSchematic_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"management.ManagementService", "CreateSchematic"}, "")) +) + +var ( + forward_ManagementService_Kubeconfig_0 = runtime.ForwardResponseMessage + + forward_ManagementService_Talosconfig_0 = runtime.ForwardResponseMessage + + forward_ManagementService_Omniconfig_0 = runtime.ForwardResponseMessage + + forward_ManagementService_MachineLogs_0 = runtime.ForwardResponseStream + + forward_ManagementService_ValidateConfig_0 = runtime.ForwardResponseMessage + + forward_ManagementService_CreateServiceAccount_0 = runtime.ForwardResponseMessage + + forward_ManagementService_RenewServiceAccount_0 = runtime.ForwardResponseMessage + + forward_ManagementService_ListServiceAccounts_0 = runtime.ForwardResponseMessage + + forward_ManagementService_DestroyServiceAccount_0 = runtime.ForwardResponseMessage + + forward_ManagementService_KubernetesUpgradePreChecks_0 = runtime.ForwardResponseMessage + + forward_ManagementService_KubernetesSyncManifests_0 = runtime.ForwardResponseStream + + forward_ManagementService_CreateSchematic_0 = runtime.ForwardResponseMessage +) diff --git a/client/api/omni/management/management.proto b/client/api/omni/management/management.proto new file mode 100644 index 00000000..4e951d4f --- /dev/null +++ b/client/api/omni/management/management.proto @@ -0,0 +1,146 @@ +syntax = "proto3"; +package management; + +option go_package = "github.com/siderolabs/omni/client/api/omni/management"; + +import "google/protobuf/empty.proto"; +import "google/protobuf/timestamp.proto"; +import "google/protobuf/duration.proto"; +import "common/common.proto"; + +message KubeconfigResponse { + // Kubeconfig is the kubeconfig for the cluster. + bytes kubeconfig = 1; +} + +message TalosconfigResponse { + // talosconfig is the talos client configuration to access the cluster via the proxy. + bytes talosconfig = 1; +} + +message OmniconfigResponse{ + // omniconfig is the omnictl client configuration to access the omni instance. + bytes omniconfig = 1; +} + +message MachineLogsRequest { + // MachineId is the ID of the machine. + string machine_id = 1; + // Follow is whether to follow the logs. + bool follow = 2; + // TailLines is the number of lines to tail. + int32 tail_lines = 3; +} + +message ValidateConfigRequest { + // Config represents raw configuration string to validate. + string config = 1; +} + +message TalosconfigRequest { + // Admin indicates whether to generate an admin talosconfig or a regular one. + bool admin = 1; +} + +message CreateServiceAccountRequest { + string armored_pgp_public_key = 1; + reserved 2; + // UseUserRole indicates whether to use the role of the creating user. + // When true, role will be ignored and the service account will be created with the role of the creating user. + bool use_user_role = 3; + string role = 4; +} + +message CreateServiceAccountResponse { + string public_key_id = 1; +} + +message RenewServiceAccountRequest { + string name = 1; + string armored_pgp_public_key = 2; +} + +message RenewServiceAccountResponse { + string public_key_id = 1; +} + +message DestroyServiceAccountRequest { + string name = 1; +} + +message ListServiceAccountsResponse { + message ServiceAccount { + message PgpPublicKey { + string id = 1; + string armored = 2; + google.protobuf.Timestamp expiration = 3; + } + + string name = 1; + repeated PgpPublicKey pgp_public_keys = 2; + reserved 3; + string role = 4; + } + + repeated ServiceAccount service_accounts = 1; +} + +message KubeconfigRequest { + bool service_account = 1; + google.protobuf.Duration service_account_ttl = 2; + string service_account_user = 3; + repeated string service_account_groups = 4; +} + +message KubernetesUpgradePreChecksRequest { + string new_version = 1; +} + +message KubernetesUpgradePreChecksResponse { + bool ok = 1; + string reason = 2; +} + +message KubernetesSyncManifestRequest { + bool dry_run = 1; +} + +message KubernetesSyncManifestResponse { + enum ResponseType { + UNKNOWN = 0; + MANIFEST = 1; + ROLLOUT = 2; + }; + + ResponseType response_type = 1; + string path = 2; + bytes object = 3; + string diff = 4; + bool skipped = 5; +} + +message CreateSchematicRequest { + repeated string extensions = 1; + repeated string extra_kernel_args = 2; + map<uint32, string> meta_values = 3; +} + +message CreateSchematicResponse { + string schematic_id = 1; + string pxe_url = 2; +} + +service ManagementService { + rpc Kubeconfig(KubeconfigRequest) returns (KubeconfigResponse); + rpc Talosconfig(TalosconfigRequest) returns (TalosconfigResponse); + rpc Omniconfig(google.protobuf.Empty) returns (OmniconfigResponse); + rpc MachineLogs(MachineLogsRequest) returns (stream common.Data); + rpc ValidateConfig(ValidateConfigRequest) returns (google.protobuf.Empty); + rpc CreateServiceAccount(CreateServiceAccountRequest) returns (CreateServiceAccountResponse); + rpc RenewServiceAccount(RenewServiceAccountRequest) returns (RenewServiceAccountResponse); + rpc ListServiceAccounts(google.protobuf.Empty) returns (ListServiceAccountsResponse); + rpc DestroyServiceAccount(DestroyServiceAccountRequest) returns (google.protobuf.Empty); + rpc KubernetesUpgradePreChecks(KubernetesUpgradePreChecksRequest) returns (KubernetesUpgradePreChecksResponse); + rpc KubernetesSyncManifests(KubernetesSyncManifestRequest) returns (stream KubernetesSyncManifestResponse); + rpc CreateSchematic(CreateSchematicRequest) returns (CreateSchematicResponse); +} diff --git a/client/api/omni/management/management_grpc.pb.go b/client/api/omni/management/management_grpc.pb.go new file mode 100644 index 00000000..83685e32 --- /dev/null +++ b/client/api/omni/management/management_grpc.pb.go @@ -0,0 +1,574 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.3.0 +// - protoc v4.24.4 +// source: omni/management/management.proto + +package management + +import ( + context "context" + + common "github.com/siderolabs/talos/pkg/machinery/api/common" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + emptypb "google.golang.org/protobuf/types/known/emptypb" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +const ( + ManagementService_Kubeconfig_FullMethodName = "/management.ManagementService/Kubeconfig" + ManagementService_Talosconfig_FullMethodName = "/management.ManagementService/Talosconfig" + ManagementService_Omniconfig_FullMethodName = "/management.ManagementService/Omniconfig" + ManagementService_MachineLogs_FullMethodName = "/management.ManagementService/MachineLogs" + ManagementService_ValidateConfig_FullMethodName = "/management.ManagementService/ValidateConfig" + ManagementService_CreateServiceAccount_FullMethodName = "/management.ManagementService/CreateServiceAccount" + ManagementService_RenewServiceAccount_FullMethodName = "/management.ManagementService/RenewServiceAccount" + ManagementService_ListServiceAccounts_FullMethodName = "/management.ManagementService/ListServiceAccounts" + ManagementService_DestroyServiceAccount_FullMethodName = "/management.ManagementService/DestroyServiceAccount" + ManagementService_KubernetesUpgradePreChecks_FullMethodName = "/management.ManagementService/KubernetesUpgradePreChecks" + ManagementService_KubernetesSyncManifests_FullMethodName = "/management.ManagementService/KubernetesSyncManifests" + ManagementService_CreateSchematic_FullMethodName = "/management.ManagementService/CreateSchematic" +) + +// ManagementServiceClient is the client API for ManagementService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type ManagementServiceClient interface { + Kubeconfig(ctx context.Context, in *KubeconfigRequest, opts ...grpc.CallOption) (*KubeconfigResponse, error) + Talosconfig(ctx context.Context, in *TalosconfigRequest, opts ...grpc.CallOption) (*TalosconfigResponse, error) + Omniconfig(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*OmniconfigResponse, error) + MachineLogs(ctx context.Context, in *MachineLogsRequest, opts ...grpc.CallOption) (ManagementService_MachineLogsClient, error) + ValidateConfig(ctx context.Context, in *ValidateConfigRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) + CreateServiceAccount(ctx context.Context, in *CreateServiceAccountRequest, opts ...grpc.CallOption) (*CreateServiceAccountResponse, error) + RenewServiceAccount(ctx context.Context, in *RenewServiceAccountRequest, opts ...grpc.CallOption) (*RenewServiceAccountResponse, error) + ListServiceAccounts(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*ListServiceAccountsResponse, error) + DestroyServiceAccount(ctx context.Context, in *DestroyServiceAccountRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) + KubernetesUpgradePreChecks(ctx context.Context, in *KubernetesUpgradePreChecksRequest, opts ...grpc.CallOption) (*KubernetesUpgradePreChecksResponse, error) + KubernetesSyncManifests(ctx context.Context, in *KubernetesSyncManifestRequest, opts ...grpc.CallOption) (ManagementService_KubernetesSyncManifestsClient, error) + CreateSchematic(ctx context.Context, in *CreateSchematicRequest, opts ...grpc.CallOption) (*CreateSchematicResponse, error) +} + +type managementServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewManagementServiceClient(cc grpc.ClientConnInterface) ManagementServiceClient { + return &managementServiceClient{cc} +} + +func (c *managementServiceClient) Kubeconfig(ctx context.Context, in *KubeconfigRequest, opts ...grpc.CallOption) (*KubeconfigResponse, error) { + out := new(KubeconfigResponse) + err := c.cc.Invoke(ctx, ManagementService_Kubeconfig_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *managementServiceClient) Talosconfig(ctx context.Context, in *TalosconfigRequest, opts ...grpc.CallOption) (*TalosconfigResponse, error) { + out := new(TalosconfigResponse) + err := c.cc.Invoke(ctx, ManagementService_Talosconfig_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *managementServiceClient) Omniconfig(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*OmniconfigResponse, error) { + out := new(OmniconfigResponse) + err := c.cc.Invoke(ctx, ManagementService_Omniconfig_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *managementServiceClient) MachineLogs(ctx context.Context, in *MachineLogsRequest, opts ...grpc.CallOption) (ManagementService_MachineLogsClient, error) { + stream, err := c.cc.NewStream(ctx, &ManagementService_ServiceDesc.Streams[0], ManagementService_MachineLogs_FullMethodName, opts...) + if err != nil { + return nil, err + } + x := &managementServiceMachineLogsClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type ManagementService_MachineLogsClient interface { + Recv() (*common.Data, error) + grpc.ClientStream +} + +type managementServiceMachineLogsClient struct { + grpc.ClientStream +} + +func (x *managementServiceMachineLogsClient) Recv() (*common.Data, error) { + m := new(common.Data) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *managementServiceClient) ValidateConfig(ctx context.Context, in *ValidateConfigRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, ManagementService_ValidateConfig_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *managementServiceClient) CreateServiceAccount(ctx context.Context, in *CreateServiceAccountRequest, opts ...grpc.CallOption) (*CreateServiceAccountResponse, error) { + out := new(CreateServiceAccountResponse) + err := c.cc.Invoke(ctx, ManagementService_CreateServiceAccount_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *managementServiceClient) RenewServiceAccount(ctx context.Context, in *RenewServiceAccountRequest, opts ...grpc.CallOption) (*RenewServiceAccountResponse, error) { + out := new(RenewServiceAccountResponse) + err := c.cc.Invoke(ctx, ManagementService_RenewServiceAccount_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *managementServiceClient) ListServiceAccounts(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*ListServiceAccountsResponse, error) { + out := new(ListServiceAccountsResponse) + err := c.cc.Invoke(ctx, ManagementService_ListServiceAccounts_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *managementServiceClient) DestroyServiceAccount(ctx context.Context, in *DestroyServiceAccountRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, ManagementService_DestroyServiceAccount_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *managementServiceClient) KubernetesUpgradePreChecks(ctx context.Context, in *KubernetesUpgradePreChecksRequest, opts ...grpc.CallOption) (*KubernetesUpgradePreChecksResponse, error) { + out := new(KubernetesUpgradePreChecksResponse) + err := c.cc.Invoke(ctx, ManagementService_KubernetesUpgradePreChecks_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *managementServiceClient) KubernetesSyncManifests(ctx context.Context, in *KubernetesSyncManifestRequest, opts ...grpc.CallOption) (ManagementService_KubernetesSyncManifestsClient, error) { + stream, err := c.cc.NewStream(ctx, &ManagementService_ServiceDesc.Streams[1], ManagementService_KubernetesSyncManifests_FullMethodName, opts...) + if err != nil { + return nil, err + } + x := &managementServiceKubernetesSyncManifestsClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type ManagementService_KubernetesSyncManifestsClient interface { + Recv() (*KubernetesSyncManifestResponse, error) + grpc.ClientStream +} + +type managementServiceKubernetesSyncManifestsClient struct { + grpc.ClientStream +} + +func (x *managementServiceKubernetesSyncManifestsClient) Recv() (*KubernetesSyncManifestResponse, error) { + m := new(KubernetesSyncManifestResponse) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *managementServiceClient) CreateSchematic(ctx context.Context, in *CreateSchematicRequest, opts ...grpc.CallOption) (*CreateSchematicResponse, error) { + out := new(CreateSchematicResponse) + err := c.cc.Invoke(ctx, ManagementService_CreateSchematic_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// ManagementServiceServer is the server API for ManagementService service. +// All implementations must embed UnimplementedManagementServiceServer +// for forward compatibility +type ManagementServiceServer interface { + Kubeconfig(context.Context, *KubeconfigRequest) (*KubeconfigResponse, error) + Talosconfig(context.Context, *TalosconfigRequest) (*TalosconfigResponse, error) + Omniconfig(context.Context, *emptypb.Empty) (*OmniconfigResponse, error) + MachineLogs(*MachineLogsRequest, ManagementService_MachineLogsServer) error + ValidateConfig(context.Context, *ValidateConfigRequest) (*emptypb.Empty, error) + CreateServiceAccount(context.Context, *CreateServiceAccountRequest) (*CreateServiceAccountResponse, error) + RenewServiceAccount(context.Context, *RenewServiceAccountRequest) (*RenewServiceAccountResponse, error) + ListServiceAccounts(context.Context, *emptypb.Empty) (*ListServiceAccountsResponse, error) + DestroyServiceAccount(context.Context, *DestroyServiceAccountRequest) (*emptypb.Empty, error) + KubernetesUpgradePreChecks(context.Context, *KubernetesUpgradePreChecksRequest) (*KubernetesUpgradePreChecksResponse, error) + KubernetesSyncManifests(*KubernetesSyncManifestRequest, ManagementService_KubernetesSyncManifestsServer) error + CreateSchematic(context.Context, *CreateSchematicRequest) (*CreateSchematicResponse, error) + mustEmbedUnimplementedManagementServiceServer() +} + +// UnimplementedManagementServiceServer must be embedded to have forward compatible implementations. +type UnimplementedManagementServiceServer struct { +} + +func (UnimplementedManagementServiceServer) Kubeconfig(context.Context, *KubeconfigRequest) (*KubeconfigResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Kubeconfig not implemented") +} +func (UnimplementedManagementServiceServer) Talosconfig(context.Context, *TalosconfigRequest) (*TalosconfigResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Talosconfig not implemented") +} +func (UnimplementedManagementServiceServer) Omniconfig(context.Context, *emptypb.Empty) (*OmniconfigResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Omniconfig not implemented") +} +func (UnimplementedManagementServiceServer) MachineLogs(*MachineLogsRequest, ManagementService_MachineLogsServer) error { + return status.Errorf(codes.Unimplemented, "method MachineLogs not implemented") +} +func (UnimplementedManagementServiceServer) ValidateConfig(context.Context, *ValidateConfigRequest) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method ValidateConfig not implemented") +} +func (UnimplementedManagementServiceServer) CreateServiceAccount(context.Context, *CreateServiceAccountRequest) (*CreateServiceAccountResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateServiceAccount not implemented") +} +func (UnimplementedManagementServiceServer) RenewServiceAccount(context.Context, *RenewServiceAccountRequest) (*RenewServiceAccountResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method RenewServiceAccount not implemented") +} +func (UnimplementedManagementServiceServer) ListServiceAccounts(context.Context, *emptypb.Empty) (*ListServiceAccountsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListServiceAccounts not implemented") +} +func (UnimplementedManagementServiceServer) DestroyServiceAccount(context.Context, *DestroyServiceAccountRequest) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method DestroyServiceAccount not implemented") +} +func (UnimplementedManagementServiceServer) KubernetesUpgradePreChecks(context.Context, *KubernetesUpgradePreChecksRequest) (*KubernetesUpgradePreChecksResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method KubernetesUpgradePreChecks not implemented") +} +func (UnimplementedManagementServiceServer) KubernetesSyncManifests(*KubernetesSyncManifestRequest, ManagementService_KubernetesSyncManifestsServer) error { + return status.Errorf(codes.Unimplemented, "method KubernetesSyncManifests not implemented") +} +func (UnimplementedManagementServiceServer) CreateSchematic(context.Context, *CreateSchematicRequest) (*CreateSchematicResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateSchematic not implemented") +} +func (UnimplementedManagementServiceServer) mustEmbedUnimplementedManagementServiceServer() {} + +// UnsafeManagementServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to ManagementServiceServer will +// result in compilation errors. +type UnsafeManagementServiceServer interface { + mustEmbedUnimplementedManagementServiceServer() +} + +func RegisterManagementServiceServer(s grpc.ServiceRegistrar, srv ManagementServiceServer) { + s.RegisterService(&ManagementService_ServiceDesc, srv) +} + +func _ManagementService_Kubeconfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(KubeconfigRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ManagementServiceServer).Kubeconfig(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ManagementService_Kubeconfig_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ManagementServiceServer).Kubeconfig(ctx, req.(*KubeconfigRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ManagementService_Talosconfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(TalosconfigRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ManagementServiceServer).Talosconfig(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ManagementService_Talosconfig_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ManagementServiceServer).Talosconfig(ctx, req.(*TalosconfigRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ManagementService_Omniconfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(emptypb.Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ManagementServiceServer).Omniconfig(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ManagementService_Omniconfig_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ManagementServiceServer).Omniconfig(ctx, req.(*emptypb.Empty)) + } + return interceptor(ctx, in, info, handler) +} + +func _ManagementService_MachineLogs_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(MachineLogsRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(ManagementServiceServer).MachineLogs(m, &managementServiceMachineLogsServer{stream}) +} + +type ManagementService_MachineLogsServer interface { + Send(*common.Data) error + grpc.ServerStream +} + +type managementServiceMachineLogsServer struct { + grpc.ServerStream +} + +func (x *managementServiceMachineLogsServer) Send(m *common.Data) error { + return x.ServerStream.SendMsg(m) +} + +func _ManagementService_ValidateConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ValidateConfigRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ManagementServiceServer).ValidateConfig(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ManagementService_ValidateConfig_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ManagementServiceServer).ValidateConfig(ctx, req.(*ValidateConfigRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ManagementService_CreateServiceAccount_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateServiceAccountRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ManagementServiceServer).CreateServiceAccount(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ManagementService_CreateServiceAccount_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ManagementServiceServer).CreateServiceAccount(ctx, req.(*CreateServiceAccountRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ManagementService_RenewServiceAccount_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RenewServiceAccountRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ManagementServiceServer).RenewServiceAccount(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ManagementService_RenewServiceAccount_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ManagementServiceServer).RenewServiceAccount(ctx, req.(*RenewServiceAccountRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ManagementService_ListServiceAccounts_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(emptypb.Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ManagementServiceServer).ListServiceAccounts(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ManagementService_ListServiceAccounts_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ManagementServiceServer).ListServiceAccounts(ctx, req.(*emptypb.Empty)) + } + return interceptor(ctx, in, info, handler) +} + +func _ManagementService_DestroyServiceAccount_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DestroyServiceAccountRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ManagementServiceServer).DestroyServiceAccount(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ManagementService_DestroyServiceAccount_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ManagementServiceServer).DestroyServiceAccount(ctx, req.(*DestroyServiceAccountRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ManagementService_KubernetesUpgradePreChecks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(KubernetesUpgradePreChecksRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ManagementServiceServer).KubernetesUpgradePreChecks(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ManagementService_KubernetesUpgradePreChecks_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ManagementServiceServer).KubernetesUpgradePreChecks(ctx, req.(*KubernetesUpgradePreChecksRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ManagementService_KubernetesSyncManifests_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(KubernetesSyncManifestRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(ManagementServiceServer).KubernetesSyncManifests(m, &managementServiceKubernetesSyncManifestsServer{stream}) +} + +type ManagementService_KubernetesSyncManifestsServer interface { + Send(*KubernetesSyncManifestResponse) error + grpc.ServerStream +} + +type managementServiceKubernetesSyncManifestsServer struct { + grpc.ServerStream +} + +func (x *managementServiceKubernetesSyncManifestsServer) Send(m *KubernetesSyncManifestResponse) error { + return x.ServerStream.SendMsg(m) +} + +func _ManagementService_CreateSchematic_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateSchematicRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ManagementServiceServer).CreateSchematic(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ManagementService_CreateSchematic_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ManagementServiceServer).CreateSchematic(ctx, req.(*CreateSchematicRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// ManagementService_ServiceDesc is the grpc.ServiceDesc for ManagementService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var ManagementService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "management.ManagementService", + HandlerType: (*ManagementServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "Kubeconfig", + Handler: _ManagementService_Kubeconfig_Handler, + }, + { + MethodName: "Talosconfig", + Handler: _ManagementService_Talosconfig_Handler, + }, + { + MethodName: "Omniconfig", + Handler: _ManagementService_Omniconfig_Handler, + }, + { + MethodName: "ValidateConfig", + Handler: _ManagementService_ValidateConfig_Handler, + }, + { + MethodName: "CreateServiceAccount", + Handler: _ManagementService_CreateServiceAccount_Handler, + }, + { + MethodName: "RenewServiceAccount", + Handler: _ManagementService_RenewServiceAccount_Handler, + }, + { + MethodName: "ListServiceAccounts", + Handler: _ManagementService_ListServiceAccounts_Handler, + }, + { + MethodName: "DestroyServiceAccount", + Handler: _ManagementService_DestroyServiceAccount_Handler, + }, + { + MethodName: "KubernetesUpgradePreChecks", + Handler: _ManagementService_KubernetesUpgradePreChecks_Handler, + }, + { + MethodName: "CreateSchematic", + Handler: _ManagementService_CreateSchematic_Handler, + }, + }, + Streams: []grpc.StreamDesc{ + { + StreamName: "MachineLogs", + Handler: _ManagementService_MachineLogs_Handler, + ServerStreams: true, + }, + { + StreamName: "KubernetesSyncManifests", + Handler: _ManagementService_KubernetesSyncManifests_Handler, + ServerStreams: true, + }, + }, + Metadata: "omni/management/management.proto", +} diff --git a/client/api/omni/management/management_vtproto.pb.go b/client/api/omni/management/management_vtproto.pb.go new file mode 100644 index 00000000..0f0797fe --- /dev/null +++ b/client/api/omni/management/management_vtproto.pb.go @@ -0,0 +1,4745 @@ +// Code generated by protoc-gen-go-vtproto. DO NOT EDIT. +// protoc-gen-go-vtproto version: v0.6.0 +// source: omni/management/management.proto + +package management + +import ( + fmt "fmt" + io "io" + + protohelpers "github.com/planetscale/vtprotobuf/protohelpers" + durationpb1 "github.com/planetscale/vtprotobuf/types/known/durationpb" + timestamppb1 "github.com/planetscale/vtprotobuf/types/known/timestamppb" + proto "google.golang.org/protobuf/proto" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + durationpb "google.golang.org/protobuf/types/known/durationpb" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +func (m *KubeconfigResponse) CloneVT() *KubeconfigResponse { + if m == nil { + return (*KubeconfigResponse)(nil) + } + r := new(KubeconfigResponse) + if rhs := m.Kubeconfig; rhs != nil { + tmpBytes := make([]byte, len(rhs)) + copy(tmpBytes, rhs) + r.Kubeconfig = tmpBytes + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *KubeconfigResponse) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *TalosconfigResponse) CloneVT() *TalosconfigResponse { + if m == nil { + return (*TalosconfigResponse)(nil) + } + r := new(TalosconfigResponse) + if rhs := m.Talosconfig; rhs != nil { + tmpBytes := make([]byte, len(rhs)) + copy(tmpBytes, rhs) + r.Talosconfig = tmpBytes + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *TalosconfigResponse) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *OmniconfigResponse) CloneVT() *OmniconfigResponse { + if m == nil { + return (*OmniconfigResponse)(nil) + } + r := new(OmniconfigResponse) + if rhs := m.Omniconfig; rhs != nil { + tmpBytes := make([]byte, len(rhs)) + copy(tmpBytes, rhs) + r.Omniconfig = tmpBytes + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *OmniconfigResponse) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *MachineLogsRequest) CloneVT() *MachineLogsRequest { + if m == nil { + return (*MachineLogsRequest)(nil) + } + r := new(MachineLogsRequest) + r.MachineId = m.MachineId + r.Follow = m.Follow + r.TailLines = m.TailLines + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *MachineLogsRequest) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *ValidateConfigRequest) CloneVT() *ValidateConfigRequest { + if m == nil { + return (*ValidateConfigRequest)(nil) + } + r := new(ValidateConfigRequest) + r.Config = m.Config + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *ValidateConfigRequest) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *TalosconfigRequest) CloneVT() *TalosconfigRequest { + if m == nil { + return (*TalosconfigRequest)(nil) + } + r := new(TalosconfigRequest) + r.Admin = m.Admin + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *TalosconfigRequest) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *CreateServiceAccountRequest) CloneVT() *CreateServiceAccountRequest { + if m == nil { + return (*CreateServiceAccountRequest)(nil) + } + r := new(CreateServiceAccountRequest) + r.ArmoredPgpPublicKey = m.ArmoredPgpPublicKey + r.UseUserRole = m.UseUserRole + r.Role = m.Role + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *CreateServiceAccountRequest) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *CreateServiceAccountResponse) CloneVT() *CreateServiceAccountResponse { + if m == nil { + return (*CreateServiceAccountResponse)(nil) + } + r := new(CreateServiceAccountResponse) + r.PublicKeyId = m.PublicKeyId + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *CreateServiceAccountResponse) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *RenewServiceAccountRequest) CloneVT() *RenewServiceAccountRequest { + if m == nil { + return (*RenewServiceAccountRequest)(nil) + } + r := new(RenewServiceAccountRequest) + r.Name = m.Name + r.ArmoredPgpPublicKey = m.ArmoredPgpPublicKey + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *RenewServiceAccountRequest) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *RenewServiceAccountResponse) CloneVT() *RenewServiceAccountResponse { + if m == nil { + return (*RenewServiceAccountResponse)(nil) + } + r := new(RenewServiceAccountResponse) + r.PublicKeyId = m.PublicKeyId + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *RenewServiceAccountResponse) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *DestroyServiceAccountRequest) CloneVT() *DestroyServiceAccountRequest { + if m == nil { + return (*DestroyServiceAccountRequest)(nil) + } + r := new(DestroyServiceAccountRequest) + r.Name = m.Name + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *DestroyServiceAccountRequest) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *ListServiceAccountsResponse_ServiceAccount_PgpPublicKey) CloneVT() *ListServiceAccountsResponse_ServiceAccount_PgpPublicKey { + if m == nil { + return (*ListServiceAccountsResponse_ServiceAccount_PgpPublicKey)(nil) + } + r := new(ListServiceAccountsResponse_ServiceAccount_PgpPublicKey) + r.Id = m.Id + r.Armored = m.Armored + r.Expiration = (*timestamppb.Timestamp)((*timestamppb1.Timestamp)(m.Expiration).CloneVT()) + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *ListServiceAccountsResponse_ServiceAccount_PgpPublicKey) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *ListServiceAccountsResponse_ServiceAccount) CloneVT() *ListServiceAccountsResponse_ServiceAccount { + if m == nil { + return (*ListServiceAccountsResponse_ServiceAccount)(nil) + } + r := new(ListServiceAccountsResponse_ServiceAccount) + r.Name = m.Name + r.Role = m.Role + if rhs := m.PgpPublicKeys; rhs != nil { + tmpContainer := make([]*ListServiceAccountsResponse_ServiceAccount_PgpPublicKey, len(rhs)) + for k, v := range rhs { + tmpContainer[k] = v.CloneVT() + } + r.PgpPublicKeys = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *ListServiceAccountsResponse_ServiceAccount) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *ListServiceAccountsResponse) CloneVT() *ListServiceAccountsResponse { + if m == nil { + return (*ListServiceAccountsResponse)(nil) + } + r := new(ListServiceAccountsResponse) + if rhs := m.ServiceAccounts; rhs != nil { + tmpContainer := make([]*ListServiceAccountsResponse_ServiceAccount, len(rhs)) + for k, v := range rhs { + tmpContainer[k] = v.CloneVT() + } + r.ServiceAccounts = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *ListServiceAccountsResponse) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *KubeconfigRequest) CloneVT() *KubeconfigRequest { + if m == nil { + return (*KubeconfigRequest)(nil) + } + r := new(KubeconfigRequest) + r.ServiceAccount = m.ServiceAccount + r.ServiceAccountTtl = (*durationpb.Duration)((*durationpb1.Duration)(m.ServiceAccountTtl).CloneVT()) + r.ServiceAccountUser = m.ServiceAccountUser + if rhs := m.ServiceAccountGroups; rhs != nil { + tmpContainer := make([]string, len(rhs)) + copy(tmpContainer, rhs) + r.ServiceAccountGroups = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *KubeconfigRequest) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *KubernetesUpgradePreChecksRequest) CloneVT() *KubernetesUpgradePreChecksRequest { + if m == nil { + return (*KubernetesUpgradePreChecksRequest)(nil) + } + r := new(KubernetesUpgradePreChecksRequest) + r.NewVersion = m.NewVersion + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *KubernetesUpgradePreChecksRequest) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *KubernetesUpgradePreChecksResponse) CloneVT() *KubernetesUpgradePreChecksResponse { + if m == nil { + return (*KubernetesUpgradePreChecksResponse)(nil) + } + r := new(KubernetesUpgradePreChecksResponse) + r.Ok = m.Ok + r.Reason = m.Reason + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *KubernetesUpgradePreChecksResponse) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *KubernetesSyncManifestRequest) CloneVT() *KubernetesSyncManifestRequest { + if m == nil { + return (*KubernetesSyncManifestRequest)(nil) + } + r := new(KubernetesSyncManifestRequest) + r.DryRun = m.DryRun + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *KubernetesSyncManifestRequest) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *KubernetesSyncManifestResponse) CloneVT() *KubernetesSyncManifestResponse { + if m == nil { + return (*KubernetesSyncManifestResponse)(nil) + } + r := new(KubernetesSyncManifestResponse) + r.ResponseType = m.ResponseType + r.Path = m.Path + r.Diff = m.Diff + r.Skipped = m.Skipped + if rhs := m.Object; rhs != nil { + tmpBytes := make([]byte, len(rhs)) + copy(tmpBytes, rhs) + r.Object = tmpBytes + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *KubernetesSyncManifestResponse) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *CreateSchematicRequest) CloneVT() *CreateSchematicRequest { + if m == nil { + return (*CreateSchematicRequest)(nil) + } + r := new(CreateSchematicRequest) + if rhs := m.Extensions; rhs != nil { + tmpContainer := make([]string, len(rhs)) + copy(tmpContainer, rhs) + r.Extensions = tmpContainer + } + if rhs := m.ExtraKernelArgs; rhs != nil { + tmpContainer := make([]string, len(rhs)) + copy(tmpContainer, rhs) + r.ExtraKernelArgs = tmpContainer + } + if rhs := m.MetaValues; rhs != nil { + tmpContainer := make(map[uint32]string, len(rhs)) + for k, v := range rhs { + tmpContainer[k] = v + } + r.MetaValues = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *CreateSchematicRequest) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *CreateSchematicResponse) CloneVT() *CreateSchematicResponse { + if m == nil { + return (*CreateSchematicResponse)(nil) + } + r := new(CreateSchematicResponse) + r.SchematicId = m.SchematicId + r.PxeUrl = m.PxeUrl + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *CreateSchematicResponse) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (this *KubeconfigResponse) EqualVT(that *KubeconfigResponse) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if string(this.Kubeconfig) != string(that.Kubeconfig) { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *KubeconfigResponse) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*KubeconfigResponse) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *TalosconfigResponse) EqualVT(that *TalosconfigResponse) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if string(this.Talosconfig) != string(that.Talosconfig) { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *TalosconfigResponse) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*TalosconfigResponse) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *OmniconfigResponse) EqualVT(that *OmniconfigResponse) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if string(this.Omniconfig) != string(that.Omniconfig) { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *OmniconfigResponse) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*OmniconfigResponse) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *MachineLogsRequest) EqualVT(that *MachineLogsRequest) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.MachineId != that.MachineId { + return false + } + if this.Follow != that.Follow { + return false + } + if this.TailLines != that.TailLines { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *MachineLogsRequest) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*MachineLogsRequest) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *ValidateConfigRequest) EqualVT(that *ValidateConfigRequest) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Config != that.Config { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *ValidateConfigRequest) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*ValidateConfigRequest) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *TalosconfigRequest) EqualVT(that *TalosconfigRequest) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Admin != that.Admin { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *TalosconfigRequest) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*TalosconfigRequest) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *CreateServiceAccountRequest) EqualVT(that *CreateServiceAccountRequest) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.ArmoredPgpPublicKey != that.ArmoredPgpPublicKey { + return false + } + if this.UseUserRole != that.UseUserRole { + return false + } + if this.Role != that.Role { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *CreateServiceAccountRequest) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*CreateServiceAccountRequest) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *CreateServiceAccountResponse) EqualVT(that *CreateServiceAccountResponse) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.PublicKeyId != that.PublicKeyId { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *CreateServiceAccountResponse) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*CreateServiceAccountResponse) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *RenewServiceAccountRequest) EqualVT(that *RenewServiceAccountRequest) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Name != that.Name { + return false + } + if this.ArmoredPgpPublicKey != that.ArmoredPgpPublicKey { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *RenewServiceAccountRequest) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*RenewServiceAccountRequest) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *RenewServiceAccountResponse) EqualVT(that *RenewServiceAccountResponse) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.PublicKeyId != that.PublicKeyId { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *RenewServiceAccountResponse) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*RenewServiceAccountResponse) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *DestroyServiceAccountRequest) EqualVT(that *DestroyServiceAccountRequest) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Name != that.Name { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *DestroyServiceAccountRequest) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*DestroyServiceAccountRequest) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *ListServiceAccountsResponse_ServiceAccount_PgpPublicKey) EqualVT(that *ListServiceAccountsResponse_ServiceAccount_PgpPublicKey) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Id != that.Id { + return false + } + if this.Armored != that.Armored { + return false + } + if !(*timestamppb1.Timestamp)(this.Expiration).EqualVT((*timestamppb1.Timestamp)(that.Expiration)) { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *ListServiceAccountsResponse_ServiceAccount_PgpPublicKey) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*ListServiceAccountsResponse_ServiceAccount_PgpPublicKey) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *ListServiceAccountsResponse_ServiceAccount) EqualVT(that *ListServiceAccountsResponse_ServiceAccount) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Name != that.Name { + return false + } + if len(this.PgpPublicKeys) != len(that.PgpPublicKeys) { + return false + } + for i, vx := range this.PgpPublicKeys { + vy := that.PgpPublicKeys[i] + if p, q := vx, vy; p != q { + if p == nil { + p = &ListServiceAccountsResponse_ServiceAccount_PgpPublicKey{} + } + if q == nil { + q = &ListServiceAccountsResponse_ServiceAccount_PgpPublicKey{} + } + if !p.EqualVT(q) { + return false + } + } + } + if this.Role != that.Role { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *ListServiceAccountsResponse_ServiceAccount) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*ListServiceAccountsResponse_ServiceAccount) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *ListServiceAccountsResponse) EqualVT(that *ListServiceAccountsResponse) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if len(this.ServiceAccounts) != len(that.ServiceAccounts) { + return false + } + for i, vx := range this.ServiceAccounts { + vy := that.ServiceAccounts[i] + if p, q := vx, vy; p != q { + if p == nil { + p = &ListServiceAccountsResponse_ServiceAccount{} + } + if q == nil { + q = &ListServiceAccountsResponse_ServiceAccount{} + } + if !p.EqualVT(q) { + return false + } + } + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *ListServiceAccountsResponse) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*ListServiceAccountsResponse) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *KubeconfigRequest) EqualVT(that *KubeconfigRequest) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.ServiceAccount != that.ServiceAccount { + return false + } + if !(*durationpb1.Duration)(this.ServiceAccountTtl).EqualVT((*durationpb1.Duration)(that.ServiceAccountTtl)) { + return false + } + if this.ServiceAccountUser != that.ServiceAccountUser { + return false + } + if len(this.ServiceAccountGroups) != len(that.ServiceAccountGroups) { + return false + } + for i, vx := range this.ServiceAccountGroups { + vy := that.ServiceAccountGroups[i] + if vx != vy { + return false + } + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *KubeconfigRequest) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*KubeconfigRequest) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *KubernetesUpgradePreChecksRequest) EqualVT(that *KubernetesUpgradePreChecksRequest) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.NewVersion != that.NewVersion { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *KubernetesUpgradePreChecksRequest) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*KubernetesUpgradePreChecksRequest) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *KubernetesUpgradePreChecksResponse) EqualVT(that *KubernetesUpgradePreChecksResponse) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Ok != that.Ok { + return false + } + if this.Reason != that.Reason { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *KubernetesUpgradePreChecksResponse) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*KubernetesUpgradePreChecksResponse) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *KubernetesSyncManifestRequest) EqualVT(that *KubernetesSyncManifestRequest) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.DryRun != that.DryRun { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *KubernetesSyncManifestRequest) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*KubernetesSyncManifestRequest) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *KubernetesSyncManifestResponse) EqualVT(that *KubernetesSyncManifestResponse) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.ResponseType != that.ResponseType { + return false + } + if this.Path != that.Path { + return false + } + if string(this.Object) != string(that.Object) { + return false + } + if this.Diff != that.Diff { + return false + } + if this.Skipped != that.Skipped { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *KubernetesSyncManifestResponse) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*KubernetesSyncManifestResponse) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *CreateSchematicRequest) EqualVT(that *CreateSchematicRequest) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if len(this.Extensions) != len(that.Extensions) { + return false + } + for i, vx := range this.Extensions { + vy := that.Extensions[i] + if vx != vy { + return false + } + } + if len(this.ExtraKernelArgs) != len(that.ExtraKernelArgs) { + return false + } + for i, vx := range this.ExtraKernelArgs { + vy := that.ExtraKernelArgs[i] + if vx != vy { + return false + } + } + if len(this.MetaValues) != len(that.MetaValues) { + return false + } + for i, vx := range this.MetaValues { + vy, ok := that.MetaValues[i] + if !ok { + return false + } + if vx != vy { + return false + } + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *CreateSchematicRequest) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*CreateSchematicRequest) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *CreateSchematicResponse) EqualVT(that *CreateSchematicResponse) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.SchematicId != that.SchematicId { + return false + } + if this.PxeUrl != that.PxeUrl { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *CreateSchematicResponse) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*CreateSchematicResponse) + if !ok { + return false + } + return this.EqualVT(that) +} +func (m *KubeconfigResponse) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *KubeconfigResponse) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *KubeconfigResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Kubeconfig) > 0 { + i -= len(m.Kubeconfig) + copy(dAtA[i:], m.Kubeconfig) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Kubeconfig))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *TalosconfigResponse) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TalosconfigResponse) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *TalosconfigResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Talosconfig) > 0 { + i -= len(m.Talosconfig) + copy(dAtA[i:], m.Talosconfig) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Talosconfig))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *OmniconfigResponse) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *OmniconfigResponse) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *OmniconfigResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Omniconfig) > 0 { + i -= len(m.Omniconfig) + copy(dAtA[i:], m.Omniconfig) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Omniconfig))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MachineLogsRequest) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MachineLogsRequest) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *MachineLogsRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.TailLines != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.TailLines)) + i-- + dAtA[i] = 0x18 + } + if m.Follow { + i-- + if m.Follow { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x10 + } + if len(m.MachineId) > 0 { + i -= len(m.MachineId) + copy(dAtA[i:], m.MachineId) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.MachineId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ValidateConfigRequest) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ValidateConfigRequest) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *ValidateConfigRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Config) > 0 { + i -= len(m.Config) + copy(dAtA[i:], m.Config) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Config))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *TalosconfigRequest) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TalosconfigRequest) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *TalosconfigRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.Admin { + i-- + if m.Admin { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *CreateServiceAccountRequest) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CreateServiceAccountRequest) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *CreateServiceAccountRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Role) > 0 { + i -= len(m.Role) + copy(dAtA[i:], m.Role) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Role))) + i-- + dAtA[i] = 0x22 + } + if m.UseUserRole { + i-- + if m.UseUserRole { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x18 + } + if len(m.ArmoredPgpPublicKey) > 0 { + i -= len(m.ArmoredPgpPublicKey) + copy(dAtA[i:], m.ArmoredPgpPublicKey) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ArmoredPgpPublicKey))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *CreateServiceAccountResponse) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CreateServiceAccountResponse) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *CreateServiceAccountResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.PublicKeyId) > 0 { + i -= len(m.PublicKeyId) + copy(dAtA[i:], m.PublicKeyId) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.PublicKeyId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *RenewServiceAccountRequest) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RenewServiceAccountRequest) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *RenewServiceAccountRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.ArmoredPgpPublicKey) > 0 { + i -= len(m.ArmoredPgpPublicKey) + copy(dAtA[i:], m.ArmoredPgpPublicKey) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ArmoredPgpPublicKey))) + i-- + dAtA[i] = 0x12 + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *RenewServiceAccountResponse) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RenewServiceAccountResponse) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *RenewServiceAccountResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.PublicKeyId) > 0 { + i -= len(m.PublicKeyId) + copy(dAtA[i:], m.PublicKeyId) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.PublicKeyId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *DestroyServiceAccountRequest) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DestroyServiceAccountRequest) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *DestroyServiceAccountRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ListServiceAccountsResponse_ServiceAccount_PgpPublicKey) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ListServiceAccountsResponse_ServiceAccount_PgpPublicKey) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *ListServiceAccountsResponse_ServiceAccount_PgpPublicKey) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.Expiration != nil { + size, err := (*timestamppb1.Timestamp)(m.Expiration).MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x1a + } + if len(m.Armored) > 0 { + i -= len(m.Armored) + copy(dAtA[i:], m.Armored) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Armored))) + i-- + dAtA[i] = 0x12 + } + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ListServiceAccountsResponse_ServiceAccount) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ListServiceAccountsResponse_ServiceAccount) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *ListServiceAccountsResponse_ServiceAccount) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Role) > 0 { + i -= len(m.Role) + copy(dAtA[i:], m.Role) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Role))) + i-- + dAtA[i] = 0x22 + } + if len(m.PgpPublicKeys) > 0 { + for iNdEx := len(m.PgpPublicKeys) - 1; iNdEx >= 0; iNdEx-- { + size, err := m.PgpPublicKeys[iNdEx].MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x12 + } + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ListServiceAccountsResponse) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ListServiceAccountsResponse) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *ListServiceAccountsResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.ServiceAccounts) > 0 { + for iNdEx := len(m.ServiceAccounts) - 1; iNdEx >= 0; iNdEx-- { + size, err := m.ServiceAccounts[iNdEx].MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *KubeconfigRequest) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *KubeconfigRequest) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *KubeconfigRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.ServiceAccountGroups) > 0 { + for iNdEx := len(m.ServiceAccountGroups) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.ServiceAccountGroups[iNdEx]) + copy(dAtA[i:], m.ServiceAccountGroups[iNdEx]) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ServiceAccountGroups[iNdEx]))) + i-- + dAtA[i] = 0x22 + } + } + if len(m.ServiceAccountUser) > 0 { + i -= len(m.ServiceAccountUser) + copy(dAtA[i:], m.ServiceAccountUser) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ServiceAccountUser))) + i-- + dAtA[i] = 0x1a + } + if m.ServiceAccountTtl != nil { + size, err := (*durationpb1.Duration)(m.ServiceAccountTtl).MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x12 + } + if m.ServiceAccount { + i-- + if m.ServiceAccount { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *KubernetesUpgradePreChecksRequest) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *KubernetesUpgradePreChecksRequest) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *KubernetesUpgradePreChecksRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.NewVersion) > 0 { + i -= len(m.NewVersion) + copy(dAtA[i:], m.NewVersion) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.NewVersion))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *KubernetesUpgradePreChecksResponse) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *KubernetesUpgradePreChecksResponse) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *KubernetesUpgradePreChecksResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Reason) > 0 { + i -= len(m.Reason) + copy(dAtA[i:], m.Reason) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Reason))) + i-- + dAtA[i] = 0x12 + } + if m.Ok { + i-- + if m.Ok { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *KubernetesSyncManifestRequest) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *KubernetesSyncManifestRequest) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *KubernetesSyncManifestRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.DryRun { + i-- + if m.DryRun { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *KubernetesSyncManifestResponse) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *KubernetesSyncManifestResponse) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *KubernetesSyncManifestResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.Skipped { + i-- + if m.Skipped { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x28 + } + if len(m.Diff) > 0 { + i -= len(m.Diff) + copy(dAtA[i:], m.Diff) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Diff))) + i-- + dAtA[i] = 0x22 + } + if len(m.Object) > 0 { + i -= len(m.Object) + copy(dAtA[i:], m.Object) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Object))) + i-- + dAtA[i] = 0x1a + } + if len(m.Path) > 0 { + i -= len(m.Path) + copy(dAtA[i:], m.Path) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Path))) + i-- + dAtA[i] = 0x12 + } + if m.ResponseType != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.ResponseType)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *CreateSchematicRequest) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CreateSchematicRequest) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *CreateSchematicRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.MetaValues) > 0 { + for k := range m.MetaValues { + v := m.MetaValues[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i = protohelpers.EncodeVarint(dAtA, i, uint64(k)) + i-- + dAtA[i] = 0x8 + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x1a + } + } + if len(m.ExtraKernelArgs) > 0 { + for iNdEx := len(m.ExtraKernelArgs) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.ExtraKernelArgs[iNdEx]) + copy(dAtA[i:], m.ExtraKernelArgs[iNdEx]) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ExtraKernelArgs[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + if len(m.Extensions) > 0 { + for iNdEx := len(m.Extensions) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Extensions[iNdEx]) + copy(dAtA[i:], m.Extensions[iNdEx]) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Extensions[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *CreateSchematicResponse) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CreateSchematicResponse) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *CreateSchematicResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.PxeUrl) > 0 { + i -= len(m.PxeUrl) + copy(dAtA[i:], m.PxeUrl) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.PxeUrl))) + i-- + dAtA[i] = 0x12 + } + if len(m.SchematicId) > 0 { + i -= len(m.SchematicId) + copy(dAtA[i:], m.SchematicId) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.SchematicId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *KubeconfigResponse) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Kubeconfig) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *TalosconfigResponse) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Talosconfig) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *OmniconfigResponse) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Omniconfig) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *MachineLogsRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.MachineId) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.Follow { + n += 2 + } + if m.TailLines != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.TailLines)) + } + n += len(m.unknownFields) + return n +} + +func (m *ValidateConfigRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Config) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *TalosconfigRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Admin { + n += 2 + } + n += len(m.unknownFields) + return n +} + +func (m *CreateServiceAccountRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ArmoredPgpPublicKey) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.UseUserRole { + n += 2 + } + l = len(m.Role) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *CreateServiceAccountResponse) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.PublicKeyId) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *RenewServiceAccountRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.ArmoredPgpPublicKey) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *RenewServiceAccountResponse) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.PublicKeyId) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *DestroyServiceAccountRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *ListServiceAccountsResponse_ServiceAccount_PgpPublicKey) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Id) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Armored) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.Expiration != nil { + l = (*timestamppb1.Timestamp)(m.Expiration).SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *ListServiceAccountsResponse_ServiceAccount) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if len(m.PgpPublicKeys) > 0 { + for _, e := range m.PgpPublicKeys { + l = e.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + l = len(m.Role) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *ListServiceAccountsResponse) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.ServiceAccounts) > 0 { + for _, e := range m.ServiceAccounts { + l = e.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + n += len(m.unknownFields) + return n +} + +func (m *KubeconfigRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.ServiceAccount { + n += 2 + } + if m.ServiceAccountTtl != nil { + l = (*durationpb1.Duration)(m.ServiceAccountTtl).SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.ServiceAccountUser) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if len(m.ServiceAccountGroups) > 0 { + for _, s := range m.ServiceAccountGroups { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + n += len(m.unknownFields) + return n +} + +func (m *KubernetesUpgradePreChecksRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.NewVersion) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *KubernetesUpgradePreChecksResponse) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Ok { + n += 2 + } + l = len(m.Reason) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *KubernetesSyncManifestRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.DryRun { + n += 2 + } + n += len(m.unknownFields) + return n +} + +func (m *KubernetesSyncManifestResponse) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.ResponseType != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.ResponseType)) + } + l = len(m.Path) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Object) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Diff) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.Skipped { + n += 2 + } + n += len(m.unknownFields) + return n +} + +func (m *CreateSchematicRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Extensions) > 0 { + for _, s := range m.Extensions { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + if len(m.ExtraKernelArgs) > 0 { + for _, s := range m.ExtraKernelArgs { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + if len(m.MetaValues) > 0 { + for k, v := range m.MetaValues { + _ = k + _ = v + mapEntrySize := 1 + protohelpers.SizeOfVarint(uint64(k)) + 1 + len(v) + protohelpers.SizeOfVarint(uint64(len(v))) + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) + } + } + n += len(m.unknownFields) + return n +} + +func (m *CreateSchematicResponse) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.SchematicId) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.PxeUrl) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *KubeconfigResponse) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: KubeconfigResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: KubeconfigResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Kubeconfig", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Kubeconfig = append(m.Kubeconfig[:0], dAtA[iNdEx:postIndex]...) + if m.Kubeconfig == nil { + m.Kubeconfig = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TalosconfigResponse) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TalosconfigResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TalosconfigResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Talosconfig", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Talosconfig = append(m.Talosconfig[:0], dAtA[iNdEx:postIndex]...) + if m.Talosconfig == nil { + m.Talosconfig = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *OmniconfigResponse) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: OmniconfigResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: OmniconfigResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Omniconfig", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Omniconfig = append(m.Omniconfig[:0], dAtA[iNdEx:postIndex]...) + if m.Omniconfig == nil { + m.Omniconfig = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MachineLogsRequest) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MachineLogsRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MachineLogsRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MachineId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.MachineId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Follow", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Follow = bool(v != 0) + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TailLines", wireType) + } + m.TailLines = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.TailLines |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ValidateConfigRequest) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ValidateConfigRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ValidateConfigRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Config", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Config = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TalosconfigRequest) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TalosconfigRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TalosconfigRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Admin", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Admin = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CreateServiceAccountRequest) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CreateServiceAccountRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CreateServiceAccountRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ArmoredPgpPublicKey", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ArmoredPgpPublicKey = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field UseUserRole", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.UseUserRole = bool(v != 0) + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Role", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Role = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CreateServiceAccountResponse) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CreateServiceAccountResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CreateServiceAccountResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PublicKeyId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PublicKeyId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RenewServiceAccountRequest) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RenewServiceAccountRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RenewServiceAccountRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ArmoredPgpPublicKey", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ArmoredPgpPublicKey = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RenewServiceAccountResponse) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RenewServiceAccountResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RenewServiceAccountResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PublicKeyId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PublicKeyId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DestroyServiceAccountRequest) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DestroyServiceAccountRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DestroyServiceAccountRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ListServiceAccountsResponse_ServiceAccount_PgpPublicKey) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ListServiceAccountsResponse_ServiceAccount_PgpPublicKey: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ListServiceAccountsResponse_ServiceAccount_PgpPublicKey: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Id = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Armored", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Armored = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Expiration", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Expiration == nil { + m.Expiration = ×tamppb.Timestamp{} + } + if err := (*timestamppb1.Timestamp)(m.Expiration).UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ListServiceAccountsResponse_ServiceAccount) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ListServiceAccountsResponse_ServiceAccount: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ListServiceAccountsResponse_ServiceAccount: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PgpPublicKeys", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PgpPublicKeys = append(m.PgpPublicKeys, &ListServiceAccountsResponse_ServiceAccount_PgpPublicKey{}) + if err := m.PgpPublicKeys[len(m.PgpPublicKeys)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Role", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Role = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ListServiceAccountsResponse) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ListServiceAccountsResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ListServiceAccountsResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ServiceAccounts", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ServiceAccounts = append(m.ServiceAccounts, &ListServiceAccountsResponse_ServiceAccount{}) + if err := m.ServiceAccounts[len(m.ServiceAccounts)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *KubeconfigRequest) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: KubeconfigRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: KubeconfigRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ServiceAccount", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.ServiceAccount = bool(v != 0) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ServiceAccountTtl", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ServiceAccountTtl == nil { + m.ServiceAccountTtl = &durationpb.Duration{} + } + if err := (*durationpb1.Duration)(m.ServiceAccountTtl).UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ServiceAccountUser", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ServiceAccountUser = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ServiceAccountGroups", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ServiceAccountGroups = append(m.ServiceAccountGroups, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *KubernetesUpgradePreChecksRequest) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: KubernetesUpgradePreChecksRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: KubernetesUpgradePreChecksRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NewVersion", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.NewVersion = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *KubernetesUpgradePreChecksResponse) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: KubernetesUpgradePreChecksResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: KubernetesUpgradePreChecksResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Ok", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Ok = bool(v != 0) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Reason", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Reason = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *KubernetesSyncManifestRequest) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: KubernetesSyncManifestRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: KubernetesSyncManifestRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DryRun", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.DryRun = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *KubernetesSyncManifestResponse) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: KubernetesSyncManifestResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: KubernetesSyncManifestResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ResponseType", wireType) + } + m.ResponseType = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ResponseType |= KubernetesSyncManifestResponse_ResponseType(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Path", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Path = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Object", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Object = append(m.Object[:0], dAtA[iNdEx:postIndex]...) + if m.Object == nil { + m.Object = []byte{} + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Diff", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Diff = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Skipped", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Skipped = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CreateSchematicRequest) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CreateSchematicRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CreateSchematicRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Extensions", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Extensions = append(m.Extensions, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ExtraKernelArgs", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ExtraKernelArgs = append(m.ExtraKernelArgs, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MetaValues", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.MetaValues == nil { + m.MetaValues = make(map[uint32]string) + } + var mapkey uint32 + var mapvalue string + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + mapkey |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + } else if fieldNum == 2 { + var stringLenmapvalue uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapvalue |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapvalue := int(stringLenmapvalue) + if intStringLenmapvalue < 0 { + return protohelpers.ErrInvalidLength + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue < 0 { + return protohelpers.ErrInvalidLength + } + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.MetaValues[mapkey] = mapvalue + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CreateSchematicResponse) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CreateSchematicResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CreateSchematicResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SchematicId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SchematicId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PxeUrl", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PxeUrl = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} diff --git a/client/api/omni/oidc/oidc.pb.go b/client/api/omni/oidc/oidc.pb.go new file mode 100644 index 00000000..4567c316 --- /dev/null +++ b/client/api/omni/oidc/oidc.pb.go @@ -0,0 +1,223 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.32.0 +// protoc v4.24.4 +// source: omni/oidc/oidc.proto + +package oidc + +import ( + reflect "reflect" + sync "sync" + + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + _ "google.golang.org/protobuf/types/known/emptypb" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type AuthenticateRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Auth Request ID. + AuthRequestId string `protobuf:"bytes,1,opt,name=auth_request_id,json=authRequestId,proto3" json:"auth_request_id,omitempty"` +} + +func (x *AuthenticateRequest) Reset() { + *x = AuthenticateRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_oidc_oidc_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AuthenticateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AuthenticateRequest) ProtoMessage() {} + +func (x *AuthenticateRequest) ProtoReflect() protoreflect.Message { + mi := &file_omni_oidc_oidc_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AuthenticateRequest.ProtoReflect.Descriptor instead. +func (*AuthenticateRequest) Descriptor() ([]byte, []int) { + return file_omni_oidc_oidc_proto_rawDescGZIP(), []int{0} +} + +func (x *AuthenticateRequest) GetAuthRequestId() string { + if x != nil { + return x.AuthRequestId + } + return "" +} + +type AuthenticateResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // URL to redirect the user to. + RedirectUrl string `protobuf:"bytes,1,opt,name=redirect_url,json=redirectUrl,proto3" json:"redirect_url,omitempty"` +} + +func (x *AuthenticateResponse) Reset() { + *x = AuthenticateResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_oidc_oidc_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AuthenticateResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AuthenticateResponse) ProtoMessage() {} + +func (x *AuthenticateResponse) ProtoReflect() protoreflect.Message { + mi := &file_omni_oidc_oidc_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AuthenticateResponse.ProtoReflect.Descriptor instead. +func (*AuthenticateResponse) Descriptor() ([]byte, []int) { + return file_omni_oidc_oidc_proto_rawDescGZIP(), []int{1} +} + +func (x *AuthenticateResponse) GetRedirectUrl() string { + if x != nil { + return x.RedirectUrl + } + return "" +} + +var File_omni_oidc_oidc_proto protoreflect.FileDescriptor + +var file_omni_oidc_oidc_proto_rawDesc = []byte{ + 0x0a, 0x14, 0x6f, 0x6d, 0x6e, 0x69, 0x2f, 0x6f, 0x69, 0x64, 0x63, 0x2f, 0x6f, 0x69, 0x64, 0x63, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x04, 0x6f, 0x69, 0x64, 0x63, 0x1a, 0x1b, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, + 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x3d, 0x0a, 0x13, 0x41, 0x75, 0x74, + 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x26, 0x0a, 0x0f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x22, 0x39, 0x0a, 0x14, 0x41, 0x75, 0x74, 0x68, + 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x5f, 0x75, 0x72, 0x6c, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, + 0x55, 0x72, 0x6c, 0x32, 0x54, 0x0a, 0x0b, 0x4f, 0x49, 0x44, 0x43, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x12, 0x45, 0x0a, 0x0c, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, + 0x74, 0x65, 0x12, 0x19, 0x2e, 0x6f, 0x69, 0x64, 0x63, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, + 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, + 0x6f, 0x69, 0x64, 0x63, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x31, 0x5a, 0x2f, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x73, 0x69, 0x64, 0x65, 0x72, 0x6f, 0x6c, 0x61, + 0x62, 0x73, 0x2f, 0x6f, 0x6d, 0x6e, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x6f, 0x6d, 0x6e, 0x69, 0x2f, 0x6f, 0x69, 0x64, 0x63, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_omni_oidc_oidc_proto_rawDescOnce sync.Once + file_omni_oidc_oidc_proto_rawDescData = file_omni_oidc_oidc_proto_rawDesc +) + +func file_omni_oidc_oidc_proto_rawDescGZIP() []byte { + file_omni_oidc_oidc_proto_rawDescOnce.Do(func() { + file_omni_oidc_oidc_proto_rawDescData = protoimpl.X.CompressGZIP(file_omni_oidc_oidc_proto_rawDescData) + }) + return file_omni_oidc_oidc_proto_rawDescData +} + +var file_omni_oidc_oidc_proto_msgTypes = make([]protoimpl.MessageInfo, 2) +var file_omni_oidc_oidc_proto_goTypes = []interface{}{ + (*AuthenticateRequest)(nil), // 0: oidc.AuthenticateRequest + (*AuthenticateResponse)(nil), // 1: oidc.AuthenticateResponse +} +var file_omni_oidc_oidc_proto_depIdxs = []int32{ + 0, // 0: oidc.OIDCService.Authenticate:input_type -> oidc.AuthenticateRequest + 1, // 1: oidc.OIDCService.Authenticate:output_type -> oidc.AuthenticateResponse + 1, // [1:2] is the sub-list for method output_type + 0, // [0:1] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_omni_oidc_oidc_proto_init() } +func file_omni_oidc_oidc_proto_init() { + if File_omni_oidc_oidc_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_omni_oidc_oidc_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AuthenticateRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_oidc_oidc_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AuthenticateResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_omni_oidc_oidc_proto_rawDesc, + NumEnums: 0, + NumMessages: 2, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_omni_oidc_oidc_proto_goTypes, + DependencyIndexes: file_omni_oidc_oidc_proto_depIdxs, + MessageInfos: file_omni_oidc_oidc_proto_msgTypes, + }.Build() + File_omni_oidc_oidc_proto = out.File + file_omni_oidc_oidc_proto_rawDesc = nil + file_omni_oidc_oidc_proto_goTypes = nil + file_omni_oidc_oidc_proto_depIdxs = nil +} diff --git a/client/api/omni/oidc/oidc.pb.gw.go b/client/api/omni/oidc/oidc.pb.gw.go new file mode 100644 index 00000000..399145aa --- /dev/null +++ b/client/api/omni/oidc/oidc.pb.gw.go @@ -0,0 +1,163 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: omni/oidc/oidc.proto + +/* +Package oidc is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package oidc + +import ( + "context" + "io" + "net/http" + + "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" +) + +// Suppress "imported and not used" errors +var _ codes.Code +var _ io.Reader +var _ status.Status +var _ = runtime.String +var _ = utilities.NewDoubleArray +var _ = metadata.Join + +func request_OIDCService_Authenticate_0(ctx context.Context, marshaler runtime.Marshaler, client OIDCServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq AuthenticateRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.Authenticate(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_OIDCService_Authenticate_0(ctx context.Context, marshaler runtime.Marshaler, server OIDCServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq AuthenticateRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.Authenticate(ctx, &protoReq) + return msg, metadata, err + +} + +// RegisterOIDCServiceHandlerServer registers the http handlers for service OIDCService to "mux". +// UnaryRPC :call OIDCServiceServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterOIDCServiceHandlerFromEndpoint instead. +func RegisterOIDCServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server OIDCServiceServer) error { + + mux.Handle("POST", pattern_OIDCService_Authenticate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/oidc.OIDCService/Authenticate", runtime.WithHTTPPathPattern("/oidc.OIDCService/Authenticate")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_OIDCService_Authenticate_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_OIDCService_Authenticate_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +// RegisterOIDCServiceHandlerFromEndpoint is same as RegisterOIDCServiceHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterOIDCServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.DialContext(ctx, endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + + return RegisterOIDCServiceHandler(ctx, mux, conn) +} + +// RegisterOIDCServiceHandler registers the http handlers for service OIDCService to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterOIDCServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterOIDCServiceHandlerClient(ctx, mux, NewOIDCServiceClient(conn)) +} + +// RegisterOIDCServiceHandlerClient registers the http handlers for service OIDCService +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "OIDCServiceClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "OIDCServiceClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "OIDCServiceClient" to call the correct interceptors. +func RegisterOIDCServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client OIDCServiceClient) error { + + mux.Handle("POST", pattern_OIDCService_Authenticate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/oidc.OIDCService/Authenticate", runtime.WithHTTPPathPattern("/oidc.OIDCService/Authenticate")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_OIDCService_Authenticate_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_OIDCService_Authenticate_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +var ( + pattern_OIDCService_Authenticate_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"oidc.OIDCService", "Authenticate"}, "")) +) + +var ( + forward_OIDCService_Authenticate_0 = runtime.ForwardResponseMessage +) diff --git a/client/api/omni/oidc/oidc.proto b/client/api/omni/oidc/oidc.proto new file mode 100644 index 00000000..19565e35 --- /dev/null +++ b/client/api/omni/oidc/oidc.proto @@ -0,0 +1,21 @@ +syntax = "proto3"; +package oidc; + +option go_package = "github.com/siderolabs/omni/client/api/omni/oidc"; + +import "google/protobuf/empty.proto"; + +message AuthenticateRequest { + // Auth Request ID. + string auth_request_id = 1; +} + +message AuthenticateResponse { + // URL to redirect the user to. + string redirect_url = 1; +} + +service OIDCService { + // Authenticate an OIDC auth request by ID. + rpc Authenticate(AuthenticateRequest) returns (AuthenticateResponse); +} diff --git a/client/api/omni/oidc/oidc_grpc.pb.go b/client/api/omni/oidc/oidc_grpc.pb.go new file mode 100644 index 00000000..e1526099 --- /dev/null +++ b/client/api/omni/oidc/oidc_grpc.pb.go @@ -0,0 +1,112 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.3.0 +// - protoc v4.24.4 +// source: omni/oidc/oidc.proto + +package oidc + +import ( + context "context" + + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +const ( + OIDCService_Authenticate_FullMethodName = "/oidc.OIDCService/Authenticate" +) + +// OIDCServiceClient is the client API for OIDCService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type OIDCServiceClient interface { + // Authenticate an OIDC auth request by ID. + Authenticate(ctx context.Context, in *AuthenticateRequest, opts ...grpc.CallOption) (*AuthenticateResponse, error) +} + +type oIDCServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewOIDCServiceClient(cc grpc.ClientConnInterface) OIDCServiceClient { + return &oIDCServiceClient{cc} +} + +func (c *oIDCServiceClient) Authenticate(ctx context.Context, in *AuthenticateRequest, opts ...grpc.CallOption) (*AuthenticateResponse, error) { + out := new(AuthenticateResponse) + err := c.cc.Invoke(ctx, OIDCService_Authenticate_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// OIDCServiceServer is the server API for OIDCService service. +// All implementations must embed UnimplementedOIDCServiceServer +// for forward compatibility +type OIDCServiceServer interface { + // Authenticate an OIDC auth request by ID. + Authenticate(context.Context, *AuthenticateRequest) (*AuthenticateResponse, error) + mustEmbedUnimplementedOIDCServiceServer() +} + +// UnimplementedOIDCServiceServer must be embedded to have forward compatible implementations. +type UnimplementedOIDCServiceServer struct { +} + +func (UnimplementedOIDCServiceServer) Authenticate(context.Context, *AuthenticateRequest) (*AuthenticateResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Authenticate not implemented") +} +func (UnimplementedOIDCServiceServer) mustEmbedUnimplementedOIDCServiceServer() {} + +// UnsafeOIDCServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to OIDCServiceServer will +// result in compilation errors. +type UnsafeOIDCServiceServer interface { + mustEmbedUnimplementedOIDCServiceServer() +} + +func RegisterOIDCServiceServer(s grpc.ServiceRegistrar, srv OIDCServiceServer) { + s.RegisterService(&OIDCService_ServiceDesc, srv) +} + +func _OIDCService_Authenticate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AuthenticateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(OIDCServiceServer).Authenticate(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: OIDCService_Authenticate_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(OIDCServiceServer).Authenticate(ctx, req.(*AuthenticateRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// OIDCService_ServiceDesc is the grpc.ServiceDesc for OIDCService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var OIDCService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "oidc.OIDCService", + HandlerType: (*OIDCServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "Authenticate", + Handler: _OIDCService_Authenticate_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "omni/oidc/oidc.proto", +} diff --git a/client/api/omni/oidc/oidc_vtproto.pb.go b/client/api/omni/oidc/oidc_vtproto.pb.go new file mode 100644 index 00000000..dc29e5bd --- /dev/null +++ b/client/api/omni/oidc/oidc_vtproto.pb.go @@ -0,0 +1,368 @@ +// Code generated by protoc-gen-go-vtproto. DO NOT EDIT. +// protoc-gen-go-vtproto version: v0.6.0 +// source: omni/oidc/oidc.proto + +package oidc + +import ( + fmt "fmt" + io "io" + + protohelpers "github.com/planetscale/vtprotobuf/protohelpers" + proto "google.golang.org/protobuf/proto" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +func (m *AuthenticateRequest) CloneVT() *AuthenticateRequest { + if m == nil { + return (*AuthenticateRequest)(nil) + } + r := new(AuthenticateRequest) + r.AuthRequestId = m.AuthRequestId + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *AuthenticateRequest) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *AuthenticateResponse) CloneVT() *AuthenticateResponse { + if m == nil { + return (*AuthenticateResponse)(nil) + } + r := new(AuthenticateResponse) + r.RedirectUrl = m.RedirectUrl + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *AuthenticateResponse) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (this *AuthenticateRequest) EqualVT(that *AuthenticateRequest) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.AuthRequestId != that.AuthRequestId { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *AuthenticateRequest) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*AuthenticateRequest) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *AuthenticateResponse) EqualVT(that *AuthenticateResponse) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.RedirectUrl != that.RedirectUrl { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *AuthenticateResponse) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*AuthenticateResponse) + if !ok { + return false + } + return this.EqualVT(that) +} +func (m *AuthenticateRequest) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AuthenticateRequest) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *AuthenticateRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.AuthRequestId) > 0 { + i -= len(m.AuthRequestId) + copy(dAtA[i:], m.AuthRequestId) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.AuthRequestId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *AuthenticateResponse) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AuthenticateResponse) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *AuthenticateResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.RedirectUrl) > 0 { + i -= len(m.RedirectUrl) + copy(dAtA[i:], m.RedirectUrl) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.RedirectUrl))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *AuthenticateRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.AuthRequestId) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *AuthenticateResponse) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.RedirectUrl) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *AuthenticateRequest) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AuthenticateRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AuthenticateRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AuthRequestId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AuthRequestId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AuthenticateResponse) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AuthenticateResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AuthenticateResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RedirectUrl", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RedirectUrl = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} diff --git a/client/api/omni/resources/resources.pb.go b/client/api/omni/resources/resources.pb.go new file mode 100644 index 00000000..e62bba20 --- /dev/null +++ b/client/api/omni/resources/resources.pb.go @@ -0,0 +1,1315 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.32.0 +// protoc v4.24.4 +// source: omni/resources/resources.proto + +package resources + +import ( + reflect "reflect" + sync "sync" + + v1alpha1 "github.com/cosi-project/runtime/api/v1alpha1" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + + _ "github.com/siderolabs/omni/client/api/common" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type EventType int32 + +const ( + EventType_UNKNOWN EventType = 0 + EventType_CREATED EventType = 1 + EventType_UPDATED EventType = 2 + EventType_DESTROYED EventType = 3 + EventType_BOOTSTRAPPED EventType = 4 +) + +// Enum value maps for EventType. +var ( + EventType_name = map[int32]string{ + 0: "UNKNOWN", + 1: "CREATED", + 2: "UPDATED", + 3: "DESTROYED", + 4: "BOOTSTRAPPED", + } + EventType_value = map[string]int32{ + "UNKNOWN": 0, + "CREATED": 1, + "UPDATED": 2, + "DESTROYED": 3, + "BOOTSTRAPPED": 4, + } +) + +func (x EventType) Enum() *EventType { + p := new(EventType) + *p = x + return p +} + +func (x EventType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (EventType) Descriptor() protoreflect.EnumDescriptor { + return file_omni_resources_resources_proto_enumTypes[0].Descriptor() +} + +func (EventType) Type() protoreflect.EnumType { + return &file_omni_resources_resources_proto_enumTypes[0] +} + +func (x EventType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use EventType.Descriptor instead. +func (EventType) EnumDescriptor() ([]byte, []int) { + return file_omni_resources_resources_proto_rawDescGZIP(), []int{0} +} + +type Resource struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Metadata *v1alpha1.Metadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"` + Spec string `protobuf:"bytes,2,opt,name=spec,proto3" json:"spec,omitempty"` +} + +func (x *Resource) Reset() { + *x = Resource{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_resources_resources_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Resource) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Resource) ProtoMessage() {} + +func (x *Resource) ProtoReflect() protoreflect.Message { + mi := &file_omni_resources_resources_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Resource.ProtoReflect.Descriptor instead. +func (*Resource) Descriptor() ([]byte, []int) { + return file_omni_resources_resources_proto_rawDescGZIP(), []int{0} +} + +func (x *Resource) GetMetadata() *v1alpha1.Metadata { + if x != nil { + return x.Metadata + } + return nil +} + +func (x *Resource) GetSpec() string { + if x != nil { + return x.Spec + } + return "" +} + +type GetRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` + Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` + Id string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"` +} + +func (x *GetRequest) Reset() { + *x = GetRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_resources_resources_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetRequest) ProtoMessage() {} + +func (x *GetRequest) ProtoReflect() protoreflect.Message { + mi := &file_omni_resources_resources_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetRequest.ProtoReflect.Descriptor instead. +func (*GetRequest) Descriptor() ([]byte, []int) { + return file_omni_resources_resources_proto_rawDescGZIP(), []int{1} +} + +func (x *GetRequest) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *GetRequest) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *GetRequest) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +type GetResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Body should contain JSON encoded spec. + Body string `protobuf:"bytes,1,opt,name=body,proto3" json:"body,omitempty"` +} + +func (x *GetResponse) Reset() { + *x = GetResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_resources_resources_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetResponse) ProtoMessage() {} + +func (x *GetResponse) ProtoReflect() protoreflect.Message { + mi := &file_omni_resources_resources_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetResponse.ProtoReflect.Descriptor instead. +func (*GetResponse) Descriptor() ([]byte, []int) { + return file_omni_resources_resources_proto_rawDescGZIP(), []int{2} +} + +func (x *GetResponse) GetBody() string { + if x != nil { + return x.Body + } + return "" +} + +type ListRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` + Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` + Offset int32 `protobuf:"varint,3,opt,name=offset,proto3" json:"offset,omitempty"` + Limit int32 `protobuf:"varint,4,opt,name=limit,proto3" json:"limit,omitempty"` + SortByField string `protobuf:"bytes,5,opt,name=sort_by_field,json=sortByField,proto3" json:"sort_by_field,omitempty"` + SortDescending bool `protobuf:"varint,6,opt,name=sort_descending,json=sortDescending,proto3" json:"sort_descending,omitempty"` + SearchFor []string `protobuf:"bytes,7,rep,name=search_for,json=searchFor,proto3" json:"search_for,omitempty"` +} + +func (x *ListRequest) Reset() { + *x = ListRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_resources_resources_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListRequest) ProtoMessage() {} + +func (x *ListRequest) ProtoReflect() protoreflect.Message { + mi := &file_omni_resources_resources_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListRequest.ProtoReflect.Descriptor instead. +func (*ListRequest) Descriptor() ([]byte, []int) { + return file_omni_resources_resources_proto_rawDescGZIP(), []int{3} +} + +func (x *ListRequest) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *ListRequest) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *ListRequest) GetOffset() int32 { + if x != nil { + return x.Offset + } + return 0 +} + +func (x *ListRequest) GetLimit() int32 { + if x != nil { + return x.Limit + } + return 0 +} + +func (x *ListRequest) GetSortByField() string { + if x != nil { + return x.SortByField + } + return "" +} + +func (x *ListRequest) GetSortDescending() bool { + if x != nil { + return x.SortDescending + } + return false +} + +func (x *ListRequest) GetSearchFor() []string { + if x != nil { + return x.SearchFor + } + return nil +} + +type ListResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Items should contain JSON encoded resources. + Items []string `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` + Total int32 `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"` +} + +func (x *ListResponse) Reset() { + *x = ListResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_resources_resources_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListResponse) ProtoMessage() {} + +func (x *ListResponse) ProtoReflect() protoreflect.Message { + mi := &file_omni_resources_resources_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListResponse.ProtoReflect.Descriptor instead. +func (*ListResponse) Descriptor() ([]byte, []int) { + return file_omni_resources_resources_proto_rawDescGZIP(), []int{4} +} + +func (x *ListResponse) GetItems() []string { + if x != nil { + return x.Items + } + return nil +} + +func (x *ListResponse) GetTotal() int32 { + if x != nil { + return x.Total + } + return 0 +} + +// Event is emitted when resource changes. +// It's the same as COSI Event, but encodes resources into JSON. +type Event struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Resource string `protobuf:"bytes,1,opt,name=resource,proto3" json:"resource,omitempty"` + Old string `protobuf:"bytes,2,opt,name=old,proto3" json:"old,omitempty"` + EventType EventType `protobuf:"varint,3,opt,name=event_type,json=eventType,proto3,enum=omni.resources.EventType" json:"event_type,omitempty"` +} + +func (x *Event) Reset() { + *x = Event{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_resources_resources_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Event) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Event) ProtoMessage() {} + +func (x *Event) ProtoReflect() protoreflect.Message { + mi := &file_omni_resources_resources_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Event.ProtoReflect.Descriptor instead. +func (*Event) Descriptor() ([]byte, []int) { + return file_omni_resources_resources_proto_rawDescGZIP(), []int{5} +} + +func (x *Event) GetResource() string { + if x != nil { + return x.Resource + } + return "" +} + +func (x *Event) GetOld() string { + if x != nil { + return x.Old + } + return "" +} + +func (x *Event) GetEventType() EventType { + if x != nil { + return x.EventType + } + return EventType_UNKNOWN +} + +type WatchRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` + Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` + Id string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"` + TailEvents int32 `protobuf:"varint,4,opt,name=tail_events,json=tailEvents,proto3" json:"tail_events,omitempty"` + Offset int32 `protobuf:"varint,5,opt,name=offset,proto3" json:"offset,omitempty"` + Limit int32 `protobuf:"varint,6,opt,name=limit,proto3" json:"limit,omitempty"` + SortByField string `protobuf:"bytes,7,opt,name=sort_by_field,json=sortByField,proto3" json:"sort_by_field,omitempty"` + SortDescending bool `protobuf:"varint,8,opt,name=sort_descending,json=sortDescending,proto3" json:"sort_descending,omitempty"` + SearchFor []string `protobuf:"bytes,9,rep,name=search_for,json=searchFor,proto3" json:"search_for,omitempty"` +} + +func (x *WatchRequest) Reset() { + *x = WatchRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_resources_resources_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *WatchRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WatchRequest) ProtoMessage() {} + +func (x *WatchRequest) ProtoReflect() protoreflect.Message { + mi := &file_omni_resources_resources_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use WatchRequest.ProtoReflect.Descriptor instead. +func (*WatchRequest) Descriptor() ([]byte, []int) { + return file_omni_resources_resources_proto_rawDescGZIP(), []int{6} +} + +func (x *WatchRequest) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *WatchRequest) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *WatchRequest) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *WatchRequest) GetTailEvents() int32 { + if x != nil { + return x.TailEvents + } + return 0 +} + +func (x *WatchRequest) GetOffset() int32 { + if x != nil { + return x.Offset + } + return 0 +} + +func (x *WatchRequest) GetLimit() int32 { + if x != nil { + return x.Limit + } + return 0 +} + +func (x *WatchRequest) GetSortByField() string { + if x != nil { + return x.SortByField + } + return "" +} + +func (x *WatchRequest) GetSortDescending() bool { + if x != nil { + return x.SortDescending + } + return false +} + +func (x *WatchRequest) GetSearchFor() []string { + if x != nil { + return x.SearchFor + } + return nil +} + +type WatchResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Event *Event `protobuf:"bytes,1,opt,name=event,proto3" json:"event,omitempty"` + Total int32 `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"` + SortFieldData string `protobuf:"bytes,3,opt,name=sort_field_data,json=sortFieldData,proto3" json:"sort_field_data,omitempty"` + SortDescending bool `protobuf:"varint,4,opt,name=sort_descending,json=sortDescending,proto3" json:"sort_descending,omitempty"` +} + +func (x *WatchResponse) Reset() { + *x = WatchResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_resources_resources_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *WatchResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WatchResponse) ProtoMessage() {} + +func (x *WatchResponse) ProtoReflect() protoreflect.Message { + mi := &file_omni_resources_resources_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use WatchResponse.ProtoReflect.Descriptor instead. +func (*WatchResponse) Descriptor() ([]byte, []int) { + return file_omni_resources_resources_proto_rawDescGZIP(), []int{7} +} + +func (x *WatchResponse) GetEvent() *Event { + if x != nil { + return x.Event + } + return nil +} + +func (x *WatchResponse) GetTotal() int32 { + if x != nil { + return x.Total + } + return 0 +} + +func (x *WatchResponse) GetSortFieldData() string { + if x != nil { + return x.SortFieldData + } + return "" +} + +func (x *WatchResponse) GetSortDescending() bool { + if x != nil { + return x.SortDescending + } + return false +} + +type CreateRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Resource *Resource `protobuf:"bytes,1,opt,name=resource,proto3" json:"resource,omitempty"` +} + +func (x *CreateRequest) Reset() { + *x = CreateRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_resources_resources_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateRequest) ProtoMessage() {} + +func (x *CreateRequest) ProtoReflect() protoreflect.Message { + mi := &file_omni_resources_resources_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateRequest.ProtoReflect.Descriptor instead. +func (*CreateRequest) Descriptor() ([]byte, []int) { + return file_omni_resources_resources_proto_rawDescGZIP(), []int{8} +} + +func (x *CreateRequest) GetResource() *Resource { + if x != nil { + return x.Resource + } + return nil +} + +type CreateResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *CreateResponse) Reset() { + *x = CreateResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_resources_resources_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateResponse) ProtoMessage() {} + +func (x *CreateResponse) ProtoReflect() protoreflect.Message { + mi := &file_omni_resources_resources_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateResponse.ProtoReflect.Descriptor instead. +func (*CreateResponse) Descriptor() ([]byte, []int) { + return file_omni_resources_resources_proto_rawDescGZIP(), []int{9} +} + +type UpdateRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + CurrentVersion string `protobuf:"bytes,1,opt,name=currentVersion,proto3" json:"currentVersion,omitempty"` + Resource *Resource `protobuf:"bytes,2,opt,name=resource,proto3" json:"resource,omitempty"` +} + +func (x *UpdateRequest) Reset() { + *x = UpdateRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_resources_resources_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateRequest) ProtoMessage() {} + +func (x *UpdateRequest) ProtoReflect() protoreflect.Message { + mi := &file_omni_resources_resources_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateRequest.ProtoReflect.Descriptor instead. +func (*UpdateRequest) Descriptor() ([]byte, []int) { + return file_omni_resources_resources_proto_rawDescGZIP(), []int{10} +} + +func (x *UpdateRequest) GetCurrentVersion() string { + if x != nil { + return x.CurrentVersion + } + return "" +} + +func (x *UpdateRequest) GetResource() *Resource { + if x != nil { + return x.Resource + } + return nil +} + +type UpdateResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *UpdateResponse) Reset() { + *x = UpdateResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_resources_resources_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateResponse) ProtoMessage() {} + +func (x *UpdateResponse) ProtoReflect() protoreflect.Message { + mi := &file_omni_resources_resources_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateResponse.ProtoReflect.Descriptor instead. +func (*UpdateResponse) Descriptor() ([]byte, []int) { + return file_omni_resources_resources_proto_rawDescGZIP(), []int{11} +} + +type DeleteRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` + Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` + Id string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"` +} + +func (x *DeleteRequest) Reset() { + *x = DeleteRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_resources_resources_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteRequest) ProtoMessage() {} + +func (x *DeleteRequest) ProtoReflect() protoreflect.Message { + mi := &file_omni_resources_resources_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteRequest.ProtoReflect.Descriptor instead. +func (*DeleteRequest) Descriptor() ([]byte, []int) { + return file_omni_resources_resources_proto_rawDescGZIP(), []int{12} +} + +func (x *DeleteRequest) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *DeleteRequest) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *DeleteRequest) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +type DeleteResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *DeleteResponse) Reset() { + *x = DeleteResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_resources_resources_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteResponse) ProtoMessage() {} + +func (x *DeleteResponse) ProtoReflect() protoreflect.Message { + mi := &file_omni_resources_resources_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteResponse.ProtoReflect.Descriptor instead. +func (*DeleteResponse) Descriptor() ([]byte, []int) { + return file_omni_resources_resources_proto_rawDescGZIP(), []int{13} +} + +var File_omni_resources_resources_proto protoreflect.FileDescriptor + +var file_omni_resources_resources_proto_rawDesc = []byte{ + 0x0a, 0x1e, 0x6f, 0x6d, 0x6e, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, + 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x12, 0x0e, 0x6f, 0x6d, 0x6e, 0x69, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, + 0x1a, 0x11, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x6f, 0x6d, 0x6e, 0x69, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x53, 0x0a, 0x08, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x73, + 0x69, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, + 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x70, 0x65, + 0x63, 0x22, 0x4e, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x22, 0x21, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x62, 0x6f, 0x64, 0x79, 0x22, 0xd9, 0x01, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, + 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x12, 0x22, 0x0a, 0x0d, 0x73, 0x6f, 0x72, 0x74, 0x5f, 0x62, 0x79, 0x5f, + 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x6f, 0x72, + 0x74, 0x42, 0x79, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x6f, 0x72, 0x74, + 0x5f, 0x64, 0x65, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0e, 0x73, 0x6f, 0x72, 0x74, 0x44, 0x65, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x66, 0x6f, 0x72, 0x18, + 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x6f, 0x72, + 0x22, 0x3a, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x6f, 0x0a, 0x05, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6f, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6f, 0x6c, 0x64, 0x12, 0x38, 0x0a, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x6f, 0x6d, 0x6e, 0x69, 0x2e, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x22, 0x8b, 0x02, + 0x0a, 0x0c, 0x57, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, + 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x69, 0x6c, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x74, 0x61, 0x69, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, + 0x22, 0x0a, 0x0d, 0x73, 0x6f, 0x72, 0x74, 0x5f, 0x62, 0x79, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x6f, 0x72, 0x74, 0x42, 0x79, 0x46, 0x69, + 0x65, 0x6c, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x6f, 0x72, 0x74, 0x5f, 0x64, 0x65, 0x73, 0x63, + 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x73, 0x6f, + 0x72, 0x74, 0x44, 0x65, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x1d, 0x0a, 0x0a, + 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x66, 0x6f, 0x72, 0x18, 0x09, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x09, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x6f, 0x72, 0x22, 0xa3, 0x01, 0x0a, 0x0d, + 0x57, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, + 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, + 0x6d, 0x6e, 0x69, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x6f, 0x72, 0x74, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x64, + 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x6f, 0x72, 0x74, 0x46, + 0x69, 0x65, 0x6c, 0x64, 0x44, 0x61, 0x74, 0x61, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x6f, 0x72, 0x74, + 0x5f, 0x64, 0x65, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0e, 0x73, 0x6f, 0x72, 0x74, 0x44, 0x65, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x22, 0x45, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x34, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x6d, 0x6e, 0x69, 0x2e, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x10, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6d, 0x0a, 0x0d, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x6d, 0x6e, 0x69, 0x2e, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, + 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x10, 0x0a, 0x0e, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x51, 0x0a, 0x0d, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x10, + 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x2a, 0x53, 0x0a, 0x09, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, + 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x52, + 0x45, 0x41, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x50, 0x44, 0x41, 0x54, + 0x45, 0x44, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x44, 0x45, 0x53, 0x54, 0x52, 0x4f, 0x59, 0x45, + 0x44, 0x10, 0x03, 0x12, 0x10, 0x0a, 0x0c, 0x42, 0x4f, 0x4f, 0x54, 0x53, 0x54, 0x52, 0x41, 0x50, + 0x50, 0x45, 0x44, 0x10, 0x04, 0x32, 0x82, 0x04, 0x0a, 0x0f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x3e, 0x0a, 0x03, 0x47, 0x65, 0x74, + 0x12, 0x1a, 0x2e, 0x6f, 0x6d, 0x6e, 0x69, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x6f, + 0x6d, 0x6e, 0x69, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x47, 0x65, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x04, 0x4c, 0x69, 0x73, + 0x74, 0x12, 0x1b, 0x2e, 0x6f, 0x6d, 0x6e, 0x69, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, + 0x2e, 0x6f, 0x6d, 0x6e, 0x69, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, 0x0a, 0x06, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1d, 0x2e, 0x6f, 0x6d, 0x6e, 0x69, 0x2e, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x6d, 0x6e, 0x69, 0x2e, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, + 0x1d, 0x2e, 0x6f, 0x6d, 0x6e, 0x69, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, + 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, + 0x2e, 0x6f, 0x6d, 0x6e, 0x69, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, + 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x1d, 0x2e, 0x6f, 0x6d, 0x6e, 0x69, 0x2e, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x6d, 0x6e, 0x69, 0x2e, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, + 0x6f, 0x77, 0x6e, 0x12, 0x1d, 0x2e, 0x6f, 0x6d, 0x6e, 0x69, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x6d, 0x6e, 0x69, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x46, 0x0a, 0x05, 0x57, 0x61, 0x74, 0x63, 0x68, 0x12, 0x1c, 0x2e, 0x6f, 0x6d, + 0x6e, 0x69, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x57, 0x61, 0x74, + 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x6f, 0x6d, 0x6e, 0x69, + 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x57, 0x61, 0x74, 0x63, 0x68, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x42, 0x36, 0x5a, 0x34, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x73, 0x69, 0x64, 0x65, 0x72, 0x6f, 0x6c, + 0x61, 0x62, 0x73, 0x2f, 0x6f, 0x6d, 0x6e, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x6f, 0x6d, 0x6e, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_omni_resources_resources_proto_rawDescOnce sync.Once + file_omni_resources_resources_proto_rawDescData = file_omni_resources_resources_proto_rawDesc +) + +func file_omni_resources_resources_proto_rawDescGZIP() []byte { + file_omni_resources_resources_proto_rawDescOnce.Do(func() { + file_omni_resources_resources_proto_rawDescData = protoimpl.X.CompressGZIP(file_omni_resources_resources_proto_rawDescData) + }) + return file_omni_resources_resources_proto_rawDescData +} + +var file_omni_resources_resources_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_omni_resources_resources_proto_msgTypes = make([]protoimpl.MessageInfo, 14) +var file_omni_resources_resources_proto_goTypes = []interface{}{ + (EventType)(0), // 0: omni.resources.EventType + (*Resource)(nil), // 1: omni.resources.Resource + (*GetRequest)(nil), // 2: omni.resources.GetRequest + (*GetResponse)(nil), // 3: omni.resources.GetResponse + (*ListRequest)(nil), // 4: omni.resources.ListRequest + (*ListResponse)(nil), // 5: omni.resources.ListResponse + (*Event)(nil), // 6: omni.resources.Event + (*WatchRequest)(nil), // 7: omni.resources.WatchRequest + (*WatchResponse)(nil), // 8: omni.resources.WatchResponse + (*CreateRequest)(nil), // 9: omni.resources.CreateRequest + (*CreateResponse)(nil), // 10: omni.resources.CreateResponse + (*UpdateRequest)(nil), // 11: omni.resources.UpdateRequest + (*UpdateResponse)(nil), // 12: omni.resources.UpdateResponse + (*DeleteRequest)(nil), // 13: omni.resources.DeleteRequest + (*DeleteResponse)(nil), // 14: omni.resources.DeleteResponse + (*v1alpha1.Metadata)(nil), // 15: cosi.resource.Metadata +} +var file_omni_resources_resources_proto_depIdxs = []int32{ + 15, // 0: omni.resources.Resource.metadata:type_name -> cosi.resource.Metadata + 0, // 1: omni.resources.Event.event_type:type_name -> omni.resources.EventType + 6, // 2: omni.resources.WatchResponse.event:type_name -> omni.resources.Event + 1, // 3: omni.resources.CreateRequest.resource:type_name -> omni.resources.Resource + 1, // 4: omni.resources.UpdateRequest.resource:type_name -> omni.resources.Resource + 2, // 5: omni.resources.ResourceService.Get:input_type -> omni.resources.GetRequest + 4, // 6: omni.resources.ResourceService.List:input_type -> omni.resources.ListRequest + 9, // 7: omni.resources.ResourceService.Create:input_type -> omni.resources.CreateRequest + 11, // 8: omni.resources.ResourceService.Update:input_type -> omni.resources.UpdateRequest + 13, // 9: omni.resources.ResourceService.Delete:input_type -> omni.resources.DeleteRequest + 13, // 10: omni.resources.ResourceService.Teardown:input_type -> omni.resources.DeleteRequest + 7, // 11: omni.resources.ResourceService.Watch:input_type -> omni.resources.WatchRequest + 3, // 12: omni.resources.ResourceService.Get:output_type -> omni.resources.GetResponse + 5, // 13: omni.resources.ResourceService.List:output_type -> omni.resources.ListResponse + 10, // 14: omni.resources.ResourceService.Create:output_type -> omni.resources.CreateResponse + 12, // 15: omni.resources.ResourceService.Update:output_type -> omni.resources.UpdateResponse + 14, // 16: omni.resources.ResourceService.Delete:output_type -> omni.resources.DeleteResponse + 14, // 17: omni.resources.ResourceService.Teardown:output_type -> omni.resources.DeleteResponse + 8, // 18: omni.resources.ResourceService.Watch:output_type -> omni.resources.WatchResponse + 12, // [12:19] is the sub-list for method output_type + 5, // [5:12] is the sub-list for method input_type + 5, // [5:5] is the sub-list for extension type_name + 5, // [5:5] is the sub-list for extension extendee + 0, // [0:5] is the sub-list for field type_name +} + +func init() { file_omni_resources_resources_proto_init() } +func file_omni_resources_resources_proto_init() { + if File_omni_resources_resources_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_omni_resources_resources_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Resource); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_resources_resources_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_resources_resources_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_resources_resources_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_resources_resources_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_resources_resources_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Event); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_resources_resources_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WatchRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_resources_resources_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WatchResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_resources_resources_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_resources_resources_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_resources_resources_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_resources_resources_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_resources_resources_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_resources_resources_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_omni_resources_resources_proto_rawDesc, + NumEnums: 1, + NumMessages: 14, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_omni_resources_resources_proto_goTypes, + DependencyIndexes: file_omni_resources_resources_proto_depIdxs, + EnumInfos: file_omni_resources_resources_proto_enumTypes, + MessageInfos: file_omni_resources_resources_proto_msgTypes, + }.Build() + File_omni_resources_resources_proto = out.File + file_omni_resources_resources_proto_rawDesc = nil + file_omni_resources_resources_proto_goTypes = nil + file_omni_resources_resources_proto_depIdxs = nil +} diff --git a/client/api/omni/resources/resources.pb.gw.go b/client/api/omni/resources/resources.pb.gw.go new file mode 100644 index 00000000..cfe02726 --- /dev/null +++ b/client/api/omni/resources/resources.pb.gw.go @@ -0,0 +1,602 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: omni/resources/resources.proto + +/* +Package resources is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package resources + +import ( + "context" + "io" + "net/http" + + "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" +) + +// Suppress "imported and not used" errors +var _ codes.Code +var _ io.Reader +var _ status.Status +var _ = runtime.String +var _ = utilities.NewDoubleArray +var _ = metadata.Join + +func request_ResourceService_Get_0(ctx context.Context, marshaler runtime.Marshaler, client ResourceServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.Get(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ResourceService_Get_0(ctx context.Context, marshaler runtime.Marshaler, server ResourceServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.Get(ctx, &protoReq) + return msg, metadata, err + +} + +func request_ResourceService_List_0(ctx context.Context, marshaler runtime.Marshaler, client ResourceServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ListRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.List(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ResourceService_List_0(ctx context.Context, marshaler runtime.Marshaler, server ResourceServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ListRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.List(ctx, &protoReq) + return msg, metadata, err + +} + +func request_ResourceService_Create_0(ctx context.Context, marshaler runtime.Marshaler, client ResourceServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CreateRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.Create(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ResourceService_Create_0(ctx context.Context, marshaler runtime.Marshaler, server ResourceServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CreateRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.Create(ctx, &protoReq) + return msg, metadata, err + +} + +func request_ResourceService_Update_0(ctx context.Context, marshaler runtime.Marshaler, client ResourceServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq UpdateRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.Update(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ResourceService_Update_0(ctx context.Context, marshaler runtime.Marshaler, server ResourceServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq UpdateRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.Update(ctx, &protoReq) + return msg, metadata, err + +} + +func request_ResourceService_Delete_0(ctx context.Context, marshaler runtime.Marshaler, client ResourceServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DeleteRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.Delete(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ResourceService_Delete_0(ctx context.Context, marshaler runtime.Marshaler, server ResourceServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DeleteRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.Delete(ctx, &protoReq) + return msg, metadata, err + +} + +func request_ResourceService_Teardown_0(ctx context.Context, marshaler runtime.Marshaler, client ResourceServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DeleteRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.Teardown(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ResourceService_Teardown_0(ctx context.Context, marshaler runtime.Marshaler, server ResourceServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DeleteRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.Teardown(ctx, &protoReq) + return msg, metadata, err + +} + +func request_ResourceService_Watch_0(ctx context.Context, marshaler runtime.Marshaler, client ResourceServiceClient, req *http.Request, pathParams map[string]string) (ResourceService_WatchClient, runtime.ServerMetadata, error) { + var protoReq WatchRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + stream, err := client.Watch(ctx, &protoReq) + if err != nil { + return nil, metadata, err + } + header, err := stream.Header() + if err != nil { + return nil, metadata, err + } + metadata.HeaderMD = header + return stream, metadata, nil + +} + +// RegisterResourceServiceHandlerServer registers the http handlers for service ResourceService to "mux". +// UnaryRPC :call ResourceServiceServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterResourceServiceHandlerFromEndpoint instead. +func RegisterResourceServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server ResourceServiceServer) error { + + mux.Handle("POST", pattern_ResourceService_Get_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/omni.resources.ResourceService/Get", runtime.WithHTTPPathPattern("/omni.resources.ResourceService/Get")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ResourceService_Get_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_ResourceService_Get_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ResourceService_List_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/omni.resources.ResourceService/List", runtime.WithHTTPPathPattern("/omni.resources.ResourceService/List")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ResourceService_List_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_ResourceService_List_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ResourceService_Create_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/omni.resources.ResourceService/Create", runtime.WithHTTPPathPattern("/omni.resources.ResourceService/Create")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ResourceService_Create_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_ResourceService_Create_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ResourceService_Update_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/omni.resources.ResourceService/Update", runtime.WithHTTPPathPattern("/omni.resources.ResourceService/Update")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ResourceService_Update_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_ResourceService_Update_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ResourceService_Delete_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/omni.resources.ResourceService/Delete", runtime.WithHTTPPathPattern("/omni.resources.ResourceService/Delete")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ResourceService_Delete_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_ResourceService_Delete_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ResourceService_Teardown_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/omni.resources.ResourceService/Teardown", runtime.WithHTTPPathPattern("/omni.resources.ResourceService/Teardown")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ResourceService_Teardown_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_ResourceService_Teardown_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ResourceService_Watch_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + err := status.Error(codes.Unimplemented, "streaming calls are not yet supported in the in-process transport") + _, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + }) + + return nil +} + +// RegisterResourceServiceHandlerFromEndpoint is same as RegisterResourceServiceHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterResourceServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.DialContext(ctx, endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + + return RegisterResourceServiceHandler(ctx, mux, conn) +} + +// RegisterResourceServiceHandler registers the http handlers for service ResourceService to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterResourceServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterResourceServiceHandlerClient(ctx, mux, NewResourceServiceClient(conn)) +} + +// RegisterResourceServiceHandlerClient registers the http handlers for service ResourceService +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "ResourceServiceClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "ResourceServiceClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "ResourceServiceClient" to call the correct interceptors. +func RegisterResourceServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client ResourceServiceClient) error { + + mux.Handle("POST", pattern_ResourceService_Get_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/omni.resources.ResourceService/Get", runtime.WithHTTPPathPattern("/omni.resources.ResourceService/Get")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ResourceService_Get_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_ResourceService_Get_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ResourceService_List_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/omni.resources.ResourceService/List", runtime.WithHTTPPathPattern("/omni.resources.ResourceService/List")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ResourceService_List_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_ResourceService_List_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ResourceService_Create_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/omni.resources.ResourceService/Create", runtime.WithHTTPPathPattern("/omni.resources.ResourceService/Create")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ResourceService_Create_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_ResourceService_Create_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ResourceService_Update_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/omni.resources.ResourceService/Update", runtime.WithHTTPPathPattern("/omni.resources.ResourceService/Update")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ResourceService_Update_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_ResourceService_Update_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ResourceService_Delete_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/omni.resources.ResourceService/Delete", runtime.WithHTTPPathPattern("/omni.resources.ResourceService/Delete")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ResourceService_Delete_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_ResourceService_Delete_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ResourceService_Teardown_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/omni.resources.ResourceService/Teardown", runtime.WithHTTPPathPattern("/omni.resources.ResourceService/Teardown")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ResourceService_Teardown_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_ResourceService_Teardown_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ResourceService_Watch_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/omni.resources.ResourceService/Watch", runtime.WithHTTPPathPattern("/omni.resources.ResourceService/Watch")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ResourceService_Watch_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_ResourceService_Watch_0(annotatedContext, mux, outboundMarshaler, w, req, func() (proto.Message, error) { return resp.Recv() }, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +var ( + pattern_ResourceService_Get_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"omni.resources.ResourceService", "Get"}, "")) + + pattern_ResourceService_List_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"omni.resources.ResourceService", "List"}, "")) + + pattern_ResourceService_Create_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"omni.resources.ResourceService", "Create"}, "")) + + pattern_ResourceService_Update_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"omni.resources.ResourceService", "Update"}, "")) + + pattern_ResourceService_Delete_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"omni.resources.ResourceService", "Delete"}, "")) + + pattern_ResourceService_Teardown_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"omni.resources.ResourceService", "Teardown"}, "")) + + pattern_ResourceService_Watch_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"omni.resources.ResourceService", "Watch"}, "")) +) + +var ( + forward_ResourceService_Get_0 = runtime.ForwardResponseMessage + + forward_ResourceService_List_0 = runtime.ForwardResponseMessage + + forward_ResourceService_Create_0 = runtime.ForwardResponseMessage + + forward_ResourceService_Update_0 = runtime.ForwardResponseMessage + + forward_ResourceService_Delete_0 = runtime.ForwardResponseMessage + + forward_ResourceService_Teardown_0 = runtime.ForwardResponseMessage + + forward_ResourceService_Watch_0 = runtime.ForwardResponseStream +) diff --git a/client/api/omni/resources/resources.proto b/client/api/omni/resources/resources.proto new file mode 100644 index 00000000..47cebcf0 --- /dev/null +++ b/client/api/omni/resources/resources.proto @@ -0,0 +1,108 @@ +syntax = "proto3"; +package omni.resources; + +option go_package = "github.com/siderolabs/omni/client/api/omni/resources"; + +import "common/omni.proto"; +import "v1alpha1/resource.proto"; + +message Resource { + cosi.resource.Metadata metadata = 1; + string spec = 2; +} + +message GetRequest { + string namespace = 1; + string type = 2; + string id = 3; +} + +message GetResponse { + // Body should contain JSON encoded spec. + string body = 1; +} + +message ListRequest { + string namespace = 1; + string type = 2; + int32 offset = 3; + int32 limit = 4; + string sort_by_field = 5; + bool sort_descending = 6; + repeated string search_for = 7; +} + +message ListResponse { + // Items should contain JSON encoded resources. + repeated string items = 1; + int32 total = 2; +} + +enum EventType { + UNKNOWN = 0; + CREATED = 1; + UPDATED = 2; + DESTROYED = 3; + BOOTSTRAPPED = 4; +} + +// Event is emitted when resource changes. +// It's the same as COSI Event, but encodes resources into JSON. +message Event { + string resource = 1; + string old = 2; + EventType event_type = 3; +} + +message WatchRequest { + string namespace = 1; + string type = 2; + string id = 3; + int32 tail_events = 4; + int32 offset = 5; + int32 limit = 6; + string sort_by_field = 7; + bool sort_descending = 8; + repeated string search_for = 9; +} + +message WatchResponse { + Event event = 1; + int32 total = 2; + string sort_field_data = 3; + bool sort_descending = 4; +} + +message CreateRequest { + Resource resource = 1; +} + +message CreateResponse { +} + +message UpdateRequest { + string currentVersion = 1; + Resource resource = 2; +} + +message UpdateResponse { +} + +message DeleteRequest { + string namespace = 1; + string type = 2; + string id = 3; +} + +message DeleteResponse { +} + +service ResourceService { + rpc Get(GetRequest) returns (GetResponse); + rpc List(ListRequest) returns (ListResponse); + rpc Create(CreateRequest) returns (CreateResponse); + rpc Update(UpdateRequest) returns (UpdateResponse); + rpc Delete(DeleteRequest) returns (DeleteResponse); + rpc Teardown(DeleteRequest) returns (DeleteResponse); + rpc Watch(WatchRequest) returns (stream WatchResponse); +} diff --git a/client/api/omni/resources/resources_grpc.pb.go b/client/api/omni/resources/resources_grpc.pb.go new file mode 100644 index 00000000..bd4c5a3f --- /dev/null +++ b/client/api/omni/resources/resources_grpc.pb.go @@ -0,0 +1,360 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.3.0 +// - protoc v4.24.4 +// source: omni/resources/resources.proto + +package resources + +import ( + context "context" + + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +const ( + ResourceService_Get_FullMethodName = "/omni.resources.ResourceService/Get" + ResourceService_List_FullMethodName = "/omni.resources.ResourceService/List" + ResourceService_Create_FullMethodName = "/omni.resources.ResourceService/Create" + ResourceService_Update_FullMethodName = "/omni.resources.ResourceService/Update" + ResourceService_Delete_FullMethodName = "/omni.resources.ResourceService/Delete" + ResourceService_Teardown_FullMethodName = "/omni.resources.ResourceService/Teardown" + ResourceService_Watch_FullMethodName = "/omni.resources.ResourceService/Watch" +) + +// ResourceServiceClient is the client API for ResourceService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type ResourceServiceClient interface { + Get(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error) + List(ctx context.Context, in *ListRequest, opts ...grpc.CallOption) (*ListResponse, error) + Create(ctx context.Context, in *CreateRequest, opts ...grpc.CallOption) (*CreateResponse, error) + Update(ctx context.Context, in *UpdateRequest, opts ...grpc.CallOption) (*UpdateResponse, error) + Delete(ctx context.Context, in *DeleteRequest, opts ...grpc.CallOption) (*DeleteResponse, error) + Teardown(ctx context.Context, in *DeleteRequest, opts ...grpc.CallOption) (*DeleteResponse, error) + Watch(ctx context.Context, in *WatchRequest, opts ...grpc.CallOption) (ResourceService_WatchClient, error) +} + +type resourceServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewResourceServiceClient(cc grpc.ClientConnInterface) ResourceServiceClient { + return &resourceServiceClient{cc} +} + +func (c *resourceServiceClient) Get(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error) { + out := new(GetResponse) + err := c.cc.Invoke(ctx, ResourceService_Get_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *resourceServiceClient) List(ctx context.Context, in *ListRequest, opts ...grpc.CallOption) (*ListResponse, error) { + out := new(ListResponse) + err := c.cc.Invoke(ctx, ResourceService_List_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *resourceServiceClient) Create(ctx context.Context, in *CreateRequest, opts ...grpc.CallOption) (*CreateResponse, error) { + out := new(CreateResponse) + err := c.cc.Invoke(ctx, ResourceService_Create_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *resourceServiceClient) Update(ctx context.Context, in *UpdateRequest, opts ...grpc.CallOption) (*UpdateResponse, error) { + out := new(UpdateResponse) + err := c.cc.Invoke(ctx, ResourceService_Update_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *resourceServiceClient) Delete(ctx context.Context, in *DeleteRequest, opts ...grpc.CallOption) (*DeleteResponse, error) { + out := new(DeleteResponse) + err := c.cc.Invoke(ctx, ResourceService_Delete_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *resourceServiceClient) Teardown(ctx context.Context, in *DeleteRequest, opts ...grpc.CallOption) (*DeleteResponse, error) { + out := new(DeleteResponse) + err := c.cc.Invoke(ctx, ResourceService_Teardown_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *resourceServiceClient) Watch(ctx context.Context, in *WatchRequest, opts ...grpc.CallOption) (ResourceService_WatchClient, error) { + stream, err := c.cc.NewStream(ctx, &ResourceService_ServiceDesc.Streams[0], ResourceService_Watch_FullMethodName, opts...) + if err != nil { + return nil, err + } + x := &resourceServiceWatchClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type ResourceService_WatchClient interface { + Recv() (*WatchResponse, error) + grpc.ClientStream +} + +type resourceServiceWatchClient struct { + grpc.ClientStream +} + +func (x *resourceServiceWatchClient) Recv() (*WatchResponse, error) { + m := new(WatchResponse) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +// ResourceServiceServer is the server API for ResourceService service. +// All implementations must embed UnimplementedResourceServiceServer +// for forward compatibility +type ResourceServiceServer interface { + Get(context.Context, *GetRequest) (*GetResponse, error) + List(context.Context, *ListRequest) (*ListResponse, error) + Create(context.Context, *CreateRequest) (*CreateResponse, error) + Update(context.Context, *UpdateRequest) (*UpdateResponse, error) + Delete(context.Context, *DeleteRequest) (*DeleteResponse, error) + Teardown(context.Context, *DeleteRequest) (*DeleteResponse, error) + Watch(*WatchRequest, ResourceService_WatchServer) error + mustEmbedUnimplementedResourceServiceServer() +} + +// UnimplementedResourceServiceServer must be embedded to have forward compatible implementations. +type UnimplementedResourceServiceServer struct { +} + +func (UnimplementedResourceServiceServer) Get(context.Context, *GetRequest) (*GetResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Get not implemented") +} +func (UnimplementedResourceServiceServer) List(context.Context, *ListRequest) (*ListResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method List not implemented") +} +func (UnimplementedResourceServiceServer) Create(context.Context, *CreateRequest) (*CreateResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Create not implemented") +} +func (UnimplementedResourceServiceServer) Update(context.Context, *UpdateRequest) (*UpdateResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Update not implemented") +} +func (UnimplementedResourceServiceServer) Delete(context.Context, *DeleteRequest) (*DeleteResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Delete not implemented") +} +func (UnimplementedResourceServiceServer) Teardown(context.Context, *DeleteRequest) (*DeleteResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Teardown not implemented") +} +func (UnimplementedResourceServiceServer) Watch(*WatchRequest, ResourceService_WatchServer) error { + return status.Errorf(codes.Unimplemented, "method Watch not implemented") +} +func (UnimplementedResourceServiceServer) mustEmbedUnimplementedResourceServiceServer() {} + +// UnsafeResourceServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to ResourceServiceServer will +// result in compilation errors. +type UnsafeResourceServiceServer interface { + mustEmbedUnimplementedResourceServiceServer() +} + +func RegisterResourceServiceServer(s grpc.ServiceRegistrar, srv ResourceServiceServer) { + s.RegisterService(&ResourceService_ServiceDesc, srv) +} + +func _ResourceService_Get_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ResourceServiceServer).Get(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ResourceService_Get_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ResourceServiceServer).Get(ctx, req.(*GetRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ResourceService_List_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ResourceServiceServer).List(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ResourceService_List_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ResourceServiceServer).List(ctx, req.(*ListRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ResourceService_Create_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ResourceServiceServer).Create(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ResourceService_Create_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ResourceServiceServer).Create(ctx, req.(*CreateRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ResourceService_Update_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ResourceServiceServer).Update(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ResourceService_Update_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ResourceServiceServer).Update(ctx, req.(*UpdateRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ResourceService_Delete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ResourceServiceServer).Delete(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ResourceService_Delete_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ResourceServiceServer).Delete(ctx, req.(*DeleteRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ResourceService_Teardown_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ResourceServiceServer).Teardown(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ResourceService_Teardown_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ResourceServiceServer).Teardown(ctx, req.(*DeleteRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ResourceService_Watch_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(WatchRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(ResourceServiceServer).Watch(m, &resourceServiceWatchServer{stream}) +} + +type ResourceService_WatchServer interface { + Send(*WatchResponse) error + grpc.ServerStream +} + +type resourceServiceWatchServer struct { + grpc.ServerStream +} + +func (x *resourceServiceWatchServer) Send(m *WatchResponse) error { + return x.ServerStream.SendMsg(m) +} + +// ResourceService_ServiceDesc is the grpc.ServiceDesc for ResourceService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var ResourceService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "omni.resources.ResourceService", + HandlerType: (*ResourceServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "Get", + Handler: _ResourceService_Get_Handler, + }, + { + MethodName: "List", + Handler: _ResourceService_List_Handler, + }, + { + MethodName: "Create", + Handler: _ResourceService_Create_Handler, + }, + { + MethodName: "Update", + Handler: _ResourceService_Update_Handler, + }, + { + MethodName: "Delete", + Handler: _ResourceService_Delete_Handler, + }, + { + MethodName: "Teardown", + Handler: _ResourceService_Teardown_Handler, + }, + }, + Streams: []grpc.StreamDesc{ + { + StreamName: "Watch", + Handler: _ResourceService_Watch_Handler, + ServerStreams: true, + }, + }, + Metadata: "omni/resources/resources.proto", +} diff --git a/client/api/omni/resources/resources_vtproto.pb.go b/client/api/omni/resources/resources_vtproto.pb.go new file mode 100644 index 00000000..d36214fd --- /dev/null +++ b/client/api/omni/resources/resources_vtproto.pb.go @@ -0,0 +1,3474 @@ +// Code generated by protoc-gen-go-vtproto. DO NOT EDIT. +// protoc-gen-go-vtproto version: v0.6.0 +// source: omni/resources/resources.proto + +package resources + +import ( + fmt "fmt" + io "io" + + v1alpha1 "github.com/cosi-project/runtime/api/v1alpha1" + protohelpers "github.com/planetscale/vtprotobuf/protohelpers" + proto "google.golang.org/protobuf/proto" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +func (m *Resource) CloneVT() *Resource { + if m == nil { + return (*Resource)(nil) + } + r := new(Resource) + r.Spec = m.Spec + if rhs := m.Metadata; rhs != nil { + if vtpb, ok := interface{}(rhs).(interface{ CloneVT() *v1alpha1.Metadata }); ok { + r.Metadata = vtpb.CloneVT() + } else { + r.Metadata = proto.Clone(rhs).(*v1alpha1.Metadata) + } + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *Resource) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *GetRequest) CloneVT() *GetRequest { + if m == nil { + return (*GetRequest)(nil) + } + r := new(GetRequest) + r.Namespace = m.Namespace + r.Type = m.Type + r.Id = m.Id + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *GetRequest) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *GetResponse) CloneVT() *GetResponse { + if m == nil { + return (*GetResponse)(nil) + } + r := new(GetResponse) + r.Body = m.Body + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *GetResponse) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *ListRequest) CloneVT() *ListRequest { + if m == nil { + return (*ListRequest)(nil) + } + r := new(ListRequest) + r.Namespace = m.Namespace + r.Type = m.Type + r.Offset = m.Offset + r.Limit = m.Limit + r.SortByField = m.SortByField + r.SortDescending = m.SortDescending + if rhs := m.SearchFor; rhs != nil { + tmpContainer := make([]string, len(rhs)) + copy(tmpContainer, rhs) + r.SearchFor = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *ListRequest) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *ListResponse) CloneVT() *ListResponse { + if m == nil { + return (*ListResponse)(nil) + } + r := new(ListResponse) + r.Total = m.Total + if rhs := m.Items; rhs != nil { + tmpContainer := make([]string, len(rhs)) + copy(tmpContainer, rhs) + r.Items = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *ListResponse) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *Event) CloneVT() *Event { + if m == nil { + return (*Event)(nil) + } + r := new(Event) + r.Resource = m.Resource + r.Old = m.Old + r.EventType = m.EventType + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *Event) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *WatchRequest) CloneVT() *WatchRequest { + if m == nil { + return (*WatchRequest)(nil) + } + r := new(WatchRequest) + r.Namespace = m.Namespace + r.Type = m.Type + r.Id = m.Id + r.TailEvents = m.TailEvents + r.Offset = m.Offset + r.Limit = m.Limit + r.SortByField = m.SortByField + r.SortDescending = m.SortDescending + if rhs := m.SearchFor; rhs != nil { + tmpContainer := make([]string, len(rhs)) + copy(tmpContainer, rhs) + r.SearchFor = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *WatchRequest) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *WatchResponse) CloneVT() *WatchResponse { + if m == nil { + return (*WatchResponse)(nil) + } + r := new(WatchResponse) + r.Event = m.Event.CloneVT() + r.Total = m.Total + r.SortFieldData = m.SortFieldData + r.SortDescending = m.SortDescending + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *WatchResponse) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *CreateRequest) CloneVT() *CreateRequest { + if m == nil { + return (*CreateRequest)(nil) + } + r := new(CreateRequest) + r.Resource = m.Resource.CloneVT() + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *CreateRequest) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *CreateResponse) CloneVT() *CreateResponse { + if m == nil { + return (*CreateResponse)(nil) + } + r := new(CreateResponse) + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *CreateResponse) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *UpdateRequest) CloneVT() *UpdateRequest { + if m == nil { + return (*UpdateRequest)(nil) + } + r := new(UpdateRequest) + r.CurrentVersion = m.CurrentVersion + r.Resource = m.Resource.CloneVT() + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *UpdateRequest) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *UpdateResponse) CloneVT() *UpdateResponse { + if m == nil { + return (*UpdateResponse)(nil) + } + r := new(UpdateResponse) + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *UpdateResponse) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *DeleteRequest) CloneVT() *DeleteRequest { + if m == nil { + return (*DeleteRequest)(nil) + } + r := new(DeleteRequest) + r.Namespace = m.Namespace + r.Type = m.Type + r.Id = m.Id + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *DeleteRequest) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *DeleteResponse) CloneVT() *DeleteResponse { + if m == nil { + return (*DeleteResponse)(nil) + } + r := new(DeleteResponse) + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *DeleteResponse) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (this *Resource) EqualVT(that *Resource) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if equal, ok := interface{}(this.Metadata).(interface{ EqualVT(*v1alpha1.Metadata) bool }); ok { + if !equal.EqualVT(that.Metadata) { + return false + } + } else if !proto.Equal(this.Metadata, that.Metadata) { + return false + } + if this.Spec != that.Spec { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *Resource) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*Resource) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *GetRequest) EqualVT(that *GetRequest) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Namespace != that.Namespace { + return false + } + if this.Type != that.Type { + return false + } + if this.Id != that.Id { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *GetRequest) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*GetRequest) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *GetResponse) EqualVT(that *GetResponse) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Body != that.Body { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *GetResponse) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*GetResponse) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *ListRequest) EqualVT(that *ListRequest) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Namespace != that.Namespace { + return false + } + if this.Type != that.Type { + return false + } + if this.Offset != that.Offset { + return false + } + if this.Limit != that.Limit { + return false + } + if this.SortByField != that.SortByField { + return false + } + if this.SortDescending != that.SortDescending { + return false + } + if len(this.SearchFor) != len(that.SearchFor) { + return false + } + for i, vx := range this.SearchFor { + vy := that.SearchFor[i] + if vx != vy { + return false + } + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *ListRequest) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*ListRequest) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *ListResponse) EqualVT(that *ListResponse) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if len(this.Items) != len(that.Items) { + return false + } + for i, vx := range this.Items { + vy := that.Items[i] + if vx != vy { + return false + } + } + if this.Total != that.Total { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *ListResponse) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*ListResponse) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *Event) EqualVT(that *Event) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Resource != that.Resource { + return false + } + if this.Old != that.Old { + return false + } + if this.EventType != that.EventType { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *Event) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*Event) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *WatchRequest) EqualVT(that *WatchRequest) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Namespace != that.Namespace { + return false + } + if this.Type != that.Type { + return false + } + if this.Id != that.Id { + return false + } + if this.TailEvents != that.TailEvents { + return false + } + if this.Offset != that.Offset { + return false + } + if this.Limit != that.Limit { + return false + } + if this.SortByField != that.SortByField { + return false + } + if this.SortDescending != that.SortDescending { + return false + } + if len(this.SearchFor) != len(that.SearchFor) { + return false + } + for i, vx := range this.SearchFor { + vy := that.SearchFor[i] + if vx != vy { + return false + } + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *WatchRequest) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*WatchRequest) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *WatchResponse) EqualVT(that *WatchResponse) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if !this.Event.EqualVT(that.Event) { + return false + } + if this.Total != that.Total { + return false + } + if this.SortFieldData != that.SortFieldData { + return false + } + if this.SortDescending != that.SortDescending { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *WatchResponse) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*WatchResponse) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *CreateRequest) EqualVT(that *CreateRequest) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if !this.Resource.EqualVT(that.Resource) { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *CreateRequest) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*CreateRequest) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *CreateResponse) EqualVT(that *CreateResponse) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *CreateResponse) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*CreateResponse) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *UpdateRequest) EqualVT(that *UpdateRequest) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.CurrentVersion != that.CurrentVersion { + return false + } + if !this.Resource.EqualVT(that.Resource) { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *UpdateRequest) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*UpdateRequest) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *UpdateResponse) EqualVT(that *UpdateResponse) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *UpdateResponse) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*UpdateResponse) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *DeleteRequest) EqualVT(that *DeleteRequest) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Namespace != that.Namespace { + return false + } + if this.Type != that.Type { + return false + } + if this.Id != that.Id { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *DeleteRequest) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*DeleteRequest) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *DeleteResponse) EqualVT(that *DeleteResponse) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *DeleteResponse) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*DeleteResponse) + if !ok { + return false + } + return this.EqualVT(that) +} +func (m *Resource) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Resource) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *Resource) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Spec) > 0 { + i -= len(m.Spec) + copy(dAtA[i:], m.Spec) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Spec))) + i-- + dAtA[i] = 0x12 + } + if m.Metadata != nil { + if vtmsg, ok := interface{}(m.Metadata).(interface { + MarshalToSizedBufferVT([]byte) (int, error) + }); ok { + size, err := vtmsg.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + } else { + encoded, err := proto.Marshal(m.Metadata) + if err != nil { + return 0, err + } + i -= len(encoded) + copy(dAtA[i:], encoded) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(encoded))) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *GetRequest) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *GetRequest) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *GetRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0x1a + } + if len(m.Type) > 0 { + i -= len(m.Type) + copy(dAtA[i:], m.Type) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Type))) + i-- + dAtA[i] = 0x12 + } + if len(m.Namespace) > 0 { + i -= len(m.Namespace) + copy(dAtA[i:], m.Namespace) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Namespace))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *GetResponse) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *GetResponse) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *GetResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Body) > 0 { + i -= len(m.Body) + copy(dAtA[i:], m.Body) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Body))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ListRequest) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ListRequest) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *ListRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.SearchFor) > 0 { + for iNdEx := len(m.SearchFor) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.SearchFor[iNdEx]) + copy(dAtA[i:], m.SearchFor[iNdEx]) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.SearchFor[iNdEx]))) + i-- + dAtA[i] = 0x3a + } + } + if m.SortDescending { + i-- + if m.SortDescending { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x30 + } + if len(m.SortByField) > 0 { + i -= len(m.SortByField) + copy(dAtA[i:], m.SortByField) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.SortByField))) + i-- + dAtA[i] = 0x2a + } + if m.Limit != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Limit)) + i-- + dAtA[i] = 0x20 + } + if m.Offset != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Offset)) + i-- + dAtA[i] = 0x18 + } + if len(m.Type) > 0 { + i -= len(m.Type) + copy(dAtA[i:], m.Type) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Type))) + i-- + dAtA[i] = 0x12 + } + if len(m.Namespace) > 0 { + i -= len(m.Namespace) + copy(dAtA[i:], m.Namespace) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Namespace))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ListResponse) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ListResponse) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *ListResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.Total != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Total)) + i-- + dAtA[i] = 0x10 + } + if len(m.Items) > 0 { + for iNdEx := len(m.Items) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Items[iNdEx]) + copy(dAtA[i:], m.Items[iNdEx]) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Items[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *Event) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Event) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *Event) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.EventType != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.EventType)) + i-- + dAtA[i] = 0x18 + } + if len(m.Old) > 0 { + i -= len(m.Old) + copy(dAtA[i:], m.Old) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Old))) + i-- + dAtA[i] = 0x12 + } + if len(m.Resource) > 0 { + i -= len(m.Resource) + copy(dAtA[i:], m.Resource) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Resource))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *WatchRequest) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *WatchRequest) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *WatchRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.SearchFor) > 0 { + for iNdEx := len(m.SearchFor) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.SearchFor[iNdEx]) + copy(dAtA[i:], m.SearchFor[iNdEx]) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.SearchFor[iNdEx]))) + i-- + dAtA[i] = 0x4a + } + } + if m.SortDescending { + i-- + if m.SortDescending { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x40 + } + if len(m.SortByField) > 0 { + i -= len(m.SortByField) + copy(dAtA[i:], m.SortByField) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.SortByField))) + i-- + dAtA[i] = 0x3a + } + if m.Limit != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Limit)) + i-- + dAtA[i] = 0x30 + } + if m.Offset != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Offset)) + i-- + dAtA[i] = 0x28 + } + if m.TailEvents != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.TailEvents)) + i-- + dAtA[i] = 0x20 + } + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0x1a + } + if len(m.Type) > 0 { + i -= len(m.Type) + copy(dAtA[i:], m.Type) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Type))) + i-- + dAtA[i] = 0x12 + } + if len(m.Namespace) > 0 { + i -= len(m.Namespace) + copy(dAtA[i:], m.Namespace) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Namespace))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *WatchResponse) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *WatchResponse) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *WatchResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.SortDescending { + i-- + if m.SortDescending { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x20 + } + if len(m.SortFieldData) > 0 { + i -= len(m.SortFieldData) + copy(dAtA[i:], m.SortFieldData) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.SortFieldData))) + i-- + dAtA[i] = 0x1a + } + if m.Total != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Total)) + i-- + dAtA[i] = 0x10 + } + if m.Event != nil { + size, err := m.Event.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *CreateRequest) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CreateRequest) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *CreateRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.Resource != nil { + size, err := m.Resource.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *CreateResponse) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CreateResponse) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *CreateResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + return len(dAtA) - i, nil +} + +func (m *UpdateRequest) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *UpdateRequest) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *UpdateRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.Resource != nil { + size, err := m.Resource.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x12 + } + if len(m.CurrentVersion) > 0 { + i -= len(m.CurrentVersion) + copy(dAtA[i:], m.CurrentVersion) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.CurrentVersion))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *UpdateResponse) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *UpdateResponse) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *UpdateResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + return len(dAtA) - i, nil +} + +func (m *DeleteRequest) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DeleteRequest) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *DeleteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0x1a + } + if len(m.Type) > 0 { + i -= len(m.Type) + copy(dAtA[i:], m.Type) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Type))) + i-- + dAtA[i] = 0x12 + } + if len(m.Namespace) > 0 { + i -= len(m.Namespace) + copy(dAtA[i:], m.Namespace) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Namespace))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *DeleteResponse) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DeleteResponse) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *DeleteResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + return len(dAtA) - i, nil +} + +func (m *Resource) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Metadata != nil { + if size, ok := interface{}(m.Metadata).(interface { + SizeVT() int + }); ok { + l = size.SizeVT() + } else { + l = proto.Size(m.Metadata) + } + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Spec) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *GetRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Namespace) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Type) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Id) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *GetResponse) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Body) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *ListRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Namespace) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Type) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.Offset != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.Offset)) + } + if m.Limit != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.Limit)) + } + l = len(m.SortByField) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.SortDescending { + n += 2 + } + if len(m.SearchFor) > 0 { + for _, s := range m.SearchFor { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + n += len(m.unknownFields) + return n +} + +func (m *ListResponse) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Items) > 0 { + for _, s := range m.Items { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + if m.Total != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.Total)) + } + n += len(m.unknownFields) + return n +} + +func (m *Event) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Resource) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Old) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.EventType != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.EventType)) + } + n += len(m.unknownFields) + return n +} + +func (m *WatchRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Namespace) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Type) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Id) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.TailEvents != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.TailEvents)) + } + if m.Offset != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.Offset)) + } + if m.Limit != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.Limit)) + } + l = len(m.SortByField) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.SortDescending { + n += 2 + } + if len(m.SearchFor) > 0 { + for _, s := range m.SearchFor { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + n += len(m.unknownFields) + return n +} + +func (m *WatchResponse) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Event != nil { + l = m.Event.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.Total != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.Total)) + } + l = len(m.SortFieldData) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.SortDescending { + n += 2 + } + n += len(m.unknownFields) + return n +} + +func (m *CreateRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Resource != nil { + l = m.Resource.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *CreateResponse) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + n += len(m.unknownFields) + return n +} + +func (m *UpdateRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.CurrentVersion) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.Resource != nil { + l = m.Resource.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *UpdateResponse) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + n += len(m.unknownFields) + return n +} + +func (m *DeleteRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Namespace) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Type) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Id) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *DeleteResponse) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + n += len(m.unknownFields) + return n +} + +func (m *Resource) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Resource: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Resource: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Metadata == nil { + m.Metadata = &v1alpha1.Metadata{} + } + if unmarshal, ok := interface{}(m.Metadata).(interface { + UnmarshalVT([]byte) error + }); ok { + if err := unmarshal.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + } else { + if err := proto.Unmarshal(dAtA[iNdEx:postIndex], m.Metadata); err != nil { + return err + } + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Spec = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *GetRequest) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GetRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GetRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Namespace", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Namespace = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Type = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Id = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *GetResponse) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GetResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GetResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Body", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Body = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ListRequest) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ListRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ListRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Namespace", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Namespace = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Type = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Offset", wireType) + } + m.Offset = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Offset |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Limit", wireType) + } + m.Limit = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Limit |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SortByField", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SortByField = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SortDescending", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.SortDescending = bool(v != 0) + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SearchFor", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SearchFor = append(m.SearchFor, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ListResponse) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ListResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ListResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Items = append(m.Items, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Total", wireType) + } + m.Total = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Total |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Event) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Event: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Event: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Resource", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Resource = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Old", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Old = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field EventType", wireType) + } + m.EventType = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.EventType |= EventType(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *WatchRequest) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: WatchRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: WatchRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Namespace", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Namespace = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Type = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Id = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TailEvents", wireType) + } + m.TailEvents = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.TailEvents |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Offset", wireType) + } + m.Offset = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Offset |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Limit", wireType) + } + m.Limit = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Limit |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SortByField", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SortByField = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SortDescending", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.SortDescending = bool(v != 0) + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SearchFor", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SearchFor = append(m.SearchFor, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *WatchResponse) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: WatchResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: WatchResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Event", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Event == nil { + m.Event = &Event{} + } + if err := m.Event.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Total", wireType) + } + m.Total = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Total |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SortFieldData", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SortFieldData = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SortDescending", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.SortDescending = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CreateRequest) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CreateRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CreateRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Resource", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Resource == nil { + m.Resource = &Resource{} + } + if err := m.Resource.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CreateResponse) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CreateResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CreateResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *UpdateRequest) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: UpdateRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: UpdateRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CurrentVersion", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.CurrentVersion = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Resource", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Resource == nil { + m.Resource = &Resource{} + } + if err := m.Resource.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *UpdateResponse) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: UpdateResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: UpdateResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DeleteRequest) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DeleteRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeleteRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Namespace", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Namespace = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Type = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Id = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DeleteResponse) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DeleteResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeleteResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} diff --git a/client/api/omni/specs/auth.pb.go b/client/api/omni/specs/auth.pb.go new file mode 100644 index 00000000..4983c62e --- /dev/null +++ b/client/api/omni/specs/auth.pb.go @@ -0,0 +1,2017 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.32.0 +// protoc v4.24.4 +// source: omni/specs/auth.proto + +package specs + +import ( + reflect "reflect" + sync "sync" + + _ "github.com/siderolabs/talos/pkg/machinery/api/machine" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// AuthConfigSpec describes the authentication configuration. +type AuthConfigSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Auth0 *AuthConfigSpec_Auth0 `protobuf:"bytes,1,opt,name=auth0,proto3" json:"auth0,omitempty"` + Webauthn *AuthConfigSpec_Webauthn `protobuf:"bytes,2,opt,name=webauthn,proto3" json:"webauthn,omitempty"` + Suspended bool `protobuf:"varint,3,opt,name=suspended,proto3" json:"suspended,omitempty"` + Saml *AuthConfigSpec_SAML `protobuf:"bytes,4,opt,name=saml,proto3" json:"saml,omitempty"` +} + +func (x *AuthConfigSpec) Reset() { + *x = AuthConfigSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_auth_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AuthConfigSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AuthConfigSpec) ProtoMessage() {} + +func (x *AuthConfigSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_auth_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AuthConfigSpec.ProtoReflect.Descriptor instead. +func (*AuthConfigSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_auth_proto_rawDescGZIP(), []int{0} +} + +func (x *AuthConfigSpec) GetAuth0() *AuthConfigSpec_Auth0 { + if x != nil { + return x.Auth0 + } + return nil +} + +func (x *AuthConfigSpec) GetWebauthn() *AuthConfigSpec_Webauthn { + if x != nil { + return x.Webauthn + } + return nil +} + +func (x *AuthConfigSpec) GetSuspended() bool { + if x != nil { + return x.Suspended + } + return false +} + +func (x *AuthConfigSpec) GetSaml() *AuthConfigSpec_SAML { + if x != nil { + return x.Saml + } + return nil +} + +// SAMLAssertionSpec describes SAML assertion. +type SAMLAssertionSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Data keeps JSON encoded SAML assertion. + Data []byte `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` + // Email is the identity that was read from the assertion. + Email string `protobuf:"bytes,2,opt,name=email,proto3" json:"email,omitempty"` + // Used marks SAML assertion as used. + Used bool `protobuf:"varint,3,opt,name=used,proto3" json:"used,omitempty"` +} + +func (x *SAMLAssertionSpec) Reset() { + *x = SAMLAssertionSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_auth_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SAMLAssertionSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SAMLAssertionSpec) ProtoMessage() {} + +func (x *SAMLAssertionSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_auth_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SAMLAssertionSpec.ProtoReflect.Descriptor instead. +func (*SAMLAssertionSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_auth_proto_rawDescGZIP(), []int{1} +} + +func (x *SAMLAssertionSpec) GetData() []byte { + if x != nil { + return x.Data + } + return nil +} + +func (x *SAMLAssertionSpec) GetEmail() string { + if x != nil { + return x.Email + } + return "" +} + +func (x *SAMLAssertionSpec) GetUsed() bool { + if x != nil { + return x.Used + } + return false +} + +// UserSpec describes a user. +type UserSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Scopes are deprecated, use roles instead. + // + // Deprecated: will be removed once all environments are migrated to use roles. + // TODO: remove after all environments are migrated to use roles. + Scopes []string `protobuf:"bytes,2,rep,name=scopes,proto3" json:"scopes,omitempty"` + Role string `protobuf:"bytes,3,opt,name=role,proto3" json:"role,omitempty"` +} + +func (x *UserSpec) Reset() { + *x = UserSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_auth_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UserSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UserSpec) ProtoMessage() {} + +func (x *UserSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_auth_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UserSpec.ProtoReflect.Descriptor instead. +func (*UserSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_auth_proto_rawDescGZIP(), []int{2} +} + +func (x *UserSpec) GetScopes() []string { + if x != nil { + return x.Scopes + } + return nil +} + +func (x *UserSpec) GetRole() string { + if x != nil { + return x.Role + } + return "" +} + +// IdentitySpec describes a user identity. +type IdentitySpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` +} + +func (x *IdentitySpec) Reset() { + *x = IdentitySpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_auth_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *IdentitySpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*IdentitySpec) ProtoMessage() {} + +func (x *IdentitySpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_auth_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use IdentitySpec.ProtoReflect.Descriptor instead. +func (*IdentitySpec) Descriptor() ([]byte, []int) { + return file_omni_specs_auth_proto_rawDescGZIP(), []int{3} +} + +func (x *IdentitySpec) GetUserId() string { + if x != nil { + return x.UserId + } + return "" +} + +type Identity struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Email string `protobuf:"bytes,1,opt,name=email,proto3" json:"email,omitempty"` +} + +func (x *Identity) Reset() { + *x = Identity{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_auth_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Identity) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Identity) ProtoMessage() {} + +func (x *Identity) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_auth_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Identity.ProtoReflect.Descriptor instead. +func (*Identity) Descriptor() ([]byte, []int) { + return file_omni_specs_auth_proto_rawDescGZIP(), []int{4} +} + +func (x *Identity) GetEmail() string { + if x != nil { + return x.Email + } + return "" +} + +// PublicKeySpec describes a user or service account public key. +type PublicKeySpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + PublicKey []byte `protobuf:"bytes,1,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` + // Scopes are deprecated, use roles instead. + // + // Deprecated: will be removed once all environments are migrated to use roles. + // TODO: remove after all environments are migrated to use roles. + Scopes []string `protobuf:"bytes,2,rep,name=scopes,proto3" json:"scopes,omitempty"` + Expiration *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=expiration,proto3" json:"expiration,omitempty"` + Confirmed bool `protobuf:"varint,4,opt,name=confirmed,proto3" json:"confirmed,omitempty"` + Identity *Identity `protobuf:"bytes,5,opt,name=identity,proto3" json:"identity,omitempty"` + Role string `protobuf:"bytes,6,opt,name=role,proto3" json:"role,omitempty"` +} + +func (x *PublicKeySpec) Reset() { + *x = PublicKeySpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_auth_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PublicKeySpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PublicKeySpec) ProtoMessage() {} + +func (x *PublicKeySpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_auth_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PublicKeySpec.ProtoReflect.Descriptor instead. +func (*PublicKeySpec) Descriptor() ([]byte, []int) { + return file_omni_specs_auth_proto_rawDescGZIP(), []int{5} +} + +func (x *PublicKeySpec) GetPublicKey() []byte { + if x != nil { + return x.PublicKey + } + return nil +} + +func (x *PublicKeySpec) GetScopes() []string { + if x != nil { + return x.Scopes + } + return nil +} + +func (x *PublicKeySpec) GetExpiration() *timestamppb.Timestamp { + if x != nil { + return x.Expiration + } + return nil +} + +func (x *PublicKeySpec) GetConfirmed() bool { + if x != nil { + return x.Confirmed + } + return false +} + +func (x *PublicKeySpec) GetIdentity() *Identity { + if x != nil { + return x.Identity + } + return nil +} + +func (x *PublicKeySpec) GetRole() string { + if x != nil { + return x.Role + } + return "" +} + +// AccessPolicyUserGroup describes a user group in the ACLs context. +type AccessPolicyUserGroup struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Users []*AccessPolicyUserGroup_User `protobuf:"bytes,1,rep,name=users,proto3" json:"users,omitempty"` +} + +func (x *AccessPolicyUserGroup) Reset() { + *x = AccessPolicyUserGroup{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_auth_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AccessPolicyUserGroup) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AccessPolicyUserGroup) ProtoMessage() {} + +func (x *AccessPolicyUserGroup) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_auth_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AccessPolicyUserGroup.ProtoReflect.Descriptor instead. +func (*AccessPolicyUserGroup) Descriptor() ([]byte, []int) { + return file_omni_specs_auth_proto_rawDescGZIP(), []int{6} +} + +func (x *AccessPolicyUserGroup) GetUsers() []*AccessPolicyUserGroup_User { + if x != nil { + return x.Users + } + return nil +} + +// AccessPolicyClusterGroup describes a cluster group in the ACLs context. +type AccessPolicyClusterGroup struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Clusters []*AccessPolicyClusterGroup_Cluster `protobuf:"bytes,1,rep,name=clusters,proto3" json:"clusters,omitempty"` +} + +func (x *AccessPolicyClusterGroup) Reset() { + *x = AccessPolicyClusterGroup{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_auth_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AccessPolicyClusterGroup) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AccessPolicyClusterGroup) ProtoMessage() {} + +func (x *AccessPolicyClusterGroup) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_auth_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AccessPolicyClusterGroup.ProtoReflect.Descriptor instead. +func (*AccessPolicyClusterGroup) Descriptor() ([]byte, []int) { + return file_omni_specs_auth_proto_rawDescGZIP(), []int{7} +} + +func (x *AccessPolicyClusterGroup) GetClusters() []*AccessPolicyClusterGroup_Cluster { + if x != nil { + return x.Clusters + } + return nil +} + +// AccessPolicyRule describes a rule in the ACLs context. +type AccessPolicyRule struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Users []string `protobuf:"bytes,1,rep,name=users,proto3" json:"users,omitempty"` + Clusters []string `protobuf:"bytes,2,rep,name=clusters,proto3" json:"clusters,omitempty"` + Kubernetes *AccessPolicyRule_Kubernetes `protobuf:"bytes,3,opt,name=kubernetes,proto3" json:"kubernetes,omitempty"` + Role string `protobuf:"bytes,4,opt,name=role,proto3" json:"role,omitempty"` +} + +func (x *AccessPolicyRule) Reset() { + *x = AccessPolicyRule{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_auth_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AccessPolicyRule) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AccessPolicyRule) ProtoMessage() {} + +func (x *AccessPolicyRule) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_auth_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AccessPolicyRule.ProtoReflect.Descriptor instead. +func (*AccessPolicyRule) Descriptor() ([]byte, []int) { + return file_omni_specs_auth_proto_rawDescGZIP(), []int{8} +} + +func (x *AccessPolicyRule) GetUsers() []string { + if x != nil { + return x.Users + } + return nil +} + +func (x *AccessPolicyRule) GetClusters() []string { + if x != nil { + return x.Clusters + } + return nil +} + +func (x *AccessPolicyRule) GetKubernetes() *AccessPolicyRule_Kubernetes { + if x != nil { + return x.Kubernetes + } + return nil +} + +func (x *AccessPolicyRule) GetRole() string { + if x != nil { + return x.Role + } + return "" +} + +type AccessPolicyTest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + User *AccessPolicyTest_User `protobuf:"bytes,2,opt,name=user,proto3" json:"user,omitempty"` + Cluster *AccessPolicyTest_Cluster `protobuf:"bytes,3,opt,name=cluster,proto3" json:"cluster,omitempty"` + Expected *AccessPolicyTest_Expected `protobuf:"bytes,4,opt,name=expected,proto3" json:"expected,omitempty"` +} + +func (x *AccessPolicyTest) Reset() { + *x = AccessPolicyTest{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_auth_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AccessPolicyTest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AccessPolicyTest) ProtoMessage() {} + +func (x *AccessPolicyTest) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_auth_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AccessPolicyTest.ProtoReflect.Descriptor instead. +func (*AccessPolicyTest) Descriptor() ([]byte, []int) { + return file_omni_specs_auth_proto_rawDescGZIP(), []int{9} +} + +func (x *AccessPolicyTest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *AccessPolicyTest) GetUser() *AccessPolicyTest_User { + if x != nil { + return x.User + } + return nil +} + +func (x *AccessPolicyTest) GetCluster() *AccessPolicyTest_Cluster { + if x != nil { + return x.Cluster + } + return nil +} + +func (x *AccessPolicyTest) GetExpected() *AccessPolicyTest_Expected { + if x != nil { + return x.Expected + } + return nil +} + +// AccessPolicySpec describes the access policy configuration. +type AccessPolicySpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + UserGroups map[string]*AccessPolicyUserGroup `protobuf:"bytes,1,rep,name=user_groups,json=userGroups,proto3" json:"user_groups,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + ClusterGroups map[string]*AccessPolicyClusterGroup `protobuf:"bytes,2,rep,name=cluster_groups,json=clusterGroups,proto3" json:"cluster_groups,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Rules []*AccessPolicyRule `protobuf:"bytes,3,rep,name=rules,proto3" json:"rules,omitempty"` + Tests []*AccessPolicyTest `protobuf:"bytes,4,rep,name=tests,proto3" json:"tests,omitempty"` +} + +func (x *AccessPolicySpec) Reset() { + *x = AccessPolicySpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_auth_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AccessPolicySpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AccessPolicySpec) ProtoMessage() {} + +func (x *AccessPolicySpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_auth_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AccessPolicySpec.ProtoReflect.Descriptor instead. +func (*AccessPolicySpec) Descriptor() ([]byte, []int) { + return file_omni_specs_auth_proto_rawDescGZIP(), []int{10} +} + +func (x *AccessPolicySpec) GetUserGroups() map[string]*AccessPolicyUserGroup { + if x != nil { + return x.UserGroups + } + return nil +} + +func (x *AccessPolicySpec) GetClusterGroups() map[string]*AccessPolicyClusterGroup { + if x != nil { + return x.ClusterGroups + } + return nil +} + +func (x *AccessPolicySpec) GetRules() []*AccessPolicyRule { + if x != nil { + return x.Rules + } + return nil +} + +func (x *AccessPolicySpec) GetTests() []*AccessPolicyTest { + if x != nil { + return x.Tests + } + return nil +} + +// SAMLLabelRuleSpec describes a rule on how to map Identity labels to Omni roles. +type SAMLLabelRuleSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // MatchLabels is the list of labels to match the user's Identity against this rule. + MatchLabels []string `protobuf:"bytes,1,rep,name=match_labels,json=matchLabels,proto3" json:"match_labels,omitempty"` + // AssignRoleOnRegistration is the role to be assigned to the user if this rule matches. + AssignRoleOnRegistration string `protobuf:"bytes,2,opt,name=assign_role_on_registration,json=assignRoleOnRegistration,proto3" json:"assign_role_on_registration,omitempty"` +} + +func (x *SAMLLabelRuleSpec) Reset() { + *x = SAMLLabelRuleSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_auth_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SAMLLabelRuleSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SAMLLabelRuleSpec) ProtoMessage() {} + +func (x *SAMLLabelRuleSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_auth_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SAMLLabelRuleSpec.ProtoReflect.Descriptor instead. +func (*SAMLLabelRuleSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_auth_proto_rawDescGZIP(), []int{11} +} + +func (x *SAMLLabelRuleSpec) GetMatchLabels() []string { + if x != nil { + return x.MatchLabels + } + return nil +} + +func (x *SAMLLabelRuleSpec) GetAssignRoleOnRegistration() string { + if x != nil { + return x.AssignRoleOnRegistration + } + return "" +} + +type AuthConfigSpec_Auth0 struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` + Domain string `protobuf:"bytes,2,opt,name=domain,proto3" json:"domain,omitempty"` + ClientId string `protobuf:"bytes,3,opt,name=client_id,json=clientId,proto3" json:"client_id,omitempty"` +} + +func (x *AuthConfigSpec_Auth0) Reset() { + *x = AuthConfigSpec_Auth0{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_auth_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AuthConfigSpec_Auth0) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AuthConfigSpec_Auth0) ProtoMessage() {} + +func (x *AuthConfigSpec_Auth0) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_auth_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AuthConfigSpec_Auth0.ProtoReflect.Descriptor instead. +func (*AuthConfigSpec_Auth0) Descriptor() ([]byte, []int) { + return file_omni_specs_auth_proto_rawDescGZIP(), []int{0, 0} +} + +func (x *AuthConfigSpec_Auth0) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +func (x *AuthConfigSpec_Auth0) GetDomain() string { + if x != nil { + return x.Domain + } + return "" +} + +func (x *AuthConfigSpec_Auth0) GetClientId() string { + if x != nil { + return x.ClientId + } + return "" +} + +type AuthConfigSpec_Webauthn struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` + Required bool `protobuf:"varint,2,opt,name=required,proto3" json:"required,omitempty"` +} + +func (x *AuthConfigSpec_Webauthn) Reset() { + *x = AuthConfigSpec_Webauthn{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_auth_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AuthConfigSpec_Webauthn) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AuthConfigSpec_Webauthn) ProtoMessage() {} + +func (x *AuthConfigSpec_Webauthn) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_auth_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AuthConfigSpec_Webauthn.ProtoReflect.Descriptor instead. +func (*AuthConfigSpec_Webauthn) Descriptor() ([]byte, []int) { + return file_omni_specs_auth_proto_rawDescGZIP(), []int{0, 1} +} + +func (x *AuthConfigSpec_Webauthn) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +func (x *AuthConfigSpec_Webauthn) GetRequired() bool { + if x != nil { + return x.Required + } + return false +} + +type AuthConfigSpec_SAML struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` + Url string `protobuf:"bytes,2,opt,name=url,proto3" json:"url,omitempty"` + Metadata string `protobuf:"bytes,3,opt,name=metadata,proto3" json:"metadata,omitempty"` + // LabelRules defines custom rules on how to extract SAML attributes from the + // saml assertion and turn them into labels. + LabelRules map[string]string `protobuf:"bytes,4,rep,name=label_rules,json=labelRules,proto3" json:"label_rules,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *AuthConfigSpec_SAML) Reset() { + *x = AuthConfigSpec_SAML{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_auth_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AuthConfigSpec_SAML) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AuthConfigSpec_SAML) ProtoMessage() {} + +func (x *AuthConfigSpec_SAML) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_auth_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AuthConfigSpec_SAML.ProtoReflect.Descriptor instead. +func (*AuthConfigSpec_SAML) Descriptor() ([]byte, []int) { + return file_omni_specs_auth_proto_rawDescGZIP(), []int{0, 2} +} + +func (x *AuthConfigSpec_SAML) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +func (x *AuthConfigSpec_SAML) GetUrl() string { + if x != nil { + return x.Url + } + return "" +} + +func (x *AuthConfigSpec_SAML) GetMetadata() string { + if x != nil { + return x.Metadata + } + return "" +} + +func (x *AuthConfigSpec_SAML) GetLabelRules() map[string]string { + if x != nil { + return x.LabelRules + } + return nil +} + +type AccessPolicyUserGroup_User struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Match string `protobuf:"bytes,2,opt,name=match,proto3" json:"match,omitempty"` + LabelSelectors []string `protobuf:"bytes,3,rep,name=label_selectors,json=labelSelectors,proto3" json:"label_selectors,omitempty"` +} + +func (x *AccessPolicyUserGroup_User) Reset() { + *x = AccessPolicyUserGroup_User{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_auth_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AccessPolicyUserGroup_User) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AccessPolicyUserGroup_User) ProtoMessage() {} + +func (x *AccessPolicyUserGroup_User) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_auth_proto_msgTypes[16] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AccessPolicyUserGroup_User.ProtoReflect.Descriptor instead. +func (*AccessPolicyUserGroup_User) Descriptor() ([]byte, []int) { + return file_omni_specs_auth_proto_rawDescGZIP(), []int{6, 0} +} + +func (x *AccessPolicyUserGroup_User) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *AccessPolicyUserGroup_User) GetMatch() string { + if x != nil { + return x.Match + } + return "" +} + +func (x *AccessPolicyUserGroup_User) GetLabelSelectors() []string { + if x != nil { + return x.LabelSelectors + } + return nil +} + +type AccessPolicyClusterGroup_Cluster struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Match string `protobuf:"bytes,2,opt,name=match,proto3" json:"match,omitempty"` +} + +func (x *AccessPolicyClusterGroup_Cluster) Reset() { + *x = AccessPolicyClusterGroup_Cluster{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_auth_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AccessPolicyClusterGroup_Cluster) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AccessPolicyClusterGroup_Cluster) ProtoMessage() {} + +func (x *AccessPolicyClusterGroup_Cluster) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_auth_proto_msgTypes[17] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AccessPolicyClusterGroup_Cluster.ProtoReflect.Descriptor instead. +func (*AccessPolicyClusterGroup_Cluster) Descriptor() ([]byte, []int) { + return file_omni_specs_auth_proto_rawDescGZIP(), []int{7, 0} +} + +func (x *AccessPolicyClusterGroup_Cluster) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *AccessPolicyClusterGroup_Cluster) GetMatch() string { + if x != nil { + return x.Match + } + return "" +} + +type AccessPolicyRule_Kubernetes struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Impersonate *AccessPolicyRule_Kubernetes_Impersonate `protobuf:"bytes,1,opt,name=impersonate,proto3" json:"impersonate,omitempty"` +} + +func (x *AccessPolicyRule_Kubernetes) Reset() { + *x = AccessPolicyRule_Kubernetes{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_auth_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AccessPolicyRule_Kubernetes) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AccessPolicyRule_Kubernetes) ProtoMessage() {} + +func (x *AccessPolicyRule_Kubernetes) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_auth_proto_msgTypes[18] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AccessPolicyRule_Kubernetes.ProtoReflect.Descriptor instead. +func (*AccessPolicyRule_Kubernetes) Descriptor() ([]byte, []int) { + return file_omni_specs_auth_proto_rawDescGZIP(), []int{8, 0} +} + +func (x *AccessPolicyRule_Kubernetes) GetImpersonate() *AccessPolicyRule_Kubernetes_Impersonate { + if x != nil { + return x.Impersonate + } + return nil +} + +type AccessPolicyRule_Kubernetes_Impersonate struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Groups []string `protobuf:"bytes,1,rep,name=groups,proto3" json:"groups,omitempty"` +} + +func (x *AccessPolicyRule_Kubernetes_Impersonate) Reset() { + *x = AccessPolicyRule_Kubernetes_Impersonate{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_auth_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AccessPolicyRule_Kubernetes_Impersonate) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AccessPolicyRule_Kubernetes_Impersonate) ProtoMessage() {} + +func (x *AccessPolicyRule_Kubernetes_Impersonate) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_auth_proto_msgTypes[19] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AccessPolicyRule_Kubernetes_Impersonate.ProtoReflect.Descriptor instead. +func (*AccessPolicyRule_Kubernetes_Impersonate) Descriptor() ([]byte, []int) { + return file_omni_specs_auth_proto_rawDescGZIP(), []int{8, 0, 0} +} + +func (x *AccessPolicyRule_Kubernetes_Impersonate) GetGroups() []string { + if x != nil { + return x.Groups + } + return nil +} + +type AccessPolicyTest_Expected struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Kubernetes *AccessPolicyTest_Expected_Kubernetes `protobuf:"bytes,1,opt,name=kubernetes,proto3" json:"kubernetes,omitempty"` + Role string `protobuf:"bytes,2,opt,name=role,proto3" json:"role,omitempty"` +} + +func (x *AccessPolicyTest_Expected) Reset() { + *x = AccessPolicyTest_Expected{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_auth_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AccessPolicyTest_Expected) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AccessPolicyTest_Expected) ProtoMessage() {} + +func (x *AccessPolicyTest_Expected) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_auth_proto_msgTypes[20] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AccessPolicyTest_Expected.ProtoReflect.Descriptor instead. +func (*AccessPolicyTest_Expected) Descriptor() ([]byte, []int) { + return file_omni_specs_auth_proto_rawDescGZIP(), []int{9, 0} +} + +func (x *AccessPolicyTest_Expected) GetKubernetes() *AccessPolicyTest_Expected_Kubernetes { + if x != nil { + return x.Kubernetes + } + return nil +} + +func (x *AccessPolicyTest_Expected) GetRole() string { + if x != nil { + return x.Role + } + return "" +} + +type AccessPolicyTest_User struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Labels map[string]string `protobuf:"bytes,2,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *AccessPolicyTest_User) Reset() { + *x = AccessPolicyTest_User{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_auth_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AccessPolicyTest_User) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AccessPolicyTest_User) ProtoMessage() {} + +func (x *AccessPolicyTest_User) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_auth_proto_msgTypes[21] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AccessPolicyTest_User.ProtoReflect.Descriptor instead. +func (*AccessPolicyTest_User) Descriptor() ([]byte, []int) { + return file_omni_specs_auth_proto_rawDescGZIP(), []int{9, 1} +} + +func (x *AccessPolicyTest_User) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *AccessPolicyTest_User) GetLabels() map[string]string { + if x != nil { + return x.Labels + } + return nil +} + +type AccessPolicyTest_Cluster struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *AccessPolicyTest_Cluster) Reset() { + *x = AccessPolicyTest_Cluster{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_auth_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AccessPolicyTest_Cluster) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AccessPolicyTest_Cluster) ProtoMessage() {} + +func (x *AccessPolicyTest_Cluster) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_auth_proto_msgTypes[22] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AccessPolicyTest_Cluster.ProtoReflect.Descriptor instead. +func (*AccessPolicyTest_Cluster) Descriptor() ([]byte, []int) { + return file_omni_specs_auth_proto_rawDescGZIP(), []int{9, 2} +} + +func (x *AccessPolicyTest_Cluster) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type AccessPolicyTest_Expected_Kubernetes struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Impersonate *AccessPolicyTest_Expected_Kubernetes_Impersonate `protobuf:"bytes,1,opt,name=impersonate,proto3" json:"impersonate,omitempty"` +} + +func (x *AccessPolicyTest_Expected_Kubernetes) Reset() { + *x = AccessPolicyTest_Expected_Kubernetes{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_auth_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AccessPolicyTest_Expected_Kubernetes) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AccessPolicyTest_Expected_Kubernetes) ProtoMessage() {} + +func (x *AccessPolicyTest_Expected_Kubernetes) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_auth_proto_msgTypes[23] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AccessPolicyTest_Expected_Kubernetes.ProtoReflect.Descriptor instead. +func (*AccessPolicyTest_Expected_Kubernetes) Descriptor() ([]byte, []int) { + return file_omni_specs_auth_proto_rawDescGZIP(), []int{9, 0, 0} +} + +func (x *AccessPolicyTest_Expected_Kubernetes) GetImpersonate() *AccessPolicyTest_Expected_Kubernetes_Impersonate { + if x != nil { + return x.Impersonate + } + return nil +} + +type AccessPolicyTest_Expected_Kubernetes_Impersonate struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Groups []string `protobuf:"bytes,1,rep,name=groups,proto3" json:"groups,omitempty"` +} + +func (x *AccessPolicyTest_Expected_Kubernetes_Impersonate) Reset() { + *x = AccessPolicyTest_Expected_Kubernetes_Impersonate{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_auth_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AccessPolicyTest_Expected_Kubernetes_Impersonate) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AccessPolicyTest_Expected_Kubernetes_Impersonate) ProtoMessage() {} + +func (x *AccessPolicyTest_Expected_Kubernetes_Impersonate) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_auth_proto_msgTypes[24] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AccessPolicyTest_Expected_Kubernetes_Impersonate.ProtoReflect.Descriptor instead. +func (*AccessPolicyTest_Expected_Kubernetes_Impersonate) Descriptor() ([]byte, []int) { + return file_omni_specs_auth_proto_rawDescGZIP(), []int{9, 0, 0, 0} +} + +func (x *AccessPolicyTest_Expected_Kubernetes_Impersonate) GetGroups() []string { + if x != nil { + return x.Groups + } + return nil +} + +var File_omni_specs_auth_proto protoreflect.FileDescriptor + +var file_omni_specs_auth_proto_rawDesc = []byte{ + 0x0a, 0x15, 0x6f, 0x6d, 0x6e, 0x69, 0x2f, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2f, 0x61, 0x75, 0x74, + 0x68, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x73, 0x70, 0x65, 0x63, 0x73, 0x1a, 0x1b, + 0x74, 0x61, 0x6c, 0x6f, 0x73, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x2f, 0x6d, 0x61, + 0x63, 0x68, 0x69, 0x6e, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xc4, 0x04, 0x0a, + 0x0e, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x12, + 0x31, 0x0a, 0x05, 0x61, 0x75, 0x74, 0x68, 0x30, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, + 0x2e, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x30, 0x52, 0x05, 0x61, 0x75, 0x74, + 0x68, 0x30, 0x12, 0x3a, 0x0a, 0x08, 0x77, 0x65, 0x62, 0x61, 0x75, 0x74, 0x68, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2e, 0x41, 0x75, 0x74, + 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x57, 0x65, 0x62, 0x61, + 0x75, 0x74, 0x68, 0x6e, 0x52, 0x08, 0x77, 0x65, 0x62, 0x61, 0x75, 0x74, 0x68, 0x6e, 0x12, 0x1c, + 0x0a, 0x09, 0x73, 0x75, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x09, 0x73, 0x75, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x12, 0x2e, 0x0a, 0x04, + 0x73, 0x61, 0x6d, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x73, 0x70, 0x65, + 0x63, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, + 0x63, 0x2e, 0x53, 0x41, 0x4d, 0x4c, 0x52, 0x04, 0x73, 0x61, 0x6d, 0x6c, 0x1a, 0x56, 0x0a, 0x05, + 0x41, 0x75, 0x74, 0x68, 0x30, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, + 0x16, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x1a, 0x40, 0x0a, 0x08, 0x57, 0x65, 0x62, 0x61, 0x75, 0x74, 0x68, 0x6e, + 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x1a, 0xda, 0x01, 0x0a, 0x04, 0x53, 0x41, 0x4d, 0x4c, 0x12, + 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x4b, 0x0a, 0x0b, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x73, + 0x70, 0x65, 0x63, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, + 0x70, 0x65, 0x63, 0x2e, 0x53, 0x41, 0x4d, 0x4c, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x52, 0x75, + 0x6c, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x52, + 0x75, 0x6c, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x52, 0x75, 0x6c, + 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0x51, 0x0a, 0x11, 0x53, 0x41, 0x4d, 0x4c, 0x41, 0x73, 0x73, 0x65, 0x72, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, + 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, + 0x69, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x04, 0x75, 0x73, 0x65, 0x64, 0x22, 0x3c, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x53, 0x70, + 0x65, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, + 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x4a, 0x04, + 0x08, 0x01, 0x10, 0x02, 0x22, 0x27, 0x0a, 0x0c, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x53, 0x70, 0x65, 0x63, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x20, 0x0a, + 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, + 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x22, + 0xe1, 0x01, 0x0a, 0x0d, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x53, 0x70, 0x65, + 0x63, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, + 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x06, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x12, 0x3a, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, + 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, + 0x65, 0x64, 0x12, 0x2b, 0x0a, 0x08, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2e, 0x49, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x08, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, + 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, + 0x6f, 0x6c, 0x65, 0x22, 0xab, 0x01, 0x0a, 0x15, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x37, 0x0a, + 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x73, + 0x70, 0x65, 0x63, 0x73, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, + 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x1a, 0x59, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x27, 0x0a, 0x0f, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0e, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x73, 0x22, 0x94, 0x01, 0x0a, 0x18, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x43, + 0x0a, 0x08, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x27, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x08, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x73, 0x1a, 0x33, 0x0a, 0x07, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x22, 0xa4, 0x02, 0x0a, 0x10, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x75, 0x73, + 0x65, 0x72, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x12, + 0x42, 0x0a, 0x0a, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2e, 0x41, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x75, 0x6c, 0x65, 0x2e, 0x4b, 0x75, 0x62, + 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x52, 0x0a, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, + 0x74, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x1a, 0x85, 0x01, 0x0a, 0x0a, 0x4b, 0x75, 0x62, 0x65, + 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x12, 0x50, 0x0a, 0x0b, 0x69, 0x6d, 0x70, 0x65, 0x72, 0x73, + 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x73, 0x70, + 0x65, 0x63, 0x73, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x52, 0x75, 0x6c, 0x65, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x2e, + 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x0b, 0x69, 0x6d, 0x70, + 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x1a, 0x25, 0x0a, 0x0b, 0x49, 0x6d, 0x70, 0x65, + 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x22, + 0x89, 0x05, 0x0a, 0x10, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x54, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2e, 0x41, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x65, 0x73, 0x74, 0x2e, + 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x39, 0x0a, 0x07, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x73, 0x70, + 0x65, 0x63, 0x73, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x54, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x07, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x3c, 0x0a, 0x08, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, + 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2e, + 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x65, 0x73, 0x74, + 0x2e, 0x45, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x08, 0x65, 0x78, 0x70, 0x65, 0x63, + 0x74, 0x65, 0x64, 0x1a, 0xfc, 0x01, 0x0a, 0x08, 0x45, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x12, 0x4b, 0x0a, 0x0a, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2e, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x65, 0x73, 0x74, 0x2e, 0x45, 0x78, + 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, + 0x73, 0x52, 0x0a, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x12, 0x12, 0x0a, + 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6c, + 0x65, 0x1a, 0x8e, 0x01, 0x0a, 0x0a, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, + 0x12, 0x59, 0x0a, 0x0b, 0x69, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2e, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x65, 0x73, 0x74, 0x2e, 0x45, + 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, + 0x65, 0x73, 0x2e, 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x0b, + 0x69, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x1a, 0x25, 0x0a, 0x0b, 0x49, + 0x6d, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x73, 0x1a, 0x97, 0x01, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x40, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x28, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x54, 0x65, 0x73, 0x74, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x2e, 0x4c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x73, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x1d, 0x0a, 0x07, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xcd, 0x03, 0x0a, 0x10, + 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x53, 0x70, 0x65, 0x63, + 0x12, 0x48, 0x0a, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2e, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x55, + 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, + 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x51, 0x0a, 0x0e, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x43, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x2d, 0x0a, + 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x73, + 0x70, 0x65, 0x63, 0x73, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x2d, 0x0a, 0x05, + 0x74, 0x65, 0x73, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x73, 0x70, + 0x65, 0x63, 0x73, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x54, 0x65, 0x73, 0x74, 0x52, 0x05, 0x74, 0x65, 0x73, 0x74, 0x73, 0x1a, 0x5b, 0x0a, 0x0f, 0x55, + 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x32, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1c, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x61, 0x0a, 0x12, 0x43, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x35, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1f, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x75, 0x0a, 0x11, 0x53, + 0x41, 0x4d, 0x4c, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x52, 0x75, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, + 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x4c, 0x61, 0x62, + 0x65, 0x6c, 0x73, 0x12, 0x3d, 0x0a, 0x1b, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x5f, 0x72, 0x6f, + 0x6c, 0x65, 0x5f, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x18, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, + 0x52, 0x6f, 0x6c, 0x65, 0x4f, 0x6e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x42, 0x32, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x73, 0x69, 0x64, 0x65, 0x72, 0x6f, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x6f, 0x6d, 0x6e, 0x69, + 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6f, 0x6d, 0x6e, 0x69, + 0x2f, 0x73, 0x70, 0x65, 0x63, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_omni_specs_auth_proto_rawDescOnce sync.Once + file_omni_specs_auth_proto_rawDescData = file_omni_specs_auth_proto_rawDesc +) + +func file_omni_specs_auth_proto_rawDescGZIP() []byte { + file_omni_specs_auth_proto_rawDescOnce.Do(func() { + file_omni_specs_auth_proto_rawDescData = protoimpl.X.CompressGZIP(file_omni_specs_auth_proto_rawDescData) + }) + return file_omni_specs_auth_proto_rawDescData +} + +var file_omni_specs_auth_proto_msgTypes = make([]protoimpl.MessageInfo, 28) +var file_omni_specs_auth_proto_goTypes = []interface{}{ + (*AuthConfigSpec)(nil), // 0: specs.AuthConfigSpec + (*SAMLAssertionSpec)(nil), // 1: specs.SAMLAssertionSpec + (*UserSpec)(nil), // 2: specs.UserSpec + (*IdentitySpec)(nil), // 3: specs.IdentitySpec + (*Identity)(nil), // 4: specs.Identity + (*PublicKeySpec)(nil), // 5: specs.PublicKeySpec + (*AccessPolicyUserGroup)(nil), // 6: specs.AccessPolicyUserGroup + (*AccessPolicyClusterGroup)(nil), // 7: specs.AccessPolicyClusterGroup + (*AccessPolicyRule)(nil), // 8: specs.AccessPolicyRule + (*AccessPolicyTest)(nil), // 9: specs.AccessPolicyTest + (*AccessPolicySpec)(nil), // 10: specs.AccessPolicySpec + (*SAMLLabelRuleSpec)(nil), // 11: specs.SAMLLabelRuleSpec + (*AuthConfigSpec_Auth0)(nil), // 12: specs.AuthConfigSpec.Auth0 + (*AuthConfigSpec_Webauthn)(nil), // 13: specs.AuthConfigSpec.Webauthn + (*AuthConfigSpec_SAML)(nil), // 14: specs.AuthConfigSpec.SAML + nil, // 15: specs.AuthConfigSpec.SAML.LabelRulesEntry + (*AccessPolicyUserGroup_User)(nil), // 16: specs.AccessPolicyUserGroup.User + (*AccessPolicyClusterGroup_Cluster)(nil), // 17: specs.AccessPolicyClusterGroup.Cluster + (*AccessPolicyRule_Kubernetes)(nil), // 18: specs.AccessPolicyRule.Kubernetes + (*AccessPolicyRule_Kubernetes_Impersonate)(nil), // 19: specs.AccessPolicyRule.Kubernetes.Impersonate + (*AccessPolicyTest_Expected)(nil), // 20: specs.AccessPolicyTest.Expected + (*AccessPolicyTest_User)(nil), // 21: specs.AccessPolicyTest.User + (*AccessPolicyTest_Cluster)(nil), // 22: specs.AccessPolicyTest.Cluster + (*AccessPolicyTest_Expected_Kubernetes)(nil), // 23: specs.AccessPolicyTest.Expected.Kubernetes + (*AccessPolicyTest_Expected_Kubernetes_Impersonate)(nil), // 24: specs.AccessPolicyTest.Expected.Kubernetes.Impersonate + nil, // 25: specs.AccessPolicyTest.User.LabelsEntry + nil, // 26: specs.AccessPolicySpec.UserGroupsEntry + nil, // 27: specs.AccessPolicySpec.ClusterGroupsEntry + (*timestamppb.Timestamp)(nil), // 28: google.protobuf.Timestamp +} +var file_omni_specs_auth_proto_depIdxs = []int32{ + 12, // 0: specs.AuthConfigSpec.auth0:type_name -> specs.AuthConfigSpec.Auth0 + 13, // 1: specs.AuthConfigSpec.webauthn:type_name -> specs.AuthConfigSpec.Webauthn + 14, // 2: specs.AuthConfigSpec.saml:type_name -> specs.AuthConfigSpec.SAML + 28, // 3: specs.PublicKeySpec.expiration:type_name -> google.protobuf.Timestamp + 4, // 4: specs.PublicKeySpec.identity:type_name -> specs.Identity + 16, // 5: specs.AccessPolicyUserGroup.users:type_name -> specs.AccessPolicyUserGroup.User + 17, // 6: specs.AccessPolicyClusterGroup.clusters:type_name -> specs.AccessPolicyClusterGroup.Cluster + 18, // 7: specs.AccessPolicyRule.kubernetes:type_name -> specs.AccessPolicyRule.Kubernetes + 21, // 8: specs.AccessPolicyTest.user:type_name -> specs.AccessPolicyTest.User + 22, // 9: specs.AccessPolicyTest.cluster:type_name -> specs.AccessPolicyTest.Cluster + 20, // 10: specs.AccessPolicyTest.expected:type_name -> specs.AccessPolicyTest.Expected + 26, // 11: specs.AccessPolicySpec.user_groups:type_name -> specs.AccessPolicySpec.UserGroupsEntry + 27, // 12: specs.AccessPolicySpec.cluster_groups:type_name -> specs.AccessPolicySpec.ClusterGroupsEntry + 8, // 13: specs.AccessPolicySpec.rules:type_name -> specs.AccessPolicyRule + 9, // 14: specs.AccessPolicySpec.tests:type_name -> specs.AccessPolicyTest + 15, // 15: specs.AuthConfigSpec.SAML.label_rules:type_name -> specs.AuthConfigSpec.SAML.LabelRulesEntry + 19, // 16: specs.AccessPolicyRule.Kubernetes.impersonate:type_name -> specs.AccessPolicyRule.Kubernetes.Impersonate + 23, // 17: specs.AccessPolicyTest.Expected.kubernetes:type_name -> specs.AccessPolicyTest.Expected.Kubernetes + 25, // 18: specs.AccessPolicyTest.User.labels:type_name -> specs.AccessPolicyTest.User.LabelsEntry + 24, // 19: specs.AccessPolicyTest.Expected.Kubernetes.impersonate:type_name -> specs.AccessPolicyTest.Expected.Kubernetes.Impersonate + 6, // 20: specs.AccessPolicySpec.UserGroupsEntry.value:type_name -> specs.AccessPolicyUserGroup + 7, // 21: specs.AccessPolicySpec.ClusterGroupsEntry.value:type_name -> specs.AccessPolicyClusterGroup + 22, // [22:22] is the sub-list for method output_type + 22, // [22:22] is the sub-list for method input_type + 22, // [22:22] is the sub-list for extension type_name + 22, // [22:22] is the sub-list for extension extendee + 0, // [0:22] is the sub-list for field type_name +} + +func init() { file_omni_specs_auth_proto_init() } +func file_omni_specs_auth_proto_init() { + if File_omni_specs_auth_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_omni_specs_auth_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AuthConfigSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_auth_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SAMLAssertionSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_auth_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UserSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_auth_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*IdentitySpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_auth_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Identity); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_auth_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PublicKeySpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_auth_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AccessPolicyUserGroup); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_auth_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AccessPolicyClusterGroup); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_auth_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AccessPolicyRule); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_auth_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AccessPolicyTest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_auth_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AccessPolicySpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_auth_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SAMLLabelRuleSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_auth_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AuthConfigSpec_Auth0); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_auth_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AuthConfigSpec_Webauthn); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_auth_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AuthConfigSpec_SAML); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_auth_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AccessPolicyUserGroup_User); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_auth_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AccessPolicyClusterGroup_Cluster); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_auth_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AccessPolicyRule_Kubernetes); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_auth_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AccessPolicyRule_Kubernetes_Impersonate); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_auth_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AccessPolicyTest_Expected); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_auth_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AccessPolicyTest_User); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_auth_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AccessPolicyTest_Cluster); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_auth_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AccessPolicyTest_Expected_Kubernetes); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_auth_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AccessPolicyTest_Expected_Kubernetes_Impersonate); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_omni_specs_auth_proto_rawDesc, + NumEnums: 0, + NumMessages: 28, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_omni_specs_auth_proto_goTypes, + DependencyIndexes: file_omni_specs_auth_proto_depIdxs, + MessageInfos: file_omni_specs_auth_proto_msgTypes, + }.Build() + File_omni_specs_auth_proto = out.File + file_omni_specs_auth_proto_rawDesc = nil + file_omni_specs_auth_proto_goTypes = nil + file_omni_specs_auth_proto_depIdxs = nil +} diff --git a/client/api/omni/specs/auth.proto b/client/api/omni/specs/auth.proto new file mode 100644 index 00000000..1a762641 --- /dev/null +++ b/client/api/omni/specs/auth.proto @@ -0,0 +1,165 @@ +syntax = "proto3"; +package specs; + +option go_package = "github.com/siderolabs/omni/client/api/omni/specs"; + +import "talos/machine/machine.proto"; +import "google/protobuf/timestamp.proto"; + +// AuthConfigSpec describes the authentication configuration. +message AuthConfigSpec { + message Auth0 { + bool enabled = 1; + string domain = 2; + string client_id = 3; + } + + message Webauthn { + bool enabled = 1; + bool required = 2; + } + + message SAML { + bool enabled = 1; + string url = 2; + string metadata = 3; + // LabelRules defines custom rules on how to extract SAML attributes from the + // saml assertion and turn them into labels. + map<string, string> label_rules = 4; + } + + Auth0 auth0 = 1; + Webauthn webauthn = 2; + bool suspended = 3; + SAML saml = 4; +} + +// SAMLAssertionSpec describes SAML assertion. +message SAMLAssertionSpec { + // Data keeps JSON encoded SAML assertion. + bytes data = 1; + + // Email is the identity that was read from the assertion. + string email = 2; + + // Used marks SAML assertion as used. + bool used = 3; +} + +// UserSpec describes a user. +message UserSpec { + reserved 1; + // Scopes are deprecated, use roles instead. + // + // Deprecated: will be removed once all environments are migrated to use roles. + // TODO: remove after all environments are migrated to use roles. + repeated string scopes = 2; + string role = 3; +} + +// IdentitySpec describes a user identity. +message IdentitySpec { + string user_id = 1; +} + +message Identity { + string email = 1; +} + +// PublicKeySpec describes a user or service account public key. +message PublicKeySpec { + bytes public_key = 1; + // Scopes are deprecated, use roles instead. + // + // Deprecated: will be removed once all environments are migrated to use roles. + // TODO: remove after all environments are migrated to use roles. + repeated string scopes = 2; + google.protobuf.Timestamp expiration = 3; + bool confirmed = 4; + Identity identity = 5; + string role = 6; +} + +// AccessPolicyUserGroup describes a user group in the ACLs context. +message AccessPolicyUserGroup { + message User { + string name = 1; + string match = 2; + repeated string label_selectors = 3; + } + + repeated User users = 1; +} + +// AccessPolicyClusterGroup describes a cluster group in the ACLs context. +message AccessPolicyClusterGroup { + message Cluster { + string name = 1; + string match = 2; + } + + repeated Cluster clusters = 1; +} + +// AccessPolicyRule describes a rule in the ACLs context. +message AccessPolicyRule { + message Kubernetes { + message Impersonate { + repeated string groups = 1; + } + + Impersonate impersonate = 1; + } + + repeated string users = 1; + repeated string clusters = 2; + Kubernetes kubernetes = 3; + string role = 4; +} + +message AccessPolicyTest { + message Expected { + message Kubernetes { + message Impersonate { + repeated string groups = 1; + } + + Impersonate impersonate = 1; + } + + Kubernetes kubernetes = 1; + string role = 2; + } + + message User { + string name = 1; + map<string, string> labels = 2; + } + + message Cluster { + string name = 1; + } + + string name = 1; + User user = 2; + Cluster cluster = 3; + Expected expected = 4; +} + +// AccessPolicySpec describes the access policy configuration. +message AccessPolicySpec { + map<string, AccessPolicyUserGroup> user_groups = 1; + map<string, AccessPolicyClusterGroup> cluster_groups = 2; + repeated AccessPolicyRule rules = 3; + repeated AccessPolicyTest tests = 4; +} + +// SAMLLabelRuleSpec describes a rule on how to map Identity labels to Omni roles. +// +message SAMLLabelRuleSpec { + // MatchLabels is the list of labels to match the user's Identity against this rule. + repeated string match_labels = 1; + + // AssignRoleOnRegistration is the role to be assigned to the user if this rule matches. + string assign_role_on_registration = 2; +} diff --git a/client/api/omni/specs/auth_vtproto.pb.go b/client/api/omni/specs/auth_vtproto.pb.go new file mode 100644 index 00000000..760c0107 --- /dev/null +++ b/client/api/omni/specs/auth_vtproto.pb.go @@ -0,0 +1,6474 @@ +// Code generated by protoc-gen-go-vtproto. DO NOT EDIT. +// protoc-gen-go-vtproto version: v0.6.0 +// source: omni/specs/auth.proto + +package specs + +import ( + fmt "fmt" + io "io" + + protohelpers "github.com/planetscale/vtprotobuf/protohelpers" + timestamppb1 "github.com/planetscale/vtprotobuf/types/known/timestamppb" + proto "google.golang.org/protobuf/proto" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +func (m *AuthConfigSpec_Auth0) CloneVT() *AuthConfigSpec_Auth0 { + if m == nil { + return (*AuthConfigSpec_Auth0)(nil) + } + r := new(AuthConfigSpec_Auth0) + r.Enabled = m.Enabled + r.Domain = m.Domain + r.ClientId = m.ClientId + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *AuthConfigSpec_Auth0) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *AuthConfigSpec_Webauthn) CloneVT() *AuthConfigSpec_Webauthn { + if m == nil { + return (*AuthConfigSpec_Webauthn)(nil) + } + r := new(AuthConfigSpec_Webauthn) + r.Enabled = m.Enabled + r.Required = m.Required + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *AuthConfigSpec_Webauthn) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *AuthConfigSpec_SAML) CloneVT() *AuthConfigSpec_SAML { + if m == nil { + return (*AuthConfigSpec_SAML)(nil) + } + r := new(AuthConfigSpec_SAML) + r.Enabled = m.Enabled + r.Url = m.Url + r.Metadata = m.Metadata + if rhs := m.LabelRules; rhs != nil { + tmpContainer := make(map[string]string, len(rhs)) + for k, v := range rhs { + tmpContainer[k] = v + } + r.LabelRules = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *AuthConfigSpec_SAML) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *AuthConfigSpec) CloneVT() *AuthConfigSpec { + if m == nil { + return (*AuthConfigSpec)(nil) + } + r := new(AuthConfigSpec) + r.Auth0 = m.Auth0.CloneVT() + r.Webauthn = m.Webauthn.CloneVT() + r.Suspended = m.Suspended + r.Saml = m.Saml.CloneVT() + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *AuthConfigSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *SAMLAssertionSpec) CloneVT() *SAMLAssertionSpec { + if m == nil { + return (*SAMLAssertionSpec)(nil) + } + r := new(SAMLAssertionSpec) + r.Email = m.Email + r.Used = m.Used + if rhs := m.Data; rhs != nil { + tmpBytes := make([]byte, len(rhs)) + copy(tmpBytes, rhs) + r.Data = tmpBytes + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *SAMLAssertionSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *UserSpec) CloneVT() *UserSpec { + if m == nil { + return (*UserSpec)(nil) + } + r := new(UserSpec) + r.Role = m.Role + if rhs := m.Scopes; rhs != nil { + tmpContainer := make([]string, len(rhs)) + copy(tmpContainer, rhs) + r.Scopes = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *UserSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *IdentitySpec) CloneVT() *IdentitySpec { + if m == nil { + return (*IdentitySpec)(nil) + } + r := new(IdentitySpec) + r.UserId = m.UserId + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *IdentitySpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *Identity) CloneVT() *Identity { + if m == nil { + return (*Identity)(nil) + } + r := new(Identity) + r.Email = m.Email + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *Identity) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *PublicKeySpec) CloneVT() *PublicKeySpec { + if m == nil { + return (*PublicKeySpec)(nil) + } + r := new(PublicKeySpec) + r.Expiration = (*timestamppb.Timestamp)((*timestamppb1.Timestamp)(m.Expiration).CloneVT()) + r.Confirmed = m.Confirmed + r.Identity = m.Identity.CloneVT() + r.Role = m.Role + if rhs := m.PublicKey; rhs != nil { + tmpBytes := make([]byte, len(rhs)) + copy(tmpBytes, rhs) + r.PublicKey = tmpBytes + } + if rhs := m.Scopes; rhs != nil { + tmpContainer := make([]string, len(rhs)) + copy(tmpContainer, rhs) + r.Scopes = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *PublicKeySpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *AccessPolicyUserGroup_User) CloneVT() *AccessPolicyUserGroup_User { + if m == nil { + return (*AccessPolicyUserGroup_User)(nil) + } + r := new(AccessPolicyUserGroup_User) + r.Name = m.Name + r.Match = m.Match + if rhs := m.LabelSelectors; rhs != nil { + tmpContainer := make([]string, len(rhs)) + copy(tmpContainer, rhs) + r.LabelSelectors = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *AccessPolicyUserGroup_User) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *AccessPolicyUserGroup) CloneVT() *AccessPolicyUserGroup { + if m == nil { + return (*AccessPolicyUserGroup)(nil) + } + r := new(AccessPolicyUserGroup) + if rhs := m.Users; rhs != nil { + tmpContainer := make([]*AccessPolicyUserGroup_User, len(rhs)) + for k, v := range rhs { + tmpContainer[k] = v.CloneVT() + } + r.Users = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *AccessPolicyUserGroup) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *AccessPolicyClusterGroup_Cluster) CloneVT() *AccessPolicyClusterGroup_Cluster { + if m == nil { + return (*AccessPolicyClusterGroup_Cluster)(nil) + } + r := new(AccessPolicyClusterGroup_Cluster) + r.Name = m.Name + r.Match = m.Match + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *AccessPolicyClusterGroup_Cluster) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *AccessPolicyClusterGroup) CloneVT() *AccessPolicyClusterGroup { + if m == nil { + return (*AccessPolicyClusterGroup)(nil) + } + r := new(AccessPolicyClusterGroup) + if rhs := m.Clusters; rhs != nil { + tmpContainer := make([]*AccessPolicyClusterGroup_Cluster, len(rhs)) + for k, v := range rhs { + tmpContainer[k] = v.CloneVT() + } + r.Clusters = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *AccessPolicyClusterGroup) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *AccessPolicyRule_Kubernetes_Impersonate) CloneVT() *AccessPolicyRule_Kubernetes_Impersonate { + if m == nil { + return (*AccessPolicyRule_Kubernetes_Impersonate)(nil) + } + r := new(AccessPolicyRule_Kubernetes_Impersonate) + if rhs := m.Groups; rhs != nil { + tmpContainer := make([]string, len(rhs)) + copy(tmpContainer, rhs) + r.Groups = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *AccessPolicyRule_Kubernetes_Impersonate) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *AccessPolicyRule_Kubernetes) CloneVT() *AccessPolicyRule_Kubernetes { + if m == nil { + return (*AccessPolicyRule_Kubernetes)(nil) + } + r := new(AccessPolicyRule_Kubernetes) + r.Impersonate = m.Impersonate.CloneVT() + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *AccessPolicyRule_Kubernetes) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *AccessPolicyRule) CloneVT() *AccessPolicyRule { + if m == nil { + return (*AccessPolicyRule)(nil) + } + r := new(AccessPolicyRule) + r.Kubernetes = m.Kubernetes.CloneVT() + r.Role = m.Role + if rhs := m.Users; rhs != nil { + tmpContainer := make([]string, len(rhs)) + copy(tmpContainer, rhs) + r.Users = tmpContainer + } + if rhs := m.Clusters; rhs != nil { + tmpContainer := make([]string, len(rhs)) + copy(tmpContainer, rhs) + r.Clusters = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *AccessPolicyRule) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *AccessPolicyTest_Expected_Kubernetes_Impersonate) CloneVT() *AccessPolicyTest_Expected_Kubernetes_Impersonate { + if m == nil { + return (*AccessPolicyTest_Expected_Kubernetes_Impersonate)(nil) + } + r := new(AccessPolicyTest_Expected_Kubernetes_Impersonate) + if rhs := m.Groups; rhs != nil { + tmpContainer := make([]string, len(rhs)) + copy(tmpContainer, rhs) + r.Groups = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *AccessPolicyTest_Expected_Kubernetes_Impersonate) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *AccessPolicyTest_Expected_Kubernetes) CloneVT() *AccessPolicyTest_Expected_Kubernetes { + if m == nil { + return (*AccessPolicyTest_Expected_Kubernetes)(nil) + } + r := new(AccessPolicyTest_Expected_Kubernetes) + r.Impersonate = m.Impersonate.CloneVT() + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *AccessPolicyTest_Expected_Kubernetes) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *AccessPolicyTest_Expected) CloneVT() *AccessPolicyTest_Expected { + if m == nil { + return (*AccessPolicyTest_Expected)(nil) + } + r := new(AccessPolicyTest_Expected) + r.Kubernetes = m.Kubernetes.CloneVT() + r.Role = m.Role + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *AccessPolicyTest_Expected) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *AccessPolicyTest_User) CloneVT() *AccessPolicyTest_User { + if m == nil { + return (*AccessPolicyTest_User)(nil) + } + r := new(AccessPolicyTest_User) + r.Name = m.Name + if rhs := m.Labels; rhs != nil { + tmpContainer := make(map[string]string, len(rhs)) + for k, v := range rhs { + tmpContainer[k] = v + } + r.Labels = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *AccessPolicyTest_User) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *AccessPolicyTest_Cluster) CloneVT() *AccessPolicyTest_Cluster { + if m == nil { + return (*AccessPolicyTest_Cluster)(nil) + } + r := new(AccessPolicyTest_Cluster) + r.Name = m.Name + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *AccessPolicyTest_Cluster) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *AccessPolicyTest) CloneVT() *AccessPolicyTest { + if m == nil { + return (*AccessPolicyTest)(nil) + } + r := new(AccessPolicyTest) + r.Name = m.Name + r.User = m.User.CloneVT() + r.Cluster = m.Cluster.CloneVT() + r.Expected = m.Expected.CloneVT() + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *AccessPolicyTest) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *AccessPolicySpec) CloneVT() *AccessPolicySpec { + if m == nil { + return (*AccessPolicySpec)(nil) + } + r := new(AccessPolicySpec) + if rhs := m.UserGroups; rhs != nil { + tmpContainer := make(map[string]*AccessPolicyUserGroup, len(rhs)) + for k, v := range rhs { + tmpContainer[k] = v.CloneVT() + } + r.UserGroups = tmpContainer + } + if rhs := m.ClusterGroups; rhs != nil { + tmpContainer := make(map[string]*AccessPolicyClusterGroup, len(rhs)) + for k, v := range rhs { + tmpContainer[k] = v.CloneVT() + } + r.ClusterGroups = tmpContainer + } + if rhs := m.Rules; rhs != nil { + tmpContainer := make([]*AccessPolicyRule, len(rhs)) + for k, v := range rhs { + tmpContainer[k] = v.CloneVT() + } + r.Rules = tmpContainer + } + if rhs := m.Tests; rhs != nil { + tmpContainer := make([]*AccessPolicyTest, len(rhs)) + for k, v := range rhs { + tmpContainer[k] = v.CloneVT() + } + r.Tests = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *AccessPolicySpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *SAMLLabelRuleSpec) CloneVT() *SAMLLabelRuleSpec { + if m == nil { + return (*SAMLLabelRuleSpec)(nil) + } + r := new(SAMLLabelRuleSpec) + r.AssignRoleOnRegistration = m.AssignRoleOnRegistration + if rhs := m.MatchLabels; rhs != nil { + tmpContainer := make([]string, len(rhs)) + copy(tmpContainer, rhs) + r.MatchLabels = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *SAMLLabelRuleSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (this *AuthConfigSpec_Auth0) EqualVT(that *AuthConfigSpec_Auth0) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Enabled != that.Enabled { + return false + } + if this.Domain != that.Domain { + return false + } + if this.ClientId != that.ClientId { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *AuthConfigSpec_Auth0) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*AuthConfigSpec_Auth0) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *AuthConfigSpec_Webauthn) EqualVT(that *AuthConfigSpec_Webauthn) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Enabled != that.Enabled { + return false + } + if this.Required != that.Required { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *AuthConfigSpec_Webauthn) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*AuthConfigSpec_Webauthn) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *AuthConfigSpec_SAML) EqualVT(that *AuthConfigSpec_SAML) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Enabled != that.Enabled { + return false + } + if this.Url != that.Url { + return false + } + if this.Metadata != that.Metadata { + return false + } + if len(this.LabelRules) != len(that.LabelRules) { + return false + } + for i, vx := range this.LabelRules { + vy, ok := that.LabelRules[i] + if !ok { + return false + } + if vx != vy { + return false + } + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *AuthConfigSpec_SAML) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*AuthConfigSpec_SAML) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *AuthConfigSpec) EqualVT(that *AuthConfigSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if !this.Auth0.EqualVT(that.Auth0) { + return false + } + if !this.Webauthn.EqualVT(that.Webauthn) { + return false + } + if this.Suspended != that.Suspended { + return false + } + if !this.Saml.EqualVT(that.Saml) { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *AuthConfigSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*AuthConfigSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *SAMLAssertionSpec) EqualVT(that *SAMLAssertionSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if string(this.Data) != string(that.Data) { + return false + } + if this.Email != that.Email { + return false + } + if this.Used != that.Used { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *SAMLAssertionSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*SAMLAssertionSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *UserSpec) EqualVT(that *UserSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if len(this.Scopes) != len(that.Scopes) { + return false + } + for i, vx := range this.Scopes { + vy := that.Scopes[i] + if vx != vy { + return false + } + } + if this.Role != that.Role { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *UserSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*UserSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *IdentitySpec) EqualVT(that *IdentitySpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.UserId != that.UserId { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *IdentitySpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*IdentitySpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *Identity) EqualVT(that *Identity) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Email != that.Email { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *Identity) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*Identity) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *PublicKeySpec) EqualVT(that *PublicKeySpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if string(this.PublicKey) != string(that.PublicKey) { + return false + } + if len(this.Scopes) != len(that.Scopes) { + return false + } + for i, vx := range this.Scopes { + vy := that.Scopes[i] + if vx != vy { + return false + } + } + if !(*timestamppb1.Timestamp)(this.Expiration).EqualVT((*timestamppb1.Timestamp)(that.Expiration)) { + return false + } + if this.Confirmed != that.Confirmed { + return false + } + if !this.Identity.EqualVT(that.Identity) { + return false + } + if this.Role != that.Role { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *PublicKeySpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*PublicKeySpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *AccessPolicyUserGroup_User) EqualVT(that *AccessPolicyUserGroup_User) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Name != that.Name { + return false + } + if this.Match != that.Match { + return false + } + if len(this.LabelSelectors) != len(that.LabelSelectors) { + return false + } + for i, vx := range this.LabelSelectors { + vy := that.LabelSelectors[i] + if vx != vy { + return false + } + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *AccessPolicyUserGroup_User) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*AccessPolicyUserGroup_User) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *AccessPolicyUserGroup) EqualVT(that *AccessPolicyUserGroup) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if len(this.Users) != len(that.Users) { + return false + } + for i, vx := range this.Users { + vy := that.Users[i] + if p, q := vx, vy; p != q { + if p == nil { + p = &AccessPolicyUserGroup_User{} + } + if q == nil { + q = &AccessPolicyUserGroup_User{} + } + if !p.EqualVT(q) { + return false + } + } + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *AccessPolicyUserGroup) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*AccessPolicyUserGroup) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *AccessPolicyClusterGroup_Cluster) EqualVT(that *AccessPolicyClusterGroup_Cluster) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Name != that.Name { + return false + } + if this.Match != that.Match { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *AccessPolicyClusterGroup_Cluster) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*AccessPolicyClusterGroup_Cluster) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *AccessPolicyClusterGroup) EqualVT(that *AccessPolicyClusterGroup) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if len(this.Clusters) != len(that.Clusters) { + return false + } + for i, vx := range this.Clusters { + vy := that.Clusters[i] + if p, q := vx, vy; p != q { + if p == nil { + p = &AccessPolicyClusterGroup_Cluster{} + } + if q == nil { + q = &AccessPolicyClusterGroup_Cluster{} + } + if !p.EqualVT(q) { + return false + } + } + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *AccessPolicyClusterGroup) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*AccessPolicyClusterGroup) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *AccessPolicyRule_Kubernetes_Impersonate) EqualVT(that *AccessPolicyRule_Kubernetes_Impersonate) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if len(this.Groups) != len(that.Groups) { + return false + } + for i, vx := range this.Groups { + vy := that.Groups[i] + if vx != vy { + return false + } + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *AccessPolicyRule_Kubernetes_Impersonate) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*AccessPolicyRule_Kubernetes_Impersonate) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *AccessPolicyRule_Kubernetes) EqualVT(that *AccessPolicyRule_Kubernetes) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if !this.Impersonate.EqualVT(that.Impersonate) { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *AccessPolicyRule_Kubernetes) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*AccessPolicyRule_Kubernetes) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *AccessPolicyRule) EqualVT(that *AccessPolicyRule) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if len(this.Users) != len(that.Users) { + return false + } + for i, vx := range this.Users { + vy := that.Users[i] + if vx != vy { + return false + } + } + if len(this.Clusters) != len(that.Clusters) { + return false + } + for i, vx := range this.Clusters { + vy := that.Clusters[i] + if vx != vy { + return false + } + } + if !this.Kubernetes.EqualVT(that.Kubernetes) { + return false + } + if this.Role != that.Role { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *AccessPolicyRule) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*AccessPolicyRule) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *AccessPolicyTest_Expected_Kubernetes_Impersonate) EqualVT(that *AccessPolicyTest_Expected_Kubernetes_Impersonate) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if len(this.Groups) != len(that.Groups) { + return false + } + for i, vx := range this.Groups { + vy := that.Groups[i] + if vx != vy { + return false + } + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *AccessPolicyTest_Expected_Kubernetes_Impersonate) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*AccessPolicyTest_Expected_Kubernetes_Impersonate) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *AccessPolicyTest_Expected_Kubernetes) EqualVT(that *AccessPolicyTest_Expected_Kubernetes) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if !this.Impersonate.EqualVT(that.Impersonate) { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *AccessPolicyTest_Expected_Kubernetes) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*AccessPolicyTest_Expected_Kubernetes) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *AccessPolicyTest_Expected) EqualVT(that *AccessPolicyTest_Expected) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if !this.Kubernetes.EqualVT(that.Kubernetes) { + return false + } + if this.Role != that.Role { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *AccessPolicyTest_Expected) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*AccessPolicyTest_Expected) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *AccessPolicyTest_User) EqualVT(that *AccessPolicyTest_User) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Name != that.Name { + return false + } + if len(this.Labels) != len(that.Labels) { + return false + } + for i, vx := range this.Labels { + vy, ok := that.Labels[i] + if !ok { + return false + } + if vx != vy { + return false + } + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *AccessPolicyTest_User) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*AccessPolicyTest_User) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *AccessPolicyTest_Cluster) EqualVT(that *AccessPolicyTest_Cluster) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Name != that.Name { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *AccessPolicyTest_Cluster) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*AccessPolicyTest_Cluster) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *AccessPolicyTest) EqualVT(that *AccessPolicyTest) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Name != that.Name { + return false + } + if !this.User.EqualVT(that.User) { + return false + } + if !this.Cluster.EqualVT(that.Cluster) { + return false + } + if !this.Expected.EqualVT(that.Expected) { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *AccessPolicyTest) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*AccessPolicyTest) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *AccessPolicySpec) EqualVT(that *AccessPolicySpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if len(this.UserGroups) != len(that.UserGroups) { + return false + } + for i, vx := range this.UserGroups { + vy, ok := that.UserGroups[i] + if !ok { + return false + } + if p, q := vx, vy; p != q { + if p == nil { + p = &AccessPolicyUserGroup{} + } + if q == nil { + q = &AccessPolicyUserGroup{} + } + if !p.EqualVT(q) { + return false + } + } + } + if len(this.ClusterGroups) != len(that.ClusterGroups) { + return false + } + for i, vx := range this.ClusterGroups { + vy, ok := that.ClusterGroups[i] + if !ok { + return false + } + if p, q := vx, vy; p != q { + if p == nil { + p = &AccessPolicyClusterGroup{} + } + if q == nil { + q = &AccessPolicyClusterGroup{} + } + if !p.EqualVT(q) { + return false + } + } + } + if len(this.Rules) != len(that.Rules) { + return false + } + for i, vx := range this.Rules { + vy := that.Rules[i] + if p, q := vx, vy; p != q { + if p == nil { + p = &AccessPolicyRule{} + } + if q == nil { + q = &AccessPolicyRule{} + } + if !p.EqualVT(q) { + return false + } + } + } + if len(this.Tests) != len(that.Tests) { + return false + } + for i, vx := range this.Tests { + vy := that.Tests[i] + if p, q := vx, vy; p != q { + if p == nil { + p = &AccessPolicyTest{} + } + if q == nil { + q = &AccessPolicyTest{} + } + if !p.EqualVT(q) { + return false + } + } + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *AccessPolicySpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*AccessPolicySpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *SAMLLabelRuleSpec) EqualVT(that *SAMLLabelRuleSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if len(this.MatchLabels) != len(that.MatchLabels) { + return false + } + for i, vx := range this.MatchLabels { + vy := that.MatchLabels[i] + if vx != vy { + return false + } + } + if this.AssignRoleOnRegistration != that.AssignRoleOnRegistration { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *SAMLLabelRuleSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*SAMLLabelRuleSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (m *AuthConfigSpec_Auth0) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AuthConfigSpec_Auth0) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *AuthConfigSpec_Auth0) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.ClientId) > 0 { + i -= len(m.ClientId) + copy(dAtA[i:], m.ClientId) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClientId))) + i-- + dAtA[i] = 0x1a + } + if len(m.Domain) > 0 { + i -= len(m.Domain) + copy(dAtA[i:], m.Domain) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Domain))) + i-- + dAtA[i] = 0x12 + } + if m.Enabled { + i-- + if m.Enabled { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *AuthConfigSpec_Webauthn) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AuthConfigSpec_Webauthn) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *AuthConfigSpec_Webauthn) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.Required { + i-- + if m.Required { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x10 + } + if m.Enabled { + i-- + if m.Enabled { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *AuthConfigSpec_SAML) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AuthConfigSpec_SAML) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *AuthConfigSpec_SAML) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.LabelRules) > 0 { + for k := range m.LabelRules { + v := m.LabelRules[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x22 + } + } + if len(m.Metadata) > 0 { + i -= len(m.Metadata) + copy(dAtA[i:], m.Metadata) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Metadata))) + i-- + dAtA[i] = 0x1a + } + if len(m.Url) > 0 { + i -= len(m.Url) + copy(dAtA[i:], m.Url) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Url))) + i-- + dAtA[i] = 0x12 + } + if m.Enabled { + i-- + if m.Enabled { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *AuthConfigSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AuthConfigSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *AuthConfigSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.Saml != nil { + size, err := m.Saml.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x22 + } + if m.Suspended { + i-- + if m.Suspended { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x18 + } + if m.Webauthn != nil { + size, err := m.Webauthn.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x12 + } + if m.Auth0 != nil { + size, err := m.Auth0.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *SAMLAssertionSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SAMLAssertionSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *SAMLAssertionSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.Used { + i-- + if m.Used { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x18 + } + if len(m.Email) > 0 { + i -= len(m.Email) + copy(dAtA[i:], m.Email) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Email))) + i-- + dAtA[i] = 0x12 + } + if len(m.Data) > 0 { + i -= len(m.Data) + copy(dAtA[i:], m.Data) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Data))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *UserSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *UserSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *UserSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Role) > 0 { + i -= len(m.Role) + copy(dAtA[i:], m.Role) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Role))) + i-- + dAtA[i] = 0x1a + } + if len(m.Scopes) > 0 { + for iNdEx := len(m.Scopes) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Scopes[iNdEx]) + copy(dAtA[i:], m.Scopes[iNdEx]) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Scopes[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + return len(dAtA) - i, nil +} + +func (m *IdentitySpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *IdentitySpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *IdentitySpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.UserId) > 0 { + i -= len(m.UserId) + copy(dAtA[i:], m.UserId) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.UserId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *Identity) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Identity) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *Identity) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Email) > 0 { + i -= len(m.Email) + copy(dAtA[i:], m.Email) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Email))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *PublicKeySpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PublicKeySpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *PublicKeySpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Role) > 0 { + i -= len(m.Role) + copy(dAtA[i:], m.Role) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Role))) + i-- + dAtA[i] = 0x32 + } + if m.Identity != nil { + size, err := m.Identity.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x2a + } + if m.Confirmed { + i-- + if m.Confirmed { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x20 + } + if m.Expiration != nil { + size, err := (*timestamppb1.Timestamp)(m.Expiration).MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x1a + } + if len(m.Scopes) > 0 { + for iNdEx := len(m.Scopes) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Scopes[iNdEx]) + copy(dAtA[i:], m.Scopes[iNdEx]) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Scopes[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + if len(m.PublicKey) > 0 { + i -= len(m.PublicKey) + copy(dAtA[i:], m.PublicKey) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.PublicKey))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *AccessPolicyUserGroup_User) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AccessPolicyUserGroup_User) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *AccessPolicyUserGroup_User) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.LabelSelectors) > 0 { + for iNdEx := len(m.LabelSelectors) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.LabelSelectors[iNdEx]) + copy(dAtA[i:], m.LabelSelectors[iNdEx]) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.LabelSelectors[iNdEx]))) + i-- + dAtA[i] = 0x1a + } + } + if len(m.Match) > 0 { + i -= len(m.Match) + copy(dAtA[i:], m.Match) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Match))) + i-- + dAtA[i] = 0x12 + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *AccessPolicyUserGroup) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AccessPolicyUserGroup) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *AccessPolicyUserGroup) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Users) > 0 { + for iNdEx := len(m.Users) - 1; iNdEx >= 0; iNdEx-- { + size, err := m.Users[iNdEx].MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *AccessPolicyClusterGroup_Cluster) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AccessPolicyClusterGroup_Cluster) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *AccessPolicyClusterGroup_Cluster) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Match) > 0 { + i -= len(m.Match) + copy(dAtA[i:], m.Match) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Match))) + i-- + dAtA[i] = 0x12 + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *AccessPolicyClusterGroup) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AccessPolicyClusterGroup) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *AccessPolicyClusterGroup) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Clusters) > 0 { + for iNdEx := len(m.Clusters) - 1; iNdEx >= 0; iNdEx-- { + size, err := m.Clusters[iNdEx].MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *AccessPolicyRule_Kubernetes_Impersonate) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AccessPolicyRule_Kubernetes_Impersonate) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *AccessPolicyRule_Kubernetes_Impersonate) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Groups) > 0 { + for iNdEx := len(m.Groups) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Groups[iNdEx]) + copy(dAtA[i:], m.Groups[iNdEx]) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Groups[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *AccessPolicyRule_Kubernetes) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AccessPolicyRule_Kubernetes) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *AccessPolicyRule_Kubernetes) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.Impersonate != nil { + size, err := m.Impersonate.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *AccessPolicyRule) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AccessPolicyRule) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *AccessPolicyRule) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Role) > 0 { + i -= len(m.Role) + copy(dAtA[i:], m.Role) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Role))) + i-- + dAtA[i] = 0x22 + } + if m.Kubernetes != nil { + size, err := m.Kubernetes.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x1a + } + if len(m.Clusters) > 0 { + for iNdEx := len(m.Clusters) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Clusters[iNdEx]) + copy(dAtA[i:], m.Clusters[iNdEx]) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Clusters[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + if len(m.Users) > 0 { + for iNdEx := len(m.Users) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Users[iNdEx]) + copy(dAtA[i:], m.Users[iNdEx]) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Users[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *AccessPolicyTest_Expected_Kubernetes_Impersonate) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AccessPolicyTest_Expected_Kubernetes_Impersonate) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *AccessPolicyTest_Expected_Kubernetes_Impersonate) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Groups) > 0 { + for iNdEx := len(m.Groups) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Groups[iNdEx]) + copy(dAtA[i:], m.Groups[iNdEx]) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Groups[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *AccessPolicyTest_Expected_Kubernetes) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AccessPolicyTest_Expected_Kubernetes) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *AccessPolicyTest_Expected_Kubernetes) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.Impersonate != nil { + size, err := m.Impersonate.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *AccessPolicyTest_Expected) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AccessPolicyTest_Expected) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *AccessPolicyTest_Expected) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Role) > 0 { + i -= len(m.Role) + copy(dAtA[i:], m.Role) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Role))) + i-- + dAtA[i] = 0x12 + } + if m.Kubernetes != nil { + size, err := m.Kubernetes.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *AccessPolicyTest_User) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AccessPolicyTest_User) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *AccessPolicyTest_User) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Labels) > 0 { + for k := range m.Labels { + v := m.Labels[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x12 + } + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *AccessPolicyTest_Cluster) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AccessPolicyTest_Cluster) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *AccessPolicyTest_Cluster) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *AccessPolicyTest) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AccessPolicyTest) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *AccessPolicyTest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.Expected != nil { + size, err := m.Expected.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x22 + } + if m.Cluster != nil { + size, err := m.Cluster.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x1a + } + if m.User != nil { + size, err := m.User.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x12 + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *AccessPolicySpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AccessPolicySpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *AccessPolicySpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Tests) > 0 { + for iNdEx := len(m.Tests) - 1; iNdEx >= 0; iNdEx-- { + size, err := m.Tests[iNdEx].MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x22 + } + } + if len(m.Rules) > 0 { + for iNdEx := len(m.Rules) - 1; iNdEx >= 0; iNdEx-- { + size, err := m.Rules[iNdEx].MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x1a + } + } + if len(m.ClusterGroups) > 0 { + for k := range m.ClusterGroups { + v := m.ClusterGroups[k] + baseI := i + size, err := v.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x12 + } + } + if len(m.UserGroups) > 0 { + for k := range m.UserGroups { + v := m.UserGroups[k] + baseI := i + size, err := v.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *SAMLLabelRuleSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SAMLLabelRuleSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *SAMLLabelRuleSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.AssignRoleOnRegistration) > 0 { + i -= len(m.AssignRoleOnRegistration) + copy(dAtA[i:], m.AssignRoleOnRegistration) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.AssignRoleOnRegistration))) + i-- + dAtA[i] = 0x12 + } + if len(m.MatchLabels) > 0 { + for iNdEx := len(m.MatchLabels) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.MatchLabels[iNdEx]) + copy(dAtA[i:], m.MatchLabels[iNdEx]) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.MatchLabels[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *AuthConfigSpec_Auth0) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Enabled { + n += 2 + } + l = len(m.Domain) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.ClientId) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *AuthConfigSpec_Webauthn) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Enabled { + n += 2 + } + if m.Required { + n += 2 + } + n += len(m.unknownFields) + return n +} + +func (m *AuthConfigSpec_SAML) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Enabled { + n += 2 + } + l = len(m.Url) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Metadata) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if len(m.LabelRules) > 0 { + for k, v := range m.LabelRules { + _ = k + _ = v + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + 1 + len(v) + protohelpers.SizeOfVarint(uint64(len(v))) + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) + } + } + n += len(m.unknownFields) + return n +} + +func (m *AuthConfigSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Auth0 != nil { + l = m.Auth0.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.Webauthn != nil { + l = m.Webauthn.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.Suspended { + n += 2 + } + if m.Saml != nil { + l = m.Saml.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *SAMLAssertionSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Data) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Email) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.Used { + n += 2 + } + n += len(m.unknownFields) + return n +} + +func (m *UserSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Scopes) > 0 { + for _, s := range m.Scopes { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + l = len(m.Role) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *IdentitySpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.UserId) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *Identity) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Email) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *PublicKeySpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.PublicKey) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if len(m.Scopes) > 0 { + for _, s := range m.Scopes { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + if m.Expiration != nil { + l = (*timestamppb1.Timestamp)(m.Expiration).SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.Confirmed { + n += 2 + } + if m.Identity != nil { + l = m.Identity.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Role) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *AccessPolicyUserGroup_User) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Match) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if len(m.LabelSelectors) > 0 { + for _, s := range m.LabelSelectors { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + n += len(m.unknownFields) + return n +} + +func (m *AccessPolicyUserGroup) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Users) > 0 { + for _, e := range m.Users { + l = e.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + n += len(m.unknownFields) + return n +} + +func (m *AccessPolicyClusterGroup_Cluster) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Match) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *AccessPolicyClusterGroup) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Clusters) > 0 { + for _, e := range m.Clusters { + l = e.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + n += len(m.unknownFields) + return n +} + +func (m *AccessPolicyRule_Kubernetes_Impersonate) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Groups) > 0 { + for _, s := range m.Groups { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + n += len(m.unknownFields) + return n +} + +func (m *AccessPolicyRule_Kubernetes) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Impersonate != nil { + l = m.Impersonate.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *AccessPolicyRule) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Users) > 0 { + for _, s := range m.Users { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + if len(m.Clusters) > 0 { + for _, s := range m.Clusters { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + if m.Kubernetes != nil { + l = m.Kubernetes.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Role) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *AccessPolicyTest_Expected_Kubernetes_Impersonate) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Groups) > 0 { + for _, s := range m.Groups { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + n += len(m.unknownFields) + return n +} + +func (m *AccessPolicyTest_Expected_Kubernetes) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Impersonate != nil { + l = m.Impersonate.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *AccessPolicyTest_Expected) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Kubernetes != nil { + l = m.Kubernetes.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Role) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *AccessPolicyTest_User) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if len(m.Labels) > 0 { + for k, v := range m.Labels { + _ = k + _ = v + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + 1 + len(v) + protohelpers.SizeOfVarint(uint64(len(v))) + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) + } + } + n += len(m.unknownFields) + return n +} + +func (m *AccessPolicyTest_Cluster) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *AccessPolicyTest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.User != nil { + l = m.User.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.Cluster != nil { + l = m.Cluster.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.Expected != nil { + l = m.Expected.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *AccessPolicySpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.UserGroups) > 0 { + for k, v := range m.UserGroups { + _ = k + _ = v + l = 0 + if v != nil { + l = v.SizeVT() + } + l += 1 + protohelpers.SizeOfVarint(uint64(l)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + l + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) + } + } + if len(m.ClusterGroups) > 0 { + for k, v := range m.ClusterGroups { + _ = k + _ = v + l = 0 + if v != nil { + l = v.SizeVT() + } + l += 1 + protohelpers.SizeOfVarint(uint64(l)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + l + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) + } + } + if len(m.Rules) > 0 { + for _, e := range m.Rules { + l = e.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + if len(m.Tests) > 0 { + for _, e := range m.Tests { + l = e.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + n += len(m.unknownFields) + return n +} + +func (m *SAMLLabelRuleSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.MatchLabels) > 0 { + for _, s := range m.MatchLabels { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + l = len(m.AssignRoleOnRegistration) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *AuthConfigSpec_Auth0) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AuthConfigSpec_Auth0: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AuthConfigSpec_Auth0: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Enabled", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Enabled = bool(v != 0) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Domain", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Domain = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClientId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ClientId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AuthConfigSpec_Webauthn) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AuthConfigSpec_Webauthn: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AuthConfigSpec_Webauthn: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Enabled", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Enabled = bool(v != 0) + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Required", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Required = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AuthConfigSpec_SAML) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AuthConfigSpec_SAML: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AuthConfigSpec_SAML: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Enabled", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Enabled = bool(v != 0) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Url", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Url = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Metadata = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LabelRules", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.LabelRules == nil { + m.LabelRules = make(map[string]string) + } + var mapkey string + var mapvalue string + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return protohelpers.ErrInvalidLength + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return protohelpers.ErrInvalidLength + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var stringLenmapvalue uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapvalue |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapvalue := int(stringLenmapvalue) + if intStringLenmapvalue < 0 { + return protohelpers.ErrInvalidLength + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue < 0 { + return protohelpers.ErrInvalidLength + } + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.LabelRules[mapkey] = mapvalue + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AuthConfigSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AuthConfigSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AuthConfigSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Auth0", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Auth0 == nil { + m.Auth0 = &AuthConfigSpec_Auth0{} + } + if err := m.Auth0.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Webauthn", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Webauthn == nil { + m.Webauthn = &AuthConfigSpec_Webauthn{} + } + if err := m.Webauthn.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Suspended", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Suspended = bool(v != 0) + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Saml", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Saml == nil { + m.Saml = &AuthConfigSpec_SAML{} + } + if err := m.Saml.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SAMLAssertionSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SAMLAssertionSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SAMLAssertionSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Data = append(m.Data[:0], dAtA[iNdEx:postIndex]...) + if m.Data == nil { + m.Data = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Email", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Email = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Used", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Used = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *UserSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: UserSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: UserSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Scopes", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Scopes = append(m.Scopes, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Role", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Role = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *IdentitySpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: IdentitySpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: IdentitySpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UserId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.UserId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Identity) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Identity: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Identity: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Email", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Email = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PublicKeySpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PublicKeySpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PublicKeySpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PublicKey", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PublicKey = append(m.PublicKey[:0], dAtA[iNdEx:postIndex]...) + if m.PublicKey == nil { + m.PublicKey = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Scopes", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Scopes = append(m.Scopes, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Expiration", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Expiration == nil { + m.Expiration = ×tamppb.Timestamp{} + } + if err := (*timestamppb1.Timestamp)(m.Expiration).UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Confirmed", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Confirmed = bool(v != 0) + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Identity == nil { + m.Identity = &Identity{} + } + if err := m.Identity.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Role", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Role = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AccessPolicyUserGroup_User) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AccessPolicyUserGroup_User: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AccessPolicyUserGroup_User: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Match", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Match = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LabelSelectors", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.LabelSelectors = append(m.LabelSelectors, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AccessPolicyUserGroup) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AccessPolicyUserGroup: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AccessPolicyUserGroup: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Users", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Users = append(m.Users, &AccessPolicyUserGroup_User{}) + if err := m.Users[len(m.Users)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AccessPolicyClusterGroup_Cluster) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AccessPolicyClusterGroup_Cluster: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AccessPolicyClusterGroup_Cluster: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Match", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Match = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AccessPolicyClusterGroup) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AccessPolicyClusterGroup: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AccessPolicyClusterGroup: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Clusters", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Clusters = append(m.Clusters, &AccessPolicyClusterGroup_Cluster{}) + if err := m.Clusters[len(m.Clusters)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AccessPolicyRule_Kubernetes_Impersonate) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AccessPolicyRule_Kubernetes_Impersonate: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AccessPolicyRule_Kubernetes_Impersonate: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Groups", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Groups = append(m.Groups, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AccessPolicyRule_Kubernetes) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AccessPolicyRule_Kubernetes: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AccessPolicyRule_Kubernetes: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Impersonate", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Impersonate == nil { + m.Impersonate = &AccessPolicyRule_Kubernetes_Impersonate{} + } + if err := m.Impersonate.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AccessPolicyRule) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AccessPolicyRule: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AccessPolicyRule: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Users", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Users = append(m.Users, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Clusters", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Clusters = append(m.Clusters, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Kubernetes", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Kubernetes == nil { + m.Kubernetes = &AccessPolicyRule_Kubernetes{} + } + if err := m.Kubernetes.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Role", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Role = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AccessPolicyTest_Expected_Kubernetes_Impersonate) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AccessPolicyTest_Expected_Kubernetes_Impersonate: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AccessPolicyTest_Expected_Kubernetes_Impersonate: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Groups", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Groups = append(m.Groups, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AccessPolicyTest_Expected_Kubernetes) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AccessPolicyTest_Expected_Kubernetes: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AccessPolicyTest_Expected_Kubernetes: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Impersonate", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Impersonate == nil { + m.Impersonate = &AccessPolicyTest_Expected_Kubernetes_Impersonate{} + } + if err := m.Impersonate.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AccessPolicyTest_Expected) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AccessPolicyTest_Expected: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AccessPolicyTest_Expected: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Kubernetes", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Kubernetes == nil { + m.Kubernetes = &AccessPolicyTest_Expected_Kubernetes{} + } + if err := m.Kubernetes.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Role", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Role = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AccessPolicyTest_User) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AccessPolicyTest_User: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AccessPolicyTest_User: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Labels", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Labels == nil { + m.Labels = make(map[string]string) + } + var mapkey string + var mapvalue string + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return protohelpers.ErrInvalidLength + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return protohelpers.ErrInvalidLength + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var stringLenmapvalue uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapvalue |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapvalue := int(stringLenmapvalue) + if intStringLenmapvalue < 0 { + return protohelpers.ErrInvalidLength + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue < 0 { + return protohelpers.ErrInvalidLength + } + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.Labels[mapkey] = mapvalue + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AccessPolicyTest_Cluster) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AccessPolicyTest_Cluster: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AccessPolicyTest_Cluster: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AccessPolicyTest) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AccessPolicyTest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AccessPolicyTest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field User", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.User == nil { + m.User = &AccessPolicyTest_User{} + } + if err := m.User.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Cluster", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Cluster == nil { + m.Cluster = &AccessPolicyTest_Cluster{} + } + if err := m.Cluster.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Expected", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Expected == nil { + m.Expected = &AccessPolicyTest_Expected{} + } + if err := m.Expected.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AccessPolicySpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AccessPolicySpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AccessPolicySpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UserGroups", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.UserGroups == nil { + m.UserGroups = make(map[string]*AccessPolicyUserGroup) + } + var mapkey string + var mapvalue *AccessPolicyUserGroup + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return protohelpers.ErrInvalidLength + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return protohelpers.ErrInvalidLength + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var mapmsglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + mapmsglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if mapmsglen < 0 { + return protohelpers.ErrInvalidLength + } + postmsgIndex := iNdEx + mapmsglen + if postmsgIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postmsgIndex > l { + return io.ErrUnexpectedEOF + } + mapvalue = &AccessPolicyUserGroup{} + if err := mapvalue.UnmarshalVT(dAtA[iNdEx:postmsgIndex]); err != nil { + return err + } + iNdEx = postmsgIndex + } else { + iNdEx = entryPreIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.UserGroups[mapkey] = mapvalue + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClusterGroups", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ClusterGroups == nil { + m.ClusterGroups = make(map[string]*AccessPolicyClusterGroup) + } + var mapkey string + var mapvalue *AccessPolicyClusterGroup + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return protohelpers.ErrInvalidLength + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return protohelpers.ErrInvalidLength + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var mapmsglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + mapmsglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if mapmsglen < 0 { + return protohelpers.ErrInvalidLength + } + postmsgIndex := iNdEx + mapmsglen + if postmsgIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postmsgIndex > l { + return io.ErrUnexpectedEOF + } + mapvalue = &AccessPolicyClusterGroup{} + if err := mapvalue.UnmarshalVT(dAtA[iNdEx:postmsgIndex]); err != nil { + return err + } + iNdEx = postmsgIndex + } else { + iNdEx = entryPreIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.ClusterGroups[mapkey] = mapvalue + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Rules", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Rules = append(m.Rules, &AccessPolicyRule{}) + if err := m.Rules[len(m.Rules)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Tests", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Tests = append(m.Tests, &AccessPolicyTest{}) + if err := m.Tests[len(m.Tests)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SAMLLabelRuleSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SAMLLabelRuleSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SAMLLabelRuleSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MatchLabels", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.MatchLabels = append(m.MatchLabels, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AssignRoleOnRegistration", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AssignRoleOnRegistration = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} diff --git a/client/api/omni/specs/control_plane_status.go b/client/api/omni/specs/control_plane_status.go new file mode 100644 index 00000000..3fe7f8fb --- /dev/null +++ b/client/api/omni/specs/control_plane_status.go @@ -0,0 +1,40 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +// Package specs contains all resource specs of the service. +package specs + +// GetCondition returns condition from the list of conditions of the status if it's set. +func (x *ControlPlaneStatusSpec) GetCondition(condition ConditionType) *ControlPlaneStatusSpec_Condition { + for _, c := range x.Conditions { + if c.Type == condition { + return c + } + } + + return &ControlPlaneStatusSpec_Condition{ + Status: ControlPlaneStatusSpec_Condition_Unknown, + Severity: ControlPlaneStatusSpec_Condition_Info, + } +} + +// SetCondition updates the conditions: adds new condition if it's not set, or updates the existing one. +func (x *ControlPlaneStatusSpec) SetCondition(condition ConditionType, status ControlPlaneStatusSpec_Condition_Status, severity ControlPlaneStatusSpec_Condition_Severity, reason string) { + c := &ControlPlaneStatusSpec_Condition{ + Type: condition, + Status: status, + Severity: severity, + Reason: reason, + } + + for i, cond := range x.Conditions { + if cond.Type == condition { + x.Conditions[i] = c + + return + } + } + + x.Conditions = append(x.Conditions, c) +} diff --git a/client/api/omni/specs/ephemeral.pb.go b/client/api/omni/specs/ephemeral.pb.go new file mode 100644 index 00000000..7f0ea691 --- /dev/null +++ b/client/api/omni/specs/ephemeral.pb.go @@ -0,0 +1,183 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.32.0 +// protoc v4.24.4 +// source: omni/specs/ephemeral.proto + +package specs + +import ( + reflect "reflect" + sync "sync" + + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// MachineStatusLinkSpec describes the combination of MessageStatusSpec and SideroLinkSpec and SiderolinkCounterSpec +type MachineStatusLinkSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + MessageStatus *MachineStatusSpec `protobuf:"bytes,1,opt,name=message_status,json=messageStatus,proto3" json:"message_status,omitempty"` + SiderolinkCounter *SiderolinkCounterSpec `protobuf:"bytes,2,opt,name=siderolink_counter,json=siderolinkCounter,proto3" json:"siderolink_counter,omitempty"` + MachineCreatedAt int64 `protobuf:"varint,3,opt,name=machine_created_at,json=machineCreatedAt,proto3" json:"machine_created_at,omitempty"` +} + +func (x *MachineStatusLinkSpec) Reset() { + *x = MachineStatusLinkSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_ephemeral_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MachineStatusLinkSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MachineStatusLinkSpec) ProtoMessage() {} + +func (x *MachineStatusLinkSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_ephemeral_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MachineStatusLinkSpec.ProtoReflect.Descriptor instead. +func (*MachineStatusLinkSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_ephemeral_proto_rawDescGZIP(), []int{0} +} + +func (x *MachineStatusLinkSpec) GetMessageStatus() *MachineStatusSpec { + if x != nil { + return x.MessageStatus + } + return nil +} + +func (x *MachineStatusLinkSpec) GetSiderolinkCounter() *SiderolinkCounterSpec { + if x != nil { + return x.SiderolinkCounter + } + return nil +} + +func (x *MachineStatusLinkSpec) GetMachineCreatedAt() int64 { + if x != nil { + return x.MachineCreatedAt + } + return 0 +} + +var File_omni_specs_ephemeral_proto protoreflect.FileDescriptor + +var file_omni_specs_ephemeral_proto_rawDesc = []byte{ + 0x0a, 0x1a, 0x6f, 0x6d, 0x6e, 0x69, 0x2f, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2f, 0x65, 0x70, 0x68, + 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x73, 0x70, + 0x65, 0x63, 0x73, 0x1a, 0x15, 0x6f, 0x6d, 0x6e, 0x69, 0x2f, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2f, + 0x6f, 0x6d, 0x6e, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x6f, 0x6d, 0x6e, 0x69, + 0x2f, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2f, 0x73, 0x69, 0x64, 0x65, 0x72, 0x6f, 0x6c, 0x69, 0x6e, + 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xd3, 0x01, 0x0a, 0x15, 0x4d, 0x61, 0x63, 0x68, + 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4c, 0x69, 0x6e, 0x6b, 0x53, 0x70, 0x65, + 0x63, 0x12, 0x3f, 0x0a, 0x0e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x73, 0x70, 0x65, 0x63, + 0x73, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, + 0x70, 0x65, 0x63, 0x52, 0x0d, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x4b, 0x0a, 0x12, 0x73, 0x69, 0x64, 0x65, 0x72, 0x6f, 0x6c, 0x69, 0x6e, 0x6b, + 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, + 0x2e, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2e, 0x53, 0x69, 0x64, 0x65, 0x72, 0x6f, 0x6c, 0x69, 0x6e, + 0x6b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x52, 0x11, 0x73, 0x69, + 0x64, 0x65, 0x72, 0x6f, 0x6c, 0x69, 0x6e, 0x6b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x12, + 0x2c, 0x0a, 0x12, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x6d, 0x61, 0x63, + 0x68, 0x69, 0x6e, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x42, 0x32, 0x5a, + 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x73, 0x69, 0x64, 0x65, + 0x72, 0x6f, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x6f, 0x6d, 0x6e, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6f, 0x6d, 0x6e, 0x69, 0x2f, 0x73, 0x70, 0x65, 0x63, + 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_omni_specs_ephemeral_proto_rawDescOnce sync.Once + file_omni_specs_ephemeral_proto_rawDescData = file_omni_specs_ephemeral_proto_rawDesc +) + +func file_omni_specs_ephemeral_proto_rawDescGZIP() []byte { + file_omni_specs_ephemeral_proto_rawDescOnce.Do(func() { + file_omni_specs_ephemeral_proto_rawDescData = protoimpl.X.CompressGZIP(file_omni_specs_ephemeral_proto_rawDescData) + }) + return file_omni_specs_ephemeral_proto_rawDescData +} + +var file_omni_specs_ephemeral_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_omni_specs_ephemeral_proto_goTypes = []interface{}{ + (*MachineStatusLinkSpec)(nil), // 0: specs.MachineStatusLinkSpec + (*MachineStatusSpec)(nil), // 1: specs.MachineStatusSpec + (*SiderolinkCounterSpec)(nil), // 2: specs.SiderolinkCounterSpec +} +var file_omni_specs_ephemeral_proto_depIdxs = []int32{ + 1, // 0: specs.MachineStatusLinkSpec.message_status:type_name -> specs.MachineStatusSpec + 2, // 1: specs.MachineStatusLinkSpec.siderolink_counter:type_name -> specs.SiderolinkCounterSpec + 2, // [2:2] is the sub-list for method output_type + 2, // [2:2] is the sub-list for method input_type + 2, // [2:2] is the sub-list for extension type_name + 2, // [2:2] is the sub-list for extension extendee + 0, // [0:2] is the sub-list for field type_name +} + +func init() { file_omni_specs_ephemeral_proto_init() } +func file_omni_specs_ephemeral_proto_init() { + if File_omni_specs_ephemeral_proto != nil { + return + } + file_omni_specs_omni_proto_init() + file_omni_specs_siderolink_proto_init() + if !protoimpl.UnsafeEnabled { + file_omni_specs_ephemeral_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MachineStatusLinkSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_omni_specs_ephemeral_proto_rawDesc, + NumEnums: 0, + NumMessages: 1, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_omni_specs_ephemeral_proto_goTypes, + DependencyIndexes: file_omni_specs_ephemeral_proto_depIdxs, + MessageInfos: file_omni_specs_ephemeral_proto_msgTypes, + }.Build() + File_omni_specs_ephemeral_proto = out.File + file_omni_specs_ephemeral_proto_rawDesc = nil + file_omni_specs_ephemeral_proto_goTypes = nil + file_omni_specs_ephemeral_proto_depIdxs = nil +} diff --git a/client/api/omni/specs/ephemeral.proto b/client/api/omni/specs/ephemeral.proto new file mode 100644 index 00000000..16b93224 --- /dev/null +++ b/client/api/omni/specs/ephemeral.proto @@ -0,0 +1,16 @@ +syntax = "proto3"; +package specs; + +option go_package = "github.com/siderolabs/omni/client/api/omni/specs"; + +import "omni/specs/omni.proto"; +import "omni/specs/siderolink.proto"; + + +// MachineStatusLinkSpec describes the combination of MessageStatusSpec and SideroLinkSpec and SiderolinkCounterSpec +message MachineStatusLinkSpec { + specs.MachineStatusSpec message_status = 1; + specs.SiderolinkCounterSpec siderolink_counter = 2; + int64 machine_created_at = 3; +} + diff --git a/client/api/omni/specs/ephemeral_vtproto.pb.go b/client/api/omni/specs/ephemeral_vtproto.pb.go new file mode 100644 index 00000000..3b4422d7 --- /dev/null +++ b/client/api/omni/specs/ephemeral_vtproto.pb.go @@ -0,0 +1,287 @@ +// Code generated by protoc-gen-go-vtproto. DO NOT EDIT. +// protoc-gen-go-vtproto version: v0.6.0 +// source: omni/specs/ephemeral.proto + +package specs + +import ( + fmt "fmt" + io "io" + + protohelpers "github.com/planetscale/vtprotobuf/protohelpers" + proto "google.golang.org/protobuf/proto" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +func (m *MachineStatusLinkSpec) CloneVT() *MachineStatusLinkSpec { + if m == nil { + return (*MachineStatusLinkSpec)(nil) + } + r := new(MachineStatusLinkSpec) + r.MessageStatus = m.MessageStatus.CloneVT() + r.SiderolinkCounter = m.SiderolinkCounter.CloneVT() + r.MachineCreatedAt = m.MachineCreatedAt + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *MachineStatusLinkSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (this *MachineStatusLinkSpec) EqualVT(that *MachineStatusLinkSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if !this.MessageStatus.EqualVT(that.MessageStatus) { + return false + } + if !this.SiderolinkCounter.EqualVT(that.SiderolinkCounter) { + return false + } + if this.MachineCreatedAt != that.MachineCreatedAt { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *MachineStatusLinkSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*MachineStatusLinkSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (m *MachineStatusLinkSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MachineStatusLinkSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *MachineStatusLinkSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.MachineCreatedAt != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.MachineCreatedAt)) + i-- + dAtA[i] = 0x18 + } + if m.SiderolinkCounter != nil { + size, err := m.SiderolinkCounter.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x12 + } + if m.MessageStatus != nil { + size, err := m.MessageStatus.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MachineStatusLinkSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.MessageStatus != nil { + l = m.MessageStatus.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.SiderolinkCounter != nil { + l = m.SiderolinkCounter.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.MachineCreatedAt != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.MachineCreatedAt)) + } + n += len(m.unknownFields) + return n +} + +func (m *MachineStatusLinkSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MachineStatusLinkSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MachineStatusLinkSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MessageStatus", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.MessageStatus == nil { + m.MessageStatus = &MachineStatusSpec{} + } + if err := m.MessageStatus.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SiderolinkCounter", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.SiderolinkCounter == nil { + m.SiderolinkCounter = &SiderolinkCounterSpec{} + } + if err := m.SiderolinkCounter.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MachineCreatedAt", wireType) + } + m.MachineCreatedAt = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.MachineCreatedAt |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} diff --git a/client/api/omni/specs/oidc.pb.go b/client/api/omni/specs/oidc.pb.go new file mode 100644 index 00000000..7f578cc3 --- /dev/null +++ b/client/api/omni/specs/oidc.pb.go @@ -0,0 +1,166 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.32.0 +// protoc v4.24.4 +// source: omni/specs/oidc.proto + +package specs + +import ( + reflect "reflect" + sync "sync" + + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// JWTPublicKeySpec keeps the active set of JWT signing keys. +type JWTPublicKeySpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // PKCS1 encoded RSA public key. + PublicKey []byte `protobuf:"bytes,1,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` + // Expiration time (when it's ready to be cleaned up). + Expiration *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=expiration,proto3" json:"expiration,omitempty"` +} + +func (x *JWTPublicKeySpec) Reset() { + *x = JWTPublicKeySpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_oidc_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *JWTPublicKeySpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*JWTPublicKeySpec) ProtoMessage() {} + +func (x *JWTPublicKeySpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_oidc_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use JWTPublicKeySpec.ProtoReflect.Descriptor instead. +func (*JWTPublicKeySpec) Descriptor() ([]byte, []int) { + return file_omni_specs_oidc_proto_rawDescGZIP(), []int{0} +} + +func (x *JWTPublicKeySpec) GetPublicKey() []byte { + if x != nil { + return x.PublicKey + } + return nil +} + +func (x *JWTPublicKeySpec) GetExpiration() *timestamppb.Timestamp { + if x != nil { + return x.Expiration + } + return nil +} + +var File_omni_specs_oidc_proto protoreflect.FileDescriptor + +var file_omni_specs_oidc_proto_rawDesc = []byte{ + 0x0a, 0x15, 0x6f, 0x6d, 0x6e, 0x69, 0x2f, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2f, 0x6f, 0x69, 0x64, + 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x73, 0x70, 0x65, 0x63, 0x73, 0x1a, 0x1f, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, + 0x6d, 0x0a, 0x10, 0x4a, 0x57, 0x54, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x53, + 0x70, 0x65, 0x63, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, + 0x65, 0x79, 0x12, 0x3a, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x32, + 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x73, 0x69, 0x64, + 0x65, 0x72, 0x6f, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x6f, 0x6d, 0x6e, 0x69, 0x2f, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6f, 0x6d, 0x6e, 0x69, 0x2f, 0x73, 0x70, 0x65, + 0x63, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_omni_specs_oidc_proto_rawDescOnce sync.Once + file_omni_specs_oidc_proto_rawDescData = file_omni_specs_oidc_proto_rawDesc +) + +func file_omni_specs_oidc_proto_rawDescGZIP() []byte { + file_omni_specs_oidc_proto_rawDescOnce.Do(func() { + file_omni_specs_oidc_proto_rawDescData = protoimpl.X.CompressGZIP(file_omni_specs_oidc_proto_rawDescData) + }) + return file_omni_specs_oidc_proto_rawDescData +} + +var file_omni_specs_oidc_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_omni_specs_oidc_proto_goTypes = []interface{}{ + (*JWTPublicKeySpec)(nil), // 0: specs.JWTPublicKeySpec + (*timestamppb.Timestamp)(nil), // 1: google.protobuf.Timestamp +} +var file_omni_specs_oidc_proto_depIdxs = []int32{ + 1, // 0: specs.JWTPublicKeySpec.expiration:type_name -> google.protobuf.Timestamp + 1, // [1:1] is the sub-list for method output_type + 1, // [1:1] is the sub-list for method input_type + 1, // [1:1] is the sub-list for extension type_name + 1, // [1:1] is the sub-list for extension extendee + 0, // [0:1] is the sub-list for field type_name +} + +func init() { file_omni_specs_oidc_proto_init() } +func file_omni_specs_oidc_proto_init() { + if File_omni_specs_oidc_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_omni_specs_oidc_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*JWTPublicKeySpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_omni_specs_oidc_proto_rawDesc, + NumEnums: 0, + NumMessages: 1, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_omni_specs_oidc_proto_goTypes, + DependencyIndexes: file_omni_specs_oidc_proto_depIdxs, + MessageInfos: file_omni_specs_oidc_proto_msgTypes, + }.Build() + File_omni_specs_oidc_proto = out.File + file_omni_specs_oidc_proto_rawDesc = nil + file_omni_specs_oidc_proto_goTypes = nil + file_omni_specs_oidc_proto_depIdxs = nil +} diff --git a/client/api/omni/specs/oidc.proto b/client/api/omni/specs/oidc.proto new file mode 100644 index 00000000..414b45b6 --- /dev/null +++ b/client/api/omni/specs/oidc.proto @@ -0,0 +1,14 @@ +syntax = "proto3"; +package specs; + +option go_package = "github.com/siderolabs/omni/client/api/omni/specs"; + +import "google/protobuf/timestamp.proto"; + +// JWTPublicKeySpec keeps the active set of JWT signing keys. +message JWTPublicKeySpec { + // PKCS1 encoded RSA public key. + bytes public_key = 1; + // Expiration time (when it's ready to be cleaned up). + google.protobuf.Timestamp expiration = 2; +} diff --git a/client/api/omni/specs/oidc_vtproto.pb.go b/client/api/omni/specs/oidc_vtproto.pb.go new file mode 100644 index 00000000..d2e7ea20 --- /dev/null +++ b/client/api/omni/specs/oidc_vtproto.pb.go @@ -0,0 +1,257 @@ +// Code generated by protoc-gen-go-vtproto. DO NOT EDIT. +// protoc-gen-go-vtproto version: v0.6.0 +// source: omni/specs/oidc.proto + +package specs + +import ( + fmt "fmt" + io "io" + + protohelpers "github.com/planetscale/vtprotobuf/protohelpers" + timestamppb1 "github.com/planetscale/vtprotobuf/types/known/timestamppb" + proto "google.golang.org/protobuf/proto" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +func (m *JWTPublicKeySpec) CloneVT() *JWTPublicKeySpec { + if m == nil { + return (*JWTPublicKeySpec)(nil) + } + r := new(JWTPublicKeySpec) + r.Expiration = (*timestamppb.Timestamp)((*timestamppb1.Timestamp)(m.Expiration).CloneVT()) + if rhs := m.PublicKey; rhs != nil { + tmpBytes := make([]byte, len(rhs)) + copy(tmpBytes, rhs) + r.PublicKey = tmpBytes + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *JWTPublicKeySpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (this *JWTPublicKeySpec) EqualVT(that *JWTPublicKeySpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if string(this.PublicKey) != string(that.PublicKey) { + return false + } + if !(*timestamppb1.Timestamp)(this.Expiration).EqualVT((*timestamppb1.Timestamp)(that.Expiration)) { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *JWTPublicKeySpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*JWTPublicKeySpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (m *JWTPublicKeySpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *JWTPublicKeySpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *JWTPublicKeySpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.Expiration != nil { + size, err := (*timestamppb1.Timestamp)(m.Expiration).MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x12 + } + if len(m.PublicKey) > 0 { + i -= len(m.PublicKey) + copy(dAtA[i:], m.PublicKey) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.PublicKey))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *JWTPublicKeySpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.PublicKey) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.Expiration != nil { + l = (*timestamppb1.Timestamp)(m.Expiration).SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *JWTPublicKeySpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: JWTPublicKeySpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: JWTPublicKeySpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PublicKey", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PublicKey = append(m.PublicKey[:0], dAtA[iNdEx:postIndex]...) + if m.PublicKey == nil { + m.PublicKey = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Expiration", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Expiration == nil { + m.Expiration = ×tamppb.Timestamp{} + } + if err := (*timestamppb1.Timestamp)(m.Expiration).UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} diff --git a/client/api/omni/specs/omni.pb.go b/client/api/omni/specs/omni.pb.go new file mode 100644 index 00000000..73a63cfa --- /dev/null +++ b/client/api/omni/specs/omni.pb.go @@ -0,0 +1,8367 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.32.0 +// protoc v4.24.4 +// source: omni/specs/omni.proto + +package specs + +import ( + reflect "reflect" + sync "sync" + + machine "github.com/siderolabs/talos/pkg/machinery/api/machine" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + durationpb "google.golang.org/protobuf/types/known/durationpb" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type ConfigApplyStatus int32 + +const ( + ConfigApplyStatus_UNKNOWN ConfigApplyStatus = 0 + ConfigApplyStatus_PENDING ConfigApplyStatus = 1 + ConfigApplyStatus_APPLIED ConfigApplyStatus = 2 + ConfigApplyStatus_FAILED ConfigApplyStatus = 3 +) + +// Enum value maps for ConfigApplyStatus. +var ( + ConfigApplyStatus_name = map[int32]string{ + 0: "UNKNOWN", + 1: "PENDING", + 2: "APPLIED", + 3: "FAILED", + } + ConfigApplyStatus_value = map[string]int32{ + "UNKNOWN": 0, + "PENDING": 1, + "APPLIED": 2, + "FAILED": 3, + } +) + +func (x ConfigApplyStatus) Enum() *ConfigApplyStatus { + p := new(ConfigApplyStatus) + *p = x + return p +} + +func (x ConfigApplyStatus) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ConfigApplyStatus) Descriptor() protoreflect.EnumDescriptor { + return file_omni_specs_omni_proto_enumTypes[0].Descriptor() +} + +func (ConfigApplyStatus) Type() protoreflect.EnumType { + return &file_omni_specs_omni_proto_enumTypes[0] +} + +func (x ConfigApplyStatus) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ConfigApplyStatus.Descriptor instead. +func (ConfigApplyStatus) EnumDescriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{0} +} + +// MachineSetPhaseSpec is machine set phase. +type MachineSetPhase int32 + +const ( + MachineSetPhase_Unknown MachineSetPhase = 0 + MachineSetPhase_ScalingUp MachineSetPhase = 1 + MachineSetPhase_ScalingDown MachineSetPhase = 2 + MachineSetPhase_Running MachineSetPhase = 3 + MachineSetPhase_Destroying MachineSetPhase = 4 + MachineSetPhase_Failed MachineSetPhase = 5 + MachineSetPhase_Reconfiguring MachineSetPhase = 6 +) + +// Enum value maps for MachineSetPhase. +var ( + MachineSetPhase_name = map[int32]string{ + 0: "Unknown", + 1: "ScalingUp", + 2: "ScalingDown", + 3: "Running", + 4: "Destroying", + 5: "Failed", + 6: "Reconfiguring", + } + MachineSetPhase_value = map[string]int32{ + "Unknown": 0, + "ScalingUp": 1, + "ScalingDown": 2, + "Running": 3, + "Destroying": 4, + "Failed": 5, + "Reconfiguring": 6, + } +) + +func (x MachineSetPhase) Enum() *MachineSetPhase { + p := new(MachineSetPhase) + *p = x + return p +} + +func (x MachineSetPhase) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (MachineSetPhase) Descriptor() protoreflect.EnumDescriptor { + return file_omni_specs_omni_proto_enumTypes[1].Descriptor() +} + +func (MachineSetPhase) Type() protoreflect.EnumType { + return &file_omni_specs_omni_proto_enumTypes[1] +} + +func (x MachineSetPhase) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use MachineSetPhase.Descriptor instead. +func (MachineSetPhase) EnumDescriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{1} +} + +type ConditionType int32 + +const ( + ConditionType_UnknownCondition ConditionType = 0 + ConditionType_Etcd ConditionType = 1 + ConditionType_WireguardConnection ConditionType = 2 +) + +// Enum value maps for ConditionType. +var ( + ConditionType_name = map[int32]string{ + 0: "UnknownCondition", + 1: "Etcd", + 2: "WireguardConnection", + } + ConditionType_value = map[string]int32{ + "UnknownCondition": 0, + "Etcd": 1, + "WireguardConnection": 2, + } +) + +func (x ConditionType) Enum() *ConditionType { + p := new(ConditionType) + *p = x + return p +} + +func (x ConditionType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ConditionType) Descriptor() protoreflect.EnumDescriptor { + return file_omni_specs_omni_proto_enumTypes[2].Descriptor() +} + +func (ConditionType) Type() protoreflect.EnumType { + return &file_omni_specs_omni_proto_enumTypes[2] +} + +func (x ConditionType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ConditionType.Descriptor instead. +func (ConditionType) EnumDescriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{2} +} + +type MachineStatusSpec_Role int32 + +const ( + MachineStatusSpec_NONE MachineStatusSpec_Role = 0 + MachineStatusSpec_CONTROL_PLANE MachineStatusSpec_Role = 1 + MachineStatusSpec_WORKER MachineStatusSpec_Role = 2 +) + +// Enum value maps for MachineStatusSpec_Role. +var ( + MachineStatusSpec_Role_name = map[int32]string{ + 0: "NONE", + 1: "CONTROL_PLANE", + 2: "WORKER", + } + MachineStatusSpec_Role_value = map[string]int32{ + "NONE": 0, + "CONTROL_PLANE": 1, + "WORKER": 2, + } +) + +func (x MachineStatusSpec_Role) Enum() *MachineStatusSpec_Role { + p := new(MachineStatusSpec_Role) + *p = x + return p +} + +func (x MachineStatusSpec_Role) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (MachineStatusSpec_Role) Descriptor() protoreflect.EnumDescriptor { + return file_omni_specs_omni_proto_enumTypes[3].Descriptor() +} + +func (MachineStatusSpec_Role) Type() protoreflect.EnumType { + return &file_omni_specs_omni_proto_enumTypes[3] +} + +func (x MachineStatusSpec_Role) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use MachineStatusSpec_Role.Descriptor instead. +func (MachineStatusSpec_Role) EnumDescriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{1, 0} +} + +type EtcdBackupStatusSpec_Status int32 + +const ( + EtcdBackupStatusSpec_Unknown EtcdBackupStatusSpec_Status = 0 + EtcdBackupStatusSpec_Ok EtcdBackupStatusSpec_Status = 1 + EtcdBackupStatusSpec_Error EtcdBackupStatusSpec_Status = 2 + EtcdBackupStatusSpec_Running EtcdBackupStatusSpec_Status = 3 +) + +// Enum value maps for EtcdBackupStatusSpec_Status. +var ( + EtcdBackupStatusSpec_Status_name = map[int32]string{ + 0: "Unknown", + 1: "Ok", + 2: "Error", + 3: "Running", + } + EtcdBackupStatusSpec_Status_value = map[string]int32{ + "Unknown": 0, + "Ok": 1, + "Error": 2, + "Running": 3, + } +) + +func (x EtcdBackupStatusSpec_Status) Enum() *EtcdBackupStatusSpec_Status { + p := new(EtcdBackupStatusSpec_Status) + *p = x + return p +} + +func (x EtcdBackupStatusSpec_Status) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (EtcdBackupStatusSpec_Status) Descriptor() protoreflect.EnumDescriptor { + return file_omni_specs_omni_proto_enumTypes[4].Descriptor() +} + +func (EtcdBackupStatusSpec_Status) Type() protoreflect.EnumType { + return &file_omni_specs_omni_proto_enumTypes[4] +} + +func (x EtcdBackupStatusSpec_Status) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use EtcdBackupStatusSpec_Status.Descriptor instead. +func (EtcdBackupStatusSpec_Status) EnumDescriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{10, 0} +} + +type ClusterMachineStatusSpec_Stage int32 + +const ( + ClusterMachineStatusSpec_UNKNOWN ClusterMachineStatusSpec_Stage = 0 + ClusterMachineStatusSpec_BOOTING ClusterMachineStatusSpec_Stage = 1 + ClusterMachineStatusSpec_INSTALLING ClusterMachineStatusSpec_Stage = 2 + ClusterMachineStatusSpec_UPGRADING ClusterMachineStatusSpec_Stage = 6 + ClusterMachineStatusSpec_CONFIGURING ClusterMachineStatusSpec_Stage = 3 + ClusterMachineStatusSpec_RUNNING ClusterMachineStatusSpec_Stage = 4 + ClusterMachineStatusSpec_REBOOTING ClusterMachineStatusSpec_Stage = 7 + ClusterMachineStatusSpec_SHUTTING_DOWN ClusterMachineStatusSpec_Stage = 8 + ClusterMachineStatusSpec_BEFORE_DESTROY ClusterMachineStatusSpec_Stage = 9 + ClusterMachineStatusSpec_DESTROYING ClusterMachineStatusSpec_Stage = 5 +) + +// Enum value maps for ClusterMachineStatusSpec_Stage. +var ( + ClusterMachineStatusSpec_Stage_name = map[int32]string{ + 0: "UNKNOWN", + 1: "BOOTING", + 2: "INSTALLING", + 6: "UPGRADING", + 3: "CONFIGURING", + 4: "RUNNING", + 7: "REBOOTING", + 8: "SHUTTING_DOWN", + 9: "BEFORE_DESTROY", + 5: "DESTROYING", + } + ClusterMachineStatusSpec_Stage_value = map[string]int32{ + "UNKNOWN": 0, + "BOOTING": 1, + "INSTALLING": 2, + "UPGRADING": 6, + "CONFIGURING": 3, + "RUNNING": 4, + "REBOOTING": 7, + "SHUTTING_DOWN": 8, + "BEFORE_DESTROY": 9, + "DESTROYING": 5, + } +) + +func (x ClusterMachineStatusSpec_Stage) Enum() *ClusterMachineStatusSpec_Stage { + p := new(ClusterMachineStatusSpec_Stage) + *p = x + return p +} + +func (x ClusterMachineStatusSpec_Stage) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ClusterMachineStatusSpec_Stage) Descriptor() protoreflect.EnumDescriptor { + return file_omni_specs_omni_proto_enumTypes[5].Descriptor() +} + +func (ClusterMachineStatusSpec_Stage) Type() protoreflect.EnumType { + return &file_omni_specs_omni_proto_enumTypes[5] +} + +func (x ClusterMachineStatusSpec_Stage) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ClusterMachineStatusSpec_Stage.Descriptor instead. +func (ClusterMachineStatusSpec_Stage) EnumDescriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{21, 0} +} + +type ClusterStatusSpec_Phase int32 + +const ( + ClusterStatusSpec_UNKNOWN ClusterStatusSpec_Phase = 0 + ClusterStatusSpec_SCALING_UP ClusterStatusSpec_Phase = 1 + ClusterStatusSpec_SCALING_DOWN ClusterStatusSpec_Phase = 2 + ClusterStatusSpec_RUNNING ClusterStatusSpec_Phase = 3 + ClusterStatusSpec_DESTROYING ClusterStatusSpec_Phase = 4 +) + +// Enum value maps for ClusterStatusSpec_Phase. +var ( + ClusterStatusSpec_Phase_name = map[int32]string{ + 0: "UNKNOWN", + 1: "SCALING_UP", + 2: "SCALING_DOWN", + 3: "RUNNING", + 4: "DESTROYING", + } + ClusterStatusSpec_Phase_value = map[string]int32{ + "UNKNOWN": 0, + "SCALING_UP": 1, + "SCALING_DOWN": 2, + "RUNNING": 3, + "DESTROYING": 4, + } +) + +func (x ClusterStatusSpec_Phase) Enum() *ClusterStatusSpec_Phase { + p := new(ClusterStatusSpec_Phase) + *p = x + return p +} + +func (x ClusterStatusSpec_Phase) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ClusterStatusSpec_Phase) Descriptor() protoreflect.EnumDescriptor { + return file_omni_specs_omni_proto_enumTypes[6].Descriptor() +} + +func (ClusterStatusSpec_Phase) Type() protoreflect.EnumType { + return &file_omni_specs_omni_proto_enumTypes[6] +} + +func (x ClusterStatusSpec_Phase) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ClusterStatusSpec_Phase.Descriptor instead. +func (ClusterStatusSpec_Phase) EnumDescriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{23, 0} +} + +// UpdateStrategy defines the update strategy of the machine set. +type MachineSetSpec_UpdateStrategy int32 + +const ( + MachineSetSpec_Unset MachineSetSpec_UpdateStrategy = 0 + MachineSetSpec_Rolling MachineSetSpec_UpdateStrategy = 1 +) + +// Enum value maps for MachineSetSpec_UpdateStrategy. +var ( + MachineSetSpec_UpdateStrategy_name = map[int32]string{ + 0: "Unset", + 1: "Rolling", + } + MachineSetSpec_UpdateStrategy_value = map[string]int32{ + "Unset": 0, + "Rolling": 1, + } +) + +func (x MachineSetSpec_UpdateStrategy) Enum() *MachineSetSpec_UpdateStrategy { + p := new(MachineSetSpec_UpdateStrategy) + *p = x + return p +} + +func (x MachineSetSpec_UpdateStrategy) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (MachineSetSpec_UpdateStrategy) Descriptor() protoreflect.EnumDescriptor { + return file_omni_specs_omni_proto_enumTypes[7].Descriptor() +} + +func (MachineSetSpec_UpdateStrategy) Type() protoreflect.EnumType { + return &file_omni_specs_omni_proto_enumTypes[7] +} + +func (x MachineSetSpec_UpdateStrategy) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use MachineSetSpec_UpdateStrategy.Descriptor instead. +func (MachineSetSpec_UpdateStrategy) EnumDescriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{35, 0} +} + +type MachineSetSpec_MachineClass_AllocationType int32 + +const ( + // Static uses the count defined in the count field. + MachineSetSpec_MachineClass_Static MachineSetSpec_MachineClass_AllocationType = 0 + // Unlimited allocates all available machines from the machine class. + MachineSetSpec_MachineClass_Unlimited MachineSetSpec_MachineClass_AllocationType = 1 +) + +// Enum value maps for MachineSetSpec_MachineClass_AllocationType. +var ( + MachineSetSpec_MachineClass_AllocationType_name = map[int32]string{ + 0: "Static", + 1: "Unlimited", + } + MachineSetSpec_MachineClass_AllocationType_value = map[string]int32{ + "Static": 0, + "Unlimited": 1, + } +) + +func (x MachineSetSpec_MachineClass_AllocationType) Enum() *MachineSetSpec_MachineClass_AllocationType { + p := new(MachineSetSpec_MachineClass_AllocationType) + *p = x + return p +} + +func (x MachineSetSpec_MachineClass_AllocationType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (MachineSetSpec_MachineClass_AllocationType) Descriptor() protoreflect.EnumDescriptor { + return file_omni_specs_omni_proto_enumTypes[8].Descriptor() +} + +func (MachineSetSpec_MachineClass_AllocationType) Type() protoreflect.EnumType { + return &file_omni_specs_omni_proto_enumTypes[8] +} + +func (x MachineSetSpec_MachineClass_AllocationType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use MachineSetSpec_MachineClass_AllocationType.Descriptor instead. +func (MachineSetSpec_MachineClass_AllocationType) EnumDescriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{35, 0, 0} +} + +type TalosUpgradeStatusSpec_Phase int32 + +const ( + TalosUpgradeStatusSpec_Unknown TalosUpgradeStatusSpec_Phase = 0 + TalosUpgradeStatusSpec_Upgrading TalosUpgradeStatusSpec_Phase = 1 + TalosUpgradeStatusSpec_Done TalosUpgradeStatusSpec_Phase = 2 + TalosUpgradeStatusSpec_Failed TalosUpgradeStatusSpec_Phase = 3 + TalosUpgradeStatusSpec_Reverting TalosUpgradeStatusSpec_Phase = 4 +) + +// Enum value maps for TalosUpgradeStatusSpec_Phase. +var ( + TalosUpgradeStatusSpec_Phase_name = map[int32]string{ + 0: "Unknown", + 1: "Upgrading", + 2: "Done", + 3: "Failed", + 4: "Reverting", + } + TalosUpgradeStatusSpec_Phase_value = map[string]int32{ + "Unknown": 0, + "Upgrading": 1, + "Done": 2, + "Failed": 3, + "Reverting": 4, + } +) + +func (x TalosUpgradeStatusSpec_Phase) Enum() *TalosUpgradeStatusSpec_Phase { + p := new(TalosUpgradeStatusSpec_Phase) + *p = x + return p +} + +func (x TalosUpgradeStatusSpec_Phase) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (TalosUpgradeStatusSpec_Phase) Descriptor() protoreflect.EnumDescriptor { + return file_omni_specs_omni_proto_enumTypes[9].Descriptor() +} + +func (TalosUpgradeStatusSpec_Phase) Type() protoreflect.EnumType { + return &file_omni_specs_omni_proto_enumTypes[9] +} + +func (x TalosUpgradeStatusSpec_Phase) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use TalosUpgradeStatusSpec_Phase.Descriptor instead. +func (TalosUpgradeStatusSpec_Phase) EnumDescriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{36, 0} +} + +type ControlPlaneStatusSpec_Condition_Status int32 + +const ( + ControlPlaneStatusSpec_Condition_Unknown ControlPlaneStatusSpec_Condition_Status = 0 + ControlPlaneStatusSpec_Condition_Ready ControlPlaneStatusSpec_Condition_Status = 1 + ControlPlaneStatusSpec_Condition_NotReady ControlPlaneStatusSpec_Condition_Status = 2 +) + +// Enum value maps for ControlPlaneStatusSpec_Condition_Status. +var ( + ControlPlaneStatusSpec_Condition_Status_name = map[int32]string{ + 0: "Unknown", + 1: "Ready", + 2: "NotReady", + } + ControlPlaneStatusSpec_Condition_Status_value = map[string]int32{ + "Unknown": 0, + "Ready": 1, + "NotReady": 2, + } +) + +func (x ControlPlaneStatusSpec_Condition_Status) Enum() *ControlPlaneStatusSpec_Condition_Status { + p := new(ControlPlaneStatusSpec_Condition_Status) + *p = x + return p +} + +func (x ControlPlaneStatusSpec_Condition_Status) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ControlPlaneStatusSpec_Condition_Status) Descriptor() protoreflect.EnumDescriptor { + return file_omni_specs_omni_proto_enumTypes[10].Descriptor() +} + +func (ControlPlaneStatusSpec_Condition_Status) Type() protoreflect.EnumType { + return &file_omni_specs_omni_proto_enumTypes[10] +} + +func (x ControlPlaneStatusSpec_Condition_Status) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ControlPlaneStatusSpec_Condition_Status.Descriptor instead. +func (ControlPlaneStatusSpec_Condition_Status) EnumDescriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{41, 0, 0} +} + +type ControlPlaneStatusSpec_Condition_Severity int32 + +const ( + ControlPlaneStatusSpec_Condition_Info ControlPlaneStatusSpec_Condition_Severity = 0 + ControlPlaneStatusSpec_Condition_Warning ControlPlaneStatusSpec_Condition_Severity = 1 + ControlPlaneStatusSpec_Condition_Error ControlPlaneStatusSpec_Condition_Severity = 2 +) + +// Enum value maps for ControlPlaneStatusSpec_Condition_Severity. +var ( + ControlPlaneStatusSpec_Condition_Severity_name = map[int32]string{ + 0: "Info", + 1: "Warning", + 2: "Error", + } + ControlPlaneStatusSpec_Condition_Severity_value = map[string]int32{ + "Info": 0, + "Warning": 1, + "Error": 2, + } +) + +func (x ControlPlaneStatusSpec_Condition_Severity) Enum() *ControlPlaneStatusSpec_Condition_Severity { + p := new(ControlPlaneStatusSpec_Condition_Severity) + *p = x + return p +} + +func (x ControlPlaneStatusSpec_Condition_Severity) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ControlPlaneStatusSpec_Condition_Severity) Descriptor() protoreflect.EnumDescriptor { + return file_omni_specs_omni_proto_enumTypes[11].Descriptor() +} + +func (ControlPlaneStatusSpec_Condition_Severity) Type() protoreflect.EnumType { + return &file_omni_specs_omni_proto_enumTypes[11] +} + +func (x ControlPlaneStatusSpec_Condition_Severity) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ControlPlaneStatusSpec_Condition_Severity.Descriptor instead. +func (ControlPlaneStatusSpec_Condition_Severity) EnumDescriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{41, 0, 1} +} + +type KubernetesUpgradeStatusSpec_Phase int32 + +const ( + KubernetesUpgradeStatusSpec_Unknown KubernetesUpgradeStatusSpec_Phase = 0 + KubernetesUpgradeStatusSpec_Upgrading KubernetesUpgradeStatusSpec_Phase = 1 + KubernetesUpgradeStatusSpec_Done KubernetesUpgradeStatusSpec_Phase = 2 + KubernetesUpgradeStatusSpec_Failed KubernetesUpgradeStatusSpec_Phase = 3 + KubernetesUpgradeStatusSpec_Reverting KubernetesUpgradeStatusSpec_Phase = 4 +) + +// Enum value maps for KubernetesUpgradeStatusSpec_Phase. +var ( + KubernetesUpgradeStatusSpec_Phase_name = map[int32]string{ + 0: "Unknown", + 1: "Upgrading", + 2: "Done", + 3: "Failed", + 4: "Reverting", + } + KubernetesUpgradeStatusSpec_Phase_value = map[string]int32{ + "Unknown": 0, + "Upgrading": 1, + "Done": 2, + "Failed": 3, + "Reverting": 4, + } +) + +func (x KubernetesUpgradeStatusSpec_Phase) Enum() *KubernetesUpgradeStatusSpec_Phase { + p := new(KubernetesUpgradeStatusSpec_Phase) + *p = x + return p +} + +func (x KubernetesUpgradeStatusSpec_Phase) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (KubernetesUpgradeStatusSpec_Phase) Descriptor() protoreflect.EnumDescriptor { + return file_omni_specs_omni_proto_enumTypes[12].Descriptor() +} + +func (KubernetesUpgradeStatusSpec_Phase) Type() protoreflect.EnumType { + return &file_omni_specs_omni_proto_enumTypes[12] +} + +func (x KubernetesUpgradeStatusSpec_Phase) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use KubernetesUpgradeStatusSpec_Phase.Descriptor instead. +func (KubernetesUpgradeStatusSpec_Phase) EnumDescriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{44, 0} +} + +type SchematicConfigurationSpec_Target int32 + +const ( + SchematicConfigurationSpec_Unknown SchematicConfigurationSpec_Target = 0 + SchematicConfigurationSpec_ClusterMachine SchematicConfigurationSpec_Target = 1 + SchematicConfigurationSpec_MachineSet SchematicConfigurationSpec_Target = 2 + SchematicConfigurationSpec_Cluster SchematicConfigurationSpec_Target = 3 +) + +// Enum value maps for SchematicConfigurationSpec_Target. +var ( + SchematicConfigurationSpec_Target_name = map[int32]string{ + 0: "Unknown", + 1: "ClusterMachine", + 2: "MachineSet", + 3: "Cluster", + } + SchematicConfigurationSpec_Target_value = map[string]int32{ + "Unknown": 0, + "ClusterMachine": 1, + "MachineSet": 2, + "Cluster": 3, + } +) + +func (x SchematicConfigurationSpec_Target) Enum() *SchematicConfigurationSpec_Target { + p := new(SchematicConfigurationSpec_Target) + *p = x + return p +} + +func (x SchematicConfigurationSpec_Target) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SchematicConfigurationSpec_Target) Descriptor() protoreflect.EnumDescriptor { + return file_omni_specs_omni_proto_enumTypes[13].Descriptor() +} + +func (SchematicConfigurationSpec_Target) Type() protoreflect.EnumType { + return &file_omni_specs_omni_proto_enumTypes[13] +} + +func (x SchematicConfigurationSpec_Target) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use SchematicConfigurationSpec_Target.Descriptor instead. +func (SchematicConfigurationSpec_Target) EnumDescriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{61, 0} +} + +// MachineSpec describes a Machine. +type MachineSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // IP which can be used to access Talos API. + ManagementAddress string `protobuf:"bytes,1,opt,name=management_address,json=managementAddress,proto3" json:"management_address,omitempty"` + // Connected is copied from the corresponding Link resource. + Connected bool `protobuf:"varint,2,opt,name=connected,proto3" json:"connected,omitempty"` +} + +func (x *MachineSpec) Reset() { + *x = MachineSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MachineSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MachineSpec) ProtoMessage() {} + +func (x *MachineSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MachineSpec.ProtoReflect.Descriptor instead. +func (*MachineSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{0} +} + +func (x *MachineSpec) GetManagementAddress() string { + if x != nil { + return x.ManagementAddress + } + return "" +} + +func (x *MachineSpec) GetConnected() bool { + if x != nil { + return x.Connected + } + return false +} + +// MachineStatusSpec describes state of a Machine. +type MachineStatusSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Talos version. + TalosVersion string `protobuf:"bytes,1,opt,name=talos_version,json=talosVersion,proto3" json:"talos_version,omitempty"` + // Hardware-related information. + Hardware *MachineStatusSpec_HardwareStatus `protobuf:"bytes,2,opt,name=hardware,proto3" json:"hardware,omitempty"` + // Network-related information. + Network *MachineStatusSpec_NetworkStatus `protobuf:"bytes,3,opt,name=network,proto3" json:"network,omitempty"` + // Set if the last poll resulted in an error. + LastError string `protobuf:"bytes,4,opt,name=last_error,json=lastError,proto3" json:"last_error,omitempty"` + // Management address is copied from the machine resource. + ManagementAddress string `protobuf:"bytes,5,opt,name=management_address,json=managementAddress,proto3" json:"management_address,omitempty"` + // Connected is copied from the corresponding Link resource. + Connected bool `protobuf:"varint,6,opt,name=connected,proto3" json:"connected,omitempty"` + // Maintenance flag means that the node is running in the maintenance mode. + Maintenance bool `protobuf:"varint,7,opt,name=maintenance,proto3" json:"maintenance,omitempty"` + // Cluster is the name of the cluster the machine belongs to. + Cluster string `protobuf:"bytes,9,opt,name=cluster,proto3" json:"cluster,omitempty"` + // Role is the role of the machine in the cluster. + Role MachineStatusSpec_Role `protobuf:"varint,10,opt,name=role,proto3,enum=specs.MachineStatusSpec_Role" json:"role,omitempty"` + // Platform-specific information. + PlatformMetadata *MachineStatusSpec_PlatformMetadata `protobuf:"bytes,11,opt,name=platform_metadata,json=platformMetadata,proto3" json:"platform_metadata,omitempty"` + ImageLabels map[string]string `protobuf:"bytes,13,rep,name=image_labels,json=imageLabels,proto3" json:"image_labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Schematic *MachineStatusSpec_Schematic `protobuf:"bytes,14,opt,name=schematic,proto3" json:"schematic,omitempty"` +} + +func (x *MachineStatusSpec) Reset() { + *x = MachineStatusSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MachineStatusSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MachineStatusSpec) ProtoMessage() {} + +func (x *MachineStatusSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MachineStatusSpec.ProtoReflect.Descriptor instead. +func (*MachineStatusSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{1} +} + +func (x *MachineStatusSpec) GetTalosVersion() string { + if x != nil { + return x.TalosVersion + } + return "" +} + +func (x *MachineStatusSpec) GetHardware() *MachineStatusSpec_HardwareStatus { + if x != nil { + return x.Hardware + } + return nil +} + +func (x *MachineStatusSpec) GetNetwork() *MachineStatusSpec_NetworkStatus { + if x != nil { + return x.Network + } + return nil +} + +func (x *MachineStatusSpec) GetLastError() string { + if x != nil { + return x.LastError + } + return "" +} + +func (x *MachineStatusSpec) GetManagementAddress() string { + if x != nil { + return x.ManagementAddress + } + return "" +} + +func (x *MachineStatusSpec) GetConnected() bool { + if x != nil { + return x.Connected + } + return false +} + +func (x *MachineStatusSpec) GetMaintenance() bool { + if x != nil { + return x.Maintenance + } + return false +} + +func (x *MachineStatusSpec) GetCluster() string { + if x != nil { + return x.Cluster + } + return "" +} + +func (x *MachineStatusSpec) GetRole() MachineStatusSpec_Role { + if x != nil { + return x.Role + } + return MachineStatusSpec_NONE +} + +func (x *MachineStatusSpec) GetPlatformMetadata() *MachineStatusSpec_PlatformMetadata { + if x != nil { + return x.PlatformMetadata + } + return nil +} + +func (x *MachineStatusSpec) GetImageLabels() map[string]string { + if x != nil { + return x.ImageLabels + } + return nil +} + +func (x *MachineStatusSpec) GetSchematic() *MachineStatusSpec_Schematic { + if x != nil { + return x.Schematic + } + return nil +} + +// TalosConfigSpec describes a Talos cluster config. +type TalosConfigSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Ca certificate authority. + Ca string `protobuf:"bytes,1,opt,name=ca,proto3" json:"ca,omitempty"` + // Crt certificate. + Crt string `protobuf:"bytes,2,opt,name=crt,proto3" json:"crt,omitempty"` + // Key certificate key. + Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` +} + +func (x *TalosConfigSpec) Reset() { + *x = TalosConfigSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TalosConfigSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TalosConfigSpec) ProtoMessage() {} + +func (x *TalosConfigSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TalosConfigSpec.ProtoReflect.Descriptor instead. +func (*TalosConfigSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{2} +} + +func (x *TalosConfigSpec) GetCa() string { + if x != nil { + return x.Ca + } + return "" +} + +func (x *TalosConfigSpec) GetCrt() string { + if x != nil { + return x.Crt + } + return "" +} + +func (x *TalosConfigSpec) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +// Cluster describes a Talos cluster. +type ClusterSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // InstallImage the installer image to use. + // + // Deprecated: Marked as deprecated in omni/specs/omni.proto. + InstallImage string `protobuf:"bytes,1,opt,name=install_image,json=installImage,proto3" json:"install_image,omitempty"` + // KubernetesVersion to use on the node. + KubernetesVersion string `protobuf:"bytes,2,opt,name=kubernetes_version,json=kubernetesVersion,proto3" json:"kubernetes_version,omitempty"` + // TalosVersion cluster wide Talos version. + TalosVersion string `protobuf:"bytes,3,opt,name=talos_version,json=talosVersion,proto3" json:"talos_version,omitempty"` + // Features are the cluster features. + Features *ClusterSpec_Features `protobuf:"bytes,4,opt,name=features,proto3" json:"features,omitempty"` + // Backup describes the backup configuration. If it set to null that means that backups are disabled for this cluster. + BackupConfiguration *EtcdBackupConf `protobuf:"bytes,5,opt,name=backup_configuration,json=backupConfiguration,proto3" json:"backup_configuration,omitempty"` +} + +func (x *ClusterSpec) Reset() { + *x = ClusterSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ClusterSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClusterSpec) ProtoMessage() {} + +func (x *ClusterSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ClusterSpec.ProtoReflect.Descriptor instead. +func (*ClusterSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{3} +} + +// Deprecated: Marked as deprecated in omni/specs/omni.proto. +func (x *ClusterSpec) GetInstallImage() string { + if x != nil { + return x.InstallImage + } + return "" +} + +func (x *ClusterSpec) GetKubernetesVersion() string { + if x != nil { + return x.KubernetesVersion + } + return "" +} + +func (x *ClusterSpec) GetTalosVersion() string { + if x != nil { + return x.TalosVersion + } + return "" +} + +func (x *ClusterSpec) GetFeatures() *ClusterSpec_Features { + if x != nil { + return x.Features + } + return nil +} + +func (x *ClusterSpec) GetBackupConfiguration() *EtcdBackupConf { + if x != nil { + return x.BackupConfiguration + } + return nil +} + +// EtcdBackupConf describes the backup configuration. +type EtcdBackupConf struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Interval is the interval between backups. If not set, backups are disabled. + Interval *durationpb.Duration `protobuf:"bytes,1,opt,name=interval,proto3" json:"interval,omitempty"` + // Enabled etcd backups. + Enabled bool `protobuf:"varint,2,opt,name=enabled,proto3" json:"enabled,omitempty"` +} + +func (x *EtcdBackupConf) Reset() { + *x = EtcdBackupConf{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EtcdBackupConf) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EtcdBackupConf) ProtoMessage() {} + +func (x *EtcdBackupConf) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EtcdBackupConf.ProtoReflect.Descriptor instead. +func (*EtcdBackupConf) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{4} +} + +func (x *EtcdBackupConf) GetInterval() *durationpb.Duration { + if x != nil { + return x.Interval + } + return nil +} + +func (x *EtcdBackupConf) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +// EtcdBackupEncryptionSpec describes the backup encryption. +type EtcdBackupEncryptionSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + EncryptionKey []byte `protobuf:"bytes,1,opt,name=encryption_key,json=encryptionKey,proto3" json:"encryption_key,omitempty"` +} + +func (x *EtcdBackupEncryptionSpec) Reset() { + *x = EtcdBackupEncryptionSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EtcdBackupEncryptionSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EtcdBackupEncryptionSpec) ProtoMessage() {} + +func (x *EtcdBackupEncryptionSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EtcdBackupEncryptionSpec.ProtoReflect.Descriptor instead. +func (*EtcdBackupEncryptionSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{5} +} + +func (x *EtcdBackupEncryptionSpec) GetEncryptionKey() []byte { + if x != nil { + return x.EncryptionKey + } + return nil +} + +// EtcdBackupHeader describes the backup header. +type EtcdBackupHeader struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Version is the version of the backup creator. + Version int64 `protobuf:"varint,1,opt,name=version,proto3" json:"version,omitempty"` +} + +func (x *EtcdBackupHeader) Reset() { + *x = EtcdBackupHeader{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EtcdBackupHeader) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EtcdBackupHeader) ProtoMessage() {} + +func (x *EtcdBackupHeader) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EtcdBackupHeader.ProtoReflect.Descriptor instead. +func (*EtcdBackupHeader) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{6} +} + +func (x *EtcdBackupHeader) GetVersion() int64 { + if x != nil { + return x.Version + } + return 0 +} + +// EtcdBackupSpec describes the backup. +type EtcdBackupSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // CreatedAt is the time when the backup was created. + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + // Snapshot is the snapshot file name. + Snapshot string `protobuf:"bytes,2,opt,name=snapshot,proto3" json:"snapshot,omitempty"` + // Size specifies the etcd backup size. + Size uint64 `protobuf:"varint,3,opt,name=size,proto3" json:"size,omitempty"` +} + +func (x *EtcdBackupSpec) Reset() { + *x = EtcdBackupSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EtcdBackupSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EtcdBackupSpec) ProtoMessage() {} + +func (x *EtcdBackupSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EtcdBackupSpec.ProtoReflect.Descriptor instead. +func (*EtcdBackupSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{7} +} + +func (x *EtcdBackupSpec) GetCreatedAt() *timestamppb.Timestamp { + if x != nil { + return x.CreatedAt + } + return nil +} + +func (x *EtcdBackupSpec) GetSnapshot() string { + if x != nil { + return x.Snapshot + } + return "" +} + +func (x *EtcdBackupSpec) GetSize() uint64 { + if x != nil { + return x.Size + } + return 0 +} + +// BackupDataSpec describes the data needed for etcd backup. +type BackupDataSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Interval *durationpb.Duration `protobuf:"bytes,1,opt,name=interval,proto3" json:"interval,omitempty"` + ClusterUuid string `protobuf:"bytes,2,opt,name=cluster_uuid,json=clusterUuid,proto3" json:"cluster_uuid,omitempty"` + EncryptionKey []byte `protobuf:"bytes,3,opt,name=encryption_key,json=encryptionKey,proto3" json:"encryption_key,omitempty"` + AesCbcEncryptionSecret string `protobuf:"bytes,4,opt,name=aes_cbc_encryption_secret,json=aesCbcEncryptionSecret,proto3" json:"aes_cbc_encryption_secret,omitempty"` + SecretboxEncryptionSecret string `protobuf:"bytes,5,opt,name=secretbox_encryption_secret,json=secretboxEncryptionSecret,proto3" json:"secretbox_encryption_secret,omitempty"` +} + +func (x *BackupDataSpec) Reset() { + *x = BackupDataSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BackupDataSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BackupDataSpec) ProtoMessage() {} + +func (x *BackupDataSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BackupDataSpec.ProtoReflect.Descriptor instead. +func (*BackupDataSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{8} +} + +func (x *BackupDataSpec) GetInterval() *durationpb.Duration { + if x != nil { + return x.Interval + } + return nil +} + +func (x *BackupDataSpec) GetClusterUuid() string { + if x != nil { + return x.ClusterUuid + } + return "" +} + +func (x *BackupDataSpec) GetEncryptionKey() []byte { + if x != nil { + return x.EncryptionKey + } + return nil +} + +func (x *BackupDataSpec) GetAesCbcEncryptionSecret() string { + if x != nil { + return x.AesCbcEncryptionSecret + } + return "" +} + +func (x *BackupDataSpec) GetSecretboxEncryptionSecret() string { + if x != nil { + return x.SecretboxEncryptionSecret + } + return "" +} + +// EtcdBackupS3ConfSpec describes the S3 configuration for the backup process. +type EtcdBackupS3ConfSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Region string `protobuf:"bytes,2,opt,name=region,proto3" json:"region,omitempty"` + Endpoint string `protobuf:"bytes,3,opt,name=endpoint,proto3" json:"endpoint,omitempty"` + AccessKeyId string `protobuf:"bytes,4,opt,name=access_key_id,json=accessKeyId,proto3" json:"access_key_id,omitempty"` + SecretAccessKey string `protobuf:"bytes,5,opt,name=secret_access_key,json=secretAccessKey,proto3" json:"secret_access_key,omitempty"` + SessionToken string `protobuf:"bytes,6,opt,name=session_token,json=sessionToken,proto3" json:"session_token,omitempty"` +} + +func (x *EtcdBackupS3ConfSpec) Reset() { + *x = EtcdBackupS3ConfSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EtcdBackupS3ConfSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EtcdBackupS3ConfSpec) ProtoMessage() {} + +func (x *EtcdBackupS3ConfSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EtcdBackupS3ConfSpec.ProtoReflect.Descriptor instead. +func (*EtcdBackupS3ConfSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{9} +} + +func (x *EtcdBackupS3ConfSpec) GetBucket() string { + if x != nil { + return x.Bucket + } + return "" +} + +func (x *EtcdBackupS3ConfSpec) GetRegion() string { + if x != nil { + return x.Region + } + return "" +} + +func (x *EtcdBackupS3ConfSpec) GetEndpoint() string { + if x != nil { + return x.Endpoint + } + return "" +} + +func (x *EtcdBackupS3ConfSpec) GetAccessKeyId() string { + if x != nil { + return x.AccessKeyId + } + return "" +} + +func (x *EtcdBackupS3ConfSpec) GetSecretAccessKey() string { + if x != nil { + return x.SecretAccessKey + } + return "" +} + +func (x *EtcdBackupS3ConfSpec) GetSessionToken() string { + if x != nil { + return x.SessionToken + } + return "" +} + +// EtcdBackupStatus describes cluster last backup status. +type EtcdBackupStatusSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Status is the status of the last backup. + Status EtcdBackupStatusSpec_Status `protobuf:"varint,1,opt,name=status,proto3,enum=specs.EtcdBackupStatusSpec_Status" json:"status,omitempty"` + // Error is the error message if the backup failed. + Error string `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` + // LastBackupTime is the time of the last backup. + LastBackupTime *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=last_backup_time,json=lastBackupTime,proto3" json:"last_backup_time,omitempty"` + // LastBackupAttempt is the time of the last backup attempt. + LastBackupAttempt *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=last_backup_attempt,json=lastBackupAttempt,proto3" json:"last_backup_attempt,omitempty"` +} + +func (x *EtcdBackupStatusSpec) Reset() { + *x = EtcdBackupStatusSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EtcdBackupStatusSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EtcdBackupStatusSpec) ProtoMessage() {} + +func (x *EtcdBackupStatusSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EtcdBackupStatusSpec.ProtoReflect.Descriptor instead. +func (*EtcdBackupStatusSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{10} +} + +func (x *EtcdBackupStatusSpec) GetStatus() EtcdBackupStatusSpec_Status { + if x != nil { + return x.Status + } + return EtcdBackupStatusSpec_Unknown +} + +func (x *EtcdBackupStatusSpec) GetError() string { + if x != nil { + return x.Error + } + return "" +} + +func (x *EtcdBackupStatusSpec) GetLastBackupTime() *timestamppb.Timestamp { + if x != nil { + return x.LastBackupTime + } + return nil +} + +func (x *EtcdBackupStatusSpec) GetLastBackupAttempt() *timestamppb.Timestamp { + if x != nil { + return x.LastBackupAttempt + } + return nil +} + +// EtcdManualBackupSpec describes the manual backup request. +type EtcdManualBackupSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // BackupAt is the time when the backup should be created. + BackupAt *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=backup_at,json=backupAt,proto3" json:"backup_at,omitempty"` +} + +func (x *EtcdManualBackupSpec) Reset() { + *x = EtcdManualBackupSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EtcdManualBackupSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EtcdManualBackupSpec) ProtoMessage() {} + +func (x *EtcdManualBackupSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EtcdManualBackupSpec.ProtoReflect.Descriptor instead. +func (*EtcdManualBackupSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{11} +} + +func (x *EtcdManualBackupSpec) GetBackupAt() *timestamppb.Timestamp { + if x != nil { + return x.BackupAt + } + return nil +} + +// EtcdBackupStoreStatusSpec is internal resource that decribes store configuration name and configuration last error. +type EtcdBackupStoreStatusSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // ConfigurationName is the name of the configuration (disabled|local|s3). + ConfigurationName string `protobuf:"bytes,1,opt,name=configuration_name,json=configurationName,proto3" json:"configuration_name,omitempty"` + // ConfigurationError is the error message if the configuration is invalid. + ConfigurationError string `protobuf:"bytes,2,opt,name=configuration_error,json=configurationError,proto3" json:"configuration_error,omitempty"` +} + +func (x *EtcdBackupStoreStatusSpec) Reset() { + *x = EtcdBackupStoreStatusSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EtcdBackupStoreStatusSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EtcdBackupStoreStatusSpec) ProtoMessage() {} + +func (x *EtcdBackupStoreStatusSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EtcdBackupStoreStatusSpec.ProtoReflect.Descriptor instead. +func (*EtcdBackupStoreStatusSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{12} +} + +func (x *EtcdBackupStoreStatusSpec) GetConfigurationName() string { + if x != nil { + return x.ConfigurationName + } + return "" +} + +func (x *EtcdBackupStoreStatusSpec) GetConfigurationError() string { + if x != nil { + return x.ConfigurationError + } + return "" +} + +// EtcdBackupOverallStatusSpec describes the overall etcd backup system status. +type EtcdBackupOverallStatusSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // ConfigurationName is the name of the configuration (disabled|local|s3). + ConfigurationName string `protobuf:"bytes,1,opt,name=configuration_name,json=configurationName,proto3" json:"configuration_name,omitempty"` + // ConfigurationError is the error message if the configuration is invalid. + ConfigurationError string `protobuf:"bytes,2,opt,name=configuration_error,json=configurationError,proto3" json:"configuration_error,omitempty"` + // LastBackupStatus is the status of the last backup. + LastBackupStatus *EtcdBackupStatusSpec `protobuf:"bytes,3,opt,name=last_backup_status,json=lastBackupStatus,proto3" json:"last_backup_status,omitempty"` +} + +func (x *EtcdBackupOverallStatusSpec) Reset() { + *x = EtcdBackupOverallStatusSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EtcdBackupOverallStatusSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EtcdBackupOverallStatusSpec) ProtoMessage() {} + +func (x *EtcdBackupOverallStatusSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EtcdBackupOverallStatusSpec.ProtoReflect.Descriptor instead. +func (*EtcdBackupOverallStatusSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{13} +} + +func (x *EtcdBackupOverallStatusSpec) GetConfigurationName() string { + if x != nil { + return x.ConfigurationName + } + return "" +} + +func (x *EtcdBackupOverallStatusSpec) GetConfigurationError() string { + if x != nil { + return x.ConfigurationError + } + return "" +} + +func (x *EtcdBackupOverallStatusSpec) GetLastBackupStatus() *EtcdBackupStatusSpec { + if x != nil { + return x.LastBackupStatus + } + return nil +} + +// ClusterMachineSpec describes a machine attached to a Cluster. +type ClusterMachineSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // KubernetesVersion to use on the machine (copied from Cluster at the moment of creation). + KubernetesVersion string `protobuf:"bytes,2,opt,name=kubernetes_version,json=kubernetesVersion,proto3" json:"kubernetes_version,omitempty"` +} + +func (x *ClusterMachineSpec) Reset() { + *x = ClusterMachineSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ClusterMachineSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClusterMachineSpec) ProtoMessage() {} + +func (x *ClusterMachineSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ClusterMachineSpec.ProtoReflect.Descriptor instead. +func (*ClusterMachineSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{14} +} + +func (x *ClusterMachineSpec) GetKubernetesVersion() string { + if x != nil { + return x.KubernetesVersion + } + return "" +} + +// ClusterMachineConfigPatchesSpec keeps the list of config patches to be applied on the machine. +type ClusterMachineConfigPatchesSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // List of patches combined from all sources, as a final list of patches to apply. + Patches []string `protobuf:"bytes,1,rep,name=patches,proto3" json:"patches,omitempty"` +} + +func (x *ClusterMachineConfigPatchesSpec) Reset() { + *x = ClusterMachineConfigPatchesSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ClusterMachineConfigPatchesSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClusterMachineConfigPatchesSpec) ProtoMessage() {} + +func (x *ClusterMachineConfigPatchesSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[15] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ClusterMachineConfigPatchesSpec.ProtoReflect.Descriptor instead. +func (*ClusterMachineConfigPatchesSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{15} +} + +func (x *ClusterMachineConfigPatchesSpec) GetPatches() []string { + if x != nil { + return x.Patches + } + return nil +} + +// ClusterMachineTalosVersionSpec describes a machine Talos version and schematic. +type ClusterMachineTalosVersionSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TalosVersion string `protobuf:"bytes,1,opt,name=talos_version,json=talosVersion,proto3" json:"talos_version,omitempty"` + SchematicId string `protobuf:"bytes,2,opt,name=schematic_id,json=schematicId,proto3" json:"schematic_id,omitempty"` +} + +func (x *ClusterMachineTalosVersionSpec) Reset() { + *x = ClusterMachineTalosVersionSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ClusterMachineTalosVersionSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClusterMachineTalosVersionSpec) ProtoMessage() {} + +func (x *ClusterMachineTalosVersionSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[16] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ClusterMachineTalosVersionSpec.ProtoReflect.Descriptor instead. +func (*ClusterMachineTalosVersionSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{16} +} + +func (x *ClusterMachineTalosVersionSpec) GetTalosVersion() string { + if x != nil { + return x.TalosVersion + } + return "" +} + +func (x *ClusterMachineTalosVersionSpec) GetSchematicId() string { + if x != nil { + return x.SchematicId + } + return "" +} + +// ClusterMachineConfigSpec stores generated Talos node machine config. +type ClusterMachineConfigSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Data []byte `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` + ClusterMachineVersion string `protobuf:"bytes,2,opt,name=cluster_machine_version,json=clusterMachineVersion,proto3" json:"cluster_machine_version,omitempty"` + GenerationError string `protobuf:"bytes,3,opt,name=generation_error,json=generationError,proto3" json:"generation_error,omitempty"` +} + +func (x *ClusterMachineConfigSpec) Reset() { + *x = ClusterMachineConfigSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ClusterMachineConfigSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClusterMachineConfigSpec) ProtoMessage() {} + +func (x *ClusterMachineConfigSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[17] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ClusterMachineConfigSpec.ProtoReflect.Descriptor instead. +func (*ClusterMachineConfigSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{17} +} + +func (x *ClusterMachineConfigSpec) GetData() []byte { + if x != nil { + return x.Data + } + return nil +} + +func (x *ClusterMachineConfigSpec) GetClusterMachineVersion() string { + if x != nil { + return x.ClusterMachineVersion + } + return "" +} + +func (x *ClusterMachineConfigSpec) GetGenerationError() string { + if x != nil { + return x.GenerationError + } + return "" +} + +// ClusterMachineConfigSpec stores generated Talos node machine config. +type RedactedClusterMachineConfigSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Data string `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` +} + +func (x *RedactedClusterMachineConfigSpec) Reset() { + *x = RedactedClusterMachineConfigSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RedactedClusterMachineConfigSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RedactedClusterMachineConfigSpec) ProtoMessage() {} + +func (x *RedactedClusterMachineConfigSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[18] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RedactedClusterMachineConfigSpec.ProtoReflect.Descriptor instead. +func (*RedactedClusterMachineConfigSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{18} +} + +func (x *RedactedClusterMachineConfigSpec) GetData() string { + if x != nil { + return x.Data + } + return "" +} + +// ClusterMachineIdentity keeps ClusterMachine related node information. +type ClusterMachineIdentitySpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // NodeIdentity is Talos node identity from Identity resource. + NodeIdentity string `protobuf:"bytes,1,opt,name=node_identity,json=nodeIdentity,proto3" json:"node_identity,omitempty"` + // EtcdMemberId is the id of the node how it's represented in the etcd quorum. + EtcdMemberId uint64 `protobuf:"varint,2,opt,name=etcd_member_id,json=etcdMemberId,proto3" json:"etcd_member_id,omitempty"` + // Nodename is the Kubernetes node name. + Nodename string `protobuf:"bytes,3,opt,name=nodename,proto3" json:"nodename,omitempty"` + // NodeIps are the IPs of the Kubernetes node. + NodeIps []string `protobuf:"bytes,8,rep,name=node_ips,json=nodeIps,proto3" json:"node_ips,omitempty"` +} + +func (x *ClusterMachineIdentitySpec) Reset() { + *x = ClusterMachineIdentitySpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ClusterMachineIdentitySpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClusterMachineIdentitySpec) ProtoMessage() {} + +func (x *ClusterMachineIdentitySpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[19] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ClusterMachineIdentitySpec.ProtoReflect.Descriptor instead. +func (*ClusterMachineIdentitySpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{19} +} + +func (x *ClusterMachineIdentitySpec) GetNodeIdentity() string { + if x != nil { + return x.NodeIdentity + } + return "" +} + +func (x *ClusterMachineIdentitySpec) GetEtcdMemberId() uint64 { + if x != nil { + return x.EtcdMemberId + } + return 0 +} + +func (x *ClusterMachineIdentitySpec) GetNodename() string { + if x != nil { + return x.Nodename + } + return "" +} + +func (x *ClusterMachineIdentitySpec) GetNodeIps() []string { + if x != nil { + return x.NodeIps + } + return nil +} + +// ClusterMachineTemplateSpec +type ClusterMachineTemplateSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // InstallImage the installer image to use. + InstallImage string `protobuf:"bytes,1,opt,name=install_image,json=installImage,proto3" json:"install_image,omitempty"` + // KubernetesVersion to use on the node. + KubernetesVersion string `protobuf:"bytes,2,opt,name=kubernetes_version,json=kubernetesVersion,proto3" json:"kubernetes_version,omitempty"` + // InstallDisk Talos system disk. + InstallDisk string `protobuf:"bytes,3,opt,name=install_disk,json=installDisk,proto3" json:"install_disk,omitempty"` + // Patch represents machinery config patch. + Patch string `protobuf:"bytes,5,opt,name=patch,proto3" json:"patch,omitempty"` +} + +func (x *ClusterMachineTemplateSpec) Reset() { + *x = ClusterMachineTemplateSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ClusterMachineTemplateSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClusterMachineTemplateSpec) ProtoMessage() {} + +func (x *ClusterMachineTemplateSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[20] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ClusterMachineTemplateSpec.ProtoReflect.Descriptor instead. +func (*ClusterMachineTemplateSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{20} +} + +func (x *ClusterMachineTemplateSpec) GetInstallImage() string { + if x != nil { + return x.InstallImage + } + return "" +} + +func (x *ClusterMachineTemplateSpec) GetKubernetesVersion() string { + if x != nil { + return x.KubernetesVersion + } + return "" +} + +func (x *ClusterMachineTemplateSpec) GetInstallDisk() string { + if x != nil { + return x.InstallDisk + } + return "" +} + +func (x *ClusterMachineTemplateSpec) GetPatch() string { + if x != nil { + return x.Patch + } + return "" +} + +// ClusterMachineStatusSpec +type ClusterMachineStatusSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Ready is true if all services are healthy. + Ready bool `protobuf:"varint,1,opt,name=ready,proto3" json:"ready,omitempty"` + Stage ClusterMachineStatusSpec_Stage `protobuf:"varint,2,opt,name=stage,proto3,enum=specs.ClusterMachineStatusSpec_Stage" json:"stage,omitempty"` + // ApidAvailable is true if the node is a control plane node and the apid service is healthy. + ApidAvailable bool `protobuf:"varint,3,opt,name=apid_available,json=apidAvailable,proto3" json:"apid_available,omitempty"` + ConfigUpToDate bool `protobuf:"varint,4,opt,name=config_up_to_date,json=configUpToDate,proto3" json:"config_up_to_date,omitempty"` + LastConfigError string `protobuf:"bytes,5,opt,name=last_config_error,json=lastConfigError,proto3" json:"last_config_error,omitempty"` + // Management address is copied from the machine status resource. + ManagementAddress string `protobuf:"bytes,6,opt,name=management_address,json=managementAddress,proto3" json:"management_address,omitempty"` + ConfigApplyStatus ConfigApplyStatus `protobuf:"varint,7,opt,name=config_apply_status,json=configApplyStatus,proto3,enum=specs.ConfigApplyStatus" json:"config_apply_status,omitempty"` +} + +func (x *ClusterMachineStatusSpec) Reset() { + *x = ClusterMachineStatusSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ClusterMachineStatusSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClusterMachineStatusSpec) ProtoMessage() {} + +func (x *ClusterMachineStatusSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[21] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ClusterMachineStatusSpec.ProtoReflect.Descriptor instead. +func (*ClusterMachineStatusSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{21} +} + +func (x *ClusterMachineStatusSpec) GetReady() bool { + if x != nil { + return x.Ready + } + return false +} + +func (x *ClusterMachineStatusSpec) GetStage() ClusterMachineStatusSpec_Stage { + if x != nil { + return x.Stage + } + return ClusterMachineStatusSpec_UNKNOWN +} + +func (x *ClusterMachineStatusSpec) GetApidAvailable() bool { + if x != nil { + return x.ApidAvailable + } + return false +} + +func (x *ClusterMachineStatusSpec) GetConfigUpToDate() bool { + if x != nil { + return x.ConfigUpToDate + } + return false +} + +func (x *ClusterMachineStatusSpec) GetLastConfigError() string { + if x != nil { + return x.LastConfigError + } + return "" +} + +func (x *ClusterMachineStatusSpec) GetManagementAddress() string { + if x != nil { + return x.ManagementAddress + } + return "" +} + +func (x *ClusterMachineStatusSpec) GetConfigApplyStatus() ConfigApplyStatus { + if x != nil { + return x.ConfigApplyStatus + } + return ConfigApplyStatus_UNKNOWN +} + +// Machines counts the number of machines in a set including health status. +type Machines struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Total machines currently allocated. + Total uint32 `protobuf:"varint,1,opt,name=total,proto3" json:"total,omitempty"` + // Healthy machines. + Healthy uint32 `protobuf:"varint,2,opt,name=healthy,proto3" json:"healthy,omitempty"` + // Connected represents the number of machines in a machine set connected to the wireguard network. + Connected uint32 `protobuf:"varint,3,opt,name=connected,proto3" json:"connected,omitempty"` + // Requested machines count, same as total for manual allocation, may differ for machine class mode. + Requested uint32 `protobuf:"varint,4,opt,name=requested,proto3" json:"requested,omitempty"` +} + +func (x *Machines) Reset() { + *x = Machines{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Machines) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Machines) ProtoMessage() {} + +func (x *Machines) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[22] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Machines.ProtoReflect.Descriptor instead. +func (*Machines) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{22} +} + +func (x *Machines) GetTotal() uint32 { + if x != nil { + return x.Total + } + return 0 +} + +func (x *Machines) GetHealthy() uint32 { + if x != nil { + return x.Healthy + } + return 0 +} + +func (x *Machines) GetConnected() uint32 { + if x != nil { + return x.Connected + } + return 0 +} + +func (x *Machines) GetRequested() uint32 { + if x != nil { + return x.Requested + } + return 0 +} + +// ClusterStatusSpec aggregates general information about a cluster. +type ClusterStatusSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Cluster is available when at least one controlplane node has APId up. + Available bool `protobuf:"varint,1,opt,name=available,proto3" json:"available,omitempty"` + Machines *Machines `protobuf:"bytes,2,opt,name=machines,proto3" json:"machines,omitempty"` + Phase ClusterStatusSpec_Phase `protobuf:"varint,3,opt,name=phase,proto3,enum=specs.ClusterStatusSpec_Phase" json:"phase,omitempty"` + Ready bool `protobuf:"varint,4,opt,name=ready,proto3" json:"ready,omitempty"` + KubernetesAPIReady bool `protobuf:"varint,5,opt,name=kubernetesAPIReady,proto3" json:"kubernetesAPIReady,omitempty"` + ControlplaneReady bool `protobuf:"varint,6,opt,name=controlplaneReady,proto3" json:"controlplaneReady,omitempty"` + HasConnectedControlPlanes bool `protobuf:"varint,7,opt,name=has_connected_control_planes,json=hasConnectedControlPlanes,proto3" json:"has_connected_control_planes,omitempty"` +} + +func (x *ClusterStatusSpec) Reset() { + *x = ClusterStatusSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ClusterStatusSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClusterStatusSpec) ProtoMessage() {} + +func (x *ClusterStatusSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[23] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ClusterStatusSpec.ProtoReflect.Descriptor instead. +func (*ClusterStatusSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{23} +} + +func (x *ClusterStatusSpec) GetAvailable() bool { + if x != nil { + return x.Available + } + return false +} + +func (x *ClusterStatusSpec) GetMachines() *Machines { + if x != nil { + return x.Machines + } + return nil +} + +func (x *ClusterStatusSpec) GetPhase() ClusterStatusSpec_Phase { + if x != nil { + return x.Phase + } + return ClusterStatusSpec_UNKNOWN +} + +func (x *ClusterStatusSpec) GetReady() bool { + if x != nil { + return x.Ready + } + return false +} + +func (x *ClusterStatusSpec) GetKubernetesAPIReady() bool { + if x != nil { + return x.KubernetesAPIReady + } + return false +} + +func (x *ClusterStatusSpec) GetControlplaneReady() bool { + if x != nil { + return x.ControlplaneReady + } + return false +} + +func (x *ClusterStatusSpec) GetHasConnectedControlPlanes() bool { + if x != nil { + return x.HasConnectedControlPlanes + } + return false +} + +// ClusterUUID keeps the UUID of the cluster. +type ClusterUUID struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Uuid string `protobuf:"bytes,1,opt,name=uuid,proto3" json:"uuid,omitempty"` +} + +func (x *ClusterUUID) Reset() { + *x = ClusterUUID{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ClusterUUID) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClusterUUID) ProtoMessage() {} + +func (x *ClusterUUID) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[24] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ClusterUUID.ProtoReflect.Descriptor instead. +func (*ClusterUUID) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{24} +} + +func (x *ClusterUUID) GetUuid() string { + if x != nil { + return x.Uuid + } + return "" +} + +// ClusterConfigVersion keeps the version of Talos which was used for initial config generation. +type ClusterConfigVersionSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Version string `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"` +} + +func (x *ClusterConfigVersionSpec) Reset() { + *x = ClusterConfigVersionSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ClusterConfigVersionSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClusterConfigVersionSpec) ProtoMessage() {} + +func (x *ClusterConfigVersionSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[25] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ClusterConfigVersionSpec.ProtoReflect.Descriptor instead. +func (*ClusterConfigVersionSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{25} +} + +func (x *ClusterConfigVersionSpec) GetVersion() string { + if x != nil { + return x.Version + } + return "" +} + +// ClusterMachineConfigStatusSpec machine configuration status spec. +type ClusterMachineConfigStatusSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterMachineConfigVersion string `protobuf:"bytes,3,opt,name=cluster_machine_config_version,json=clusterMachineConfigVersion,proto3" json:"cluster_machine_config_version,omitempty"` + ClusterMachineVersion string `protobuf:"bytes,4,opt,name=cluster_machine_version,json=clusterMachineVersion,proto3" json:"cluster_machine_version,omitempty"` + ClusterMachineConfigSha256 string `protobuf:"bytes,5,opt,name=cluster_machine_config_sha256,json=clusterMachineConfigSha256,proto3" json:"cluster_machine_config_sha256,omitempty"` + LastConfigError string `protobuf:"bytes,6,opt,name=last_config_error,json=lastConfigError,proto3" json:"last_config_error,omitempty"` + TalosVersion string `protobuf:"bytes,7,opt,name=talos_version,json=talosVersion,proto3" json:"talos_version,omitempty"` + SchematicId string `protobuf:"bytes,8,opt,name=schematic_id,json=schematicId,proto3" json:"schematic_id,omitempty"` +} + +func (x *ClusterMachineConfigStatusSpec) Reset() { + *x = ClusterMachineConfigStatusSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ClusterMachineConfigStatusSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClusterMachineConfigStatusSpec) ProtoMessage() {} + +func (x *ClusterMachineConfigStatusSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[26] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ClusterMachineConfigStatusSpec.ProtoReflect.Descriptor instead. +func (*ClusterMachineConfigStatusSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{26} +} + +func (x *ClusterMachineConfigStatusSpec) GetClusterMachineConfigVersion() string { + if x != nil { + return x.ClusterMachineConfigVersion + } + return "" +} + +func (x *ClusterMachineConfigStatusSpec) GetClusterMachineVersion() string { + if x != nil { + return x.ClusterMachineVersion + } + return "" +} + +func (x *ClusterMachineConfigStatusSpec) GetClusterMachineConfigSha256() string { + if x != nil { + return x.ClusterMachineConfigSha256 + } + return "" +} + +func (x *ClusterMachineConfigStatusSpec) GetLastConfigError() string { + if x != nil { + return x.LastConfigError + } + return "" +} + +func (x *ClusterMachineConfigStatusSpec) GetTalosVersion() string { + if x != nil { + return x.TalosVersion + } + return "" +} + +func (x *ClusterMachineConfigStatusSpec) GetSchematicId() string { + if x != nil { + return x.SchematicId + } + return "" +} + +// ClusterBootstrapStatusSpec keeps track of bootstrap calls for a cluster. +type ClusterBootstrapStatusSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Bootstrapped bool `protobuf:"varint,1,opt,name=bootstrapped,proto3" json:"bootstrapped,omitempty"` +} + +func (x *ClusterBootstrapStatusSpec) Reset() { + *x = ClusterBootstrapStatusSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ClusterBootstrapStatusSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClusterBootstrapStatusSpec) ProtoMessage() {} + +func (x *ClusterBootstrapStatusSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[27] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ClusterBootstrapStatusSpec.ProtoReflect.Descriptor instead. +func (*ClusterBootstrapStatusSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{27} +} + +func (x *ClusterBootstrapStatusSpec) GetBootstrapped() bool { + if x != nil { + return x.Bootstrapped + } + return false +} + +// ClusterSecretsSpec describes cluster secrets. +type ClusterSecretsSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Bytes holding serialized cluster secrets. + Data []byte `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` +} + +func (x *ClusterSecretsSpec) Reset() { + *x = ClusterSecretsSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ClusterSecretsSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClusterSecretsSpec) ProtoMessage() {} + +func (x *ClusterSecretsSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[28] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ClusterSecretsSpec.ProtoReflect.Descriptor instead. +func (*ClusterSecretsSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{28} +} + +func (x *ClusterSecretsSpec) GetData() []byte { + if x != nil { + return x.Data + } + return nil +} + +// LoadBalancerConfigSpec describes the configuration of a load balancer. +type LoadBalancerConfigSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + BindPort string `protobuf:"bytes,2,opt,name=bind_port,json=bindPort,proto3" json:"bind_port,omitempty"` + // Full URL of the loadbalancer inside Omni environment. + SiderolinkEndpoint string `protobuf:"bytes,4,opt,name=siderolink_endpoint,json=siderolinkEndpoint,proto3" json:"siderolink_endpoint,omitempty"` + // IP adresses of the endpoints + Endpoints []string `protobuf:"bytes,3,rep,name=endpoints,proto3" json:"endpoints,omitempty"` +} + +func (x *LoadBalancerConfigSpec) Reset() { + *x = LoadBalancerConfigSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LoadBalancerConfigSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LoadBalancerConfigSpec) ProtoMessage() {} + +func (x *LoadBalancerConfigSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[29] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LoadBalancerConfigSpec.ProtoReflect.Descriptor instead. +func (*LoadBalancerConfigSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{29} +} + +func (x *LoadBalancerConfigSpec) GetBindPort() string { + if x != nil { + return x.BindPort + } + return "" +} + +func (x *LoadBalancerConfigSpec) GetSiderolinkEndpoint() string { + if x != nil { + return x.SiderolinkEndpoint + } + return "" +} + +func (x *LoadBalancerConfigSpec) GetEndpoints() []string { + if x != nil { + return x.Endpoints + } + return nil +} + +// LoadBalancerStatusSpec reflects the status of a load balancer. +type LoadBalancerStatusSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Healthy bool `protobuf:"varint,3,opt,name=healthy,proto3" json:"healthy,omitempty"` + Stopped bool `protobuf:"varint,4,opt,name=stopped,proto3" json:"stopped,omitempty"` +} + +func (x *LoadBalancerStatusSpec) Reset() { + *x = LoadBalancerStatusSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LoadBalancerStatusSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LoadBalancerStatusSpec) ProtoMessage() {} + +func (x *LoadBalancerStatusSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[30] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LoadBalancerStatusSpec.ProtoReflect.Descriptor instead. +func (*LoadBalancerStatusSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{30} +} + +func (x *LoadBalancerStatusSpec) GetHealthy() bool { + if x != nil { + return x.Healthy + } + return false +} + +func (x *LoadBalancerStatusSpec) GetStopped() bool { + if x != nil { + return x.Stopped + } + return false +} + +// KubernetesVersionSpec represents an available Kubernetes version. +type KubernetesVersionSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Version string `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"` +} + +func (x *KubernetesVersionSpec) Reset() { + *x = KubernetesVersionSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *KubernetesVersionSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*KubernetesVersionSpec) ProtoMessage() {} + +func (x *KubernetesVersionSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[31] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use KubernetesVersionSpec.ProtoReflect.Descriptor instead. +func (*KubernetesVersionSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{31} +} + +func (x *KubernetesVersionSpec) GetVersion() string { + if x != nil { + return x.Version + } + return "" +} + +// TalosVersionSpec represents an available Talos version. +type TalosVersionSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Version string `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"` + CompatibleKubernetesVersions []string `protobuf:"bytes,2,rep,name=compatible_kubernetes_versions,json=compatibleKubernetesVersions,proto3" json:"compatible_kubernetes_versions,omitempty"` +} + +func (x *TalosVersionSpec) Reset() { + *x = TalosVersionSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TalosVersionSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TalosVersionSpec) ProtoMessage() {} + +func (x *TalosVersionSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[32] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TalosVersionSpec.ProtoReflect.Descriptor instead. +func (*TalosVersionSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{32} +} + +func (x *TalosVersionSpec) GetVersion() string { + if x != nil { + return x.Version + } + return "" +} + +func (x *TalosVersionSpec) GetCompatibleKubernetesVersions() []string { + if x != nil { + return x.CompatibleKubernetesVersions + } + return nil +} + +// InstallationMediaSpec resource describes a Talos installation media that can be generated by the image factory. It also describes the necessary parameters to be passed to the image factory. +type InstallationMediaSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Name is the human readable name of the image. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Architecture string `protobuf:"bytes,2,opt,name=architecture,proto3" json:"architecture,omitempty"` + Profile string `protobuf:"bytes,3,opt,name=profile,proto3" json:"profile,omitempty"` + ContentType string `protobuf:"bytes,6,opt,name=contentType,proto3" json:"contentType,omitempty"` + // SrcFilePrefix defines the src filename to download the image from. + SrcFilePrefix string `protobuf:"bytes,7,opt,name=src_file_prefix,json=srcFilePrefix,proto3" json:"src_file_prefix,omitempty"` + // DestFilePrefix defines the dest filename to download the image to. + DestFilePrefix string `protobuf:"bytes,8,opt,name=dest_file_prefix,json=destFilePrefix,proto3" json:"dest_file_prefix,omitempty"` + // Extension defines the dest filename extension. + Extension string `protobuf:"bytes,9,opt,name=extension,proto3" json:"extension,omitempty"` + // NoSecureBoot means that the installation media doesn't support SecureBoot generation. + NoSecureBoot bool `protobuf:"varint,11,opt,name=no_secure_boot,json=noSecureBoot,proto3" json:"no_secure_boot,omitempty"` +} + +func (x *InstallationMediaSpec) Reset() { + *x = InstallationMediaSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[33] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *InstallationMediaSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*InstallationMediaSpec) ProtoMessage() {} + +func (x *InstallationMediaSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[33] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use InstallationMediaSpec.ProtoReflect.Descriptor instead. +func (*InstallationMediaSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{33} +} + +func (x *InstallationMediaSpec) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *InstallationMediaSpec) GetArchitecture() string { + if x != nil { + return x.Architecture + } + return "" +} + +func (x *InstallationMediaSpec) GetProfile() string { + if x != nil { + return x.Profile + } + return "" +} + +func (x *InstallationMediaSpec) GetContentType() string { + if x != nil { + return x.ContentType + } + return "" +} + +func (x *InstallationMediaSpec) GetSrcFilePrefix() string { + if x != nil { + return x.SrcFilePrefix + } + return "" +} + +func (x *InstallationMediaSpec) GetDestFilePrefix() string { + if x != nil { + return x.DestFilePrefix + } + return "" +} + +func (x *InstallationMediaSpec) GetExtension() string { + if x != nil { + return x.Extension + } + return "" +} + +func (x *InstallationMediaSpec) GetNoSecureBoot() bool { + if x != nil { + return x.NoSecureBoot + } + return false +} + +// ConfigPatchSpec represents the machine config patch. +type ConfigPatchSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Data string `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` +} + +func (x *ConfigPatchSpec) Reset() { + *x = ConfigPatchSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ConfigPatchSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ConfigPatchSpec) ProtoMessage() {} + +func (x *ConfigPatchSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[34] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ConfigPatchSpec.ProtoReflect.Descriptor instead. +func (*ConfigPatchSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{34} +} + +func (x *ConfigPatchSpec) GetData() string { + if x != nil { + return x.Data + } + return "" +} + +// MachineSetSpec describes the cluster machine group. +type MachineSetSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // UpdateStrategy is the update strategy of the machine set. + UpdateStrategy MachineSetSpec_UpdateStrategy `protobuf:"varint,1,opt,name=update_strategy,json=updateStrategy,proto3,enum=specs.MachineSetSpec_UpdateStrategy" json:"update_strategy,omitempty"` + // MachineClass is the machine class to pick machines from for the machine set. + MachineClass *MachineSetSpec_MachineClass `protobuf:"bytes,2,opt,name=machine_class,json=machineClass,proto3" json:"machine_class,omitempty"` + // BootstrapSpec defines the bootstrapping spec of the machine set. + // This field is immutable, only valid for the control plane machine set and used only once at the creation time. + // When set, the machine set won't be created from scratch, instead, it will be bootstrapped using the given spec. + BootstrapSpec *MachineSetSpec_BootstrapSpec `protobuf:"bytes,3,opt,name=bootstrap_spec,json=bootstrapSpec,proto3" json:"bootstrap_spec,omitempty"` + // DeleteStrategy defines the delete strategy of the machine set. + DeleteStrategy MachineSetSpec_UpdateStrategy `protobuf:"varint,4,opt,name=delete_strategy,json=deleteStrategy,proto3,enum=specs.MachineSetSpec_UpdateStrategy" json:"delete_strategy,omitempty"` + // UpdateStrategyConfig defines the update strategy configuration. + UpdateStrategyConfig *MachineSetSpec_UpdateStrategyConfig `protobuf:"bytes,5,opt,name=update_strategy_config,json=updateStrategyConfig,proto3" json:"update_strategy_config,omitempty"` + // DeleteStrategyConfig defines the delete strategy configuration. + DeleteStrategyConfig *MachineSetSpec_UpdateStrategyConfig `protobuf:"bytes,6,opt,name=delete_strategy_config,json=deleteStrategyConfig,proto3" json:"delete_strategy_config,omitempty"` +} + +func (x *MachineSetSpec) Reset() { + *x = MachineSetSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[35] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MachineSetSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MachineSetSpec) ProtoMessage() {} + +func (x *MachineSetSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[35] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MachineSetSpec.ProtoReflect.Descriptor instead. +func (*MachineSetSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{35} +} + +func (x *MachineSetSpec) GetUpdateStrategy() MachineSetSpec_UpdateStrategy { + if x != nil { + return x.UpdateStrategy + } + return MachineSetSpec_Unset +} + +func (x *MachineSetSpec) GetMachineClass() *MachineSetSpec_MachineClass { + if x != nil { + return x.MachineClass + } + return nil +} + +func (x *MachineSetSpec) GetBootstrapSpec() *MachineSetSpec_BootstrapSpec { + if x != nil { + return x.BootstrapSpec + } + return nil +} + +func (x *MachineSetSpec) GetDeleteStrategy() MachineSetSpec_UpdateStrategy { + if x != nil { + return x.DeleteStrategy + } + return MachineSetSpec_Unset +} + +func (x *MachineSetSpec) GetUpdateStrategyConfig() *MachineSetSpec_UpdateStrategyConfig { + if x != nil { + return x.UpdateStrategyConfig + } + return nil +} + +func (x *MachineSetSpec) GetDeleteStrategyConfig() *MachineSetSpec_UpdateStrategyConfig { + if x != nil { + return x.DeleteStrategyConfig + } + return nil +} + +// TalosUpgradeStatusSpec contains the status of the Talos upgrade process. +type TalosUpgradeStatusSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Current upgrade phase. + Phase TalosUpgradeStatusSpec_Phase `protobuf:"varint,1,opt,name=phase,proto3,enum=specs.TalosUpgradeStatusSpec_Phase" json:"phase,omitempty"` + // If phase is Failed, this contains the error message. + Error string `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` + // If phase is Upgrading, this contains the current upgrade step. + Step string `protobuf:"bytes,3,opt,name=step,proto3" json:"step,omitempty"` + // If phase is Upgrading, this contains the current upgrade step progress. + Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` + // Last successful upgrade version. + LastUpgradeVersion string `protobuf:"bytes,5,opt,name=last_upgrade_version,json=lastUpgradeVersion,proto3" json:"last_upgrade_version,omitempty"` + // Current version of the upgrade (if phase == Upgrading). + CurrentUpgradeVersion string `protobuf:"bytes,6,opt,name=current_upgrade_version,json=currentUpgradeVersion,proto3" json:"current_upgrade_version,omitempty"` + // List of versions available for upgrade. + UpgradeVersions []string `protobuf:"bytes,7,rep,name=upgrade_versions,json=upgradeVersions,proto3" json:"upgrade_versions,omitempty"` +} + +func (x *TalosUpgradeStatusSpec) Reset() { + *x = TalosUpgradeStatusSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[36] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TalosUpgradeStatusSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TalosUpgradeStatusSpec) ProtoMessage() {} + +func (x *TalosUpgradeStatusSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[36] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TalosUpgradeStatusSpec.ProtoReflect.Descriptor instead. +func (*TalosUpgradeStatusSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{36} +} + +func (x *TalosUpgradeStatusSpec) GetPhase() TalosUpgradeStatusSpec_Phase { + if x != nil { + return x.Phase + } + return TalosUpgradeStatusSpec_Unknown +} + +func (x *TalosUpgradeStatusSpec) GetError() string { + if x != nil { + return x.Error + } + return "" +} + +func (x *TalosUpgradeStatusSpec) GetStep() string { + if x != nil { + return x.Step + } + return "" +} + +func (x *TalosUpgradeStatusSpec) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +func (x *TalosUpgradeStatusSpec) GetLastUpgradeVersion() string { + if x != nil { + return x.LastUpgradeVersion + } + return "" +} + +func (x *TalosUpgradeStatusSpec) GetCurrentUpgradeVersion() string { + if x != nil { + return x.CurrentUpgradeVersion + } + return "" +} + +func (x *TalosUpgradeStatusSpec) GetUpgradeVersions() []string { + if x != nil { + return x.UpgradeVersions + } + return nil +} + +// MachineSetStatusSpec describes machine set status. +type MachineSetStatusSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Phase MachineSetPhase `protobuf:"varint,1,opt,name=phase,proto3,enum=specs.MachineSetPhase" json:"phase,omitempty"` + Ready bool `protobuf:"varint,2,opt,name=ready,proto3" json:"ready,omitempty"` + Error string `protobuf:"bytes,3,opt,name=error,proto3" json:"error,omitempty"` + Machines *Machines `protobuf:"bytes,4,opt,name=machines,proto3" json:"machines,omitempty"` + // config_hash is the combined hash of all cluster machines which are part of the machine set. + ConfigHash string `protobuf:"bytes,5,opt,name=config_hash,json=configHash,proto3" json:"config_hash,omitempty"` + // MachineClass is copied from the input MachineSet resource. + MachineClass *MachineSetSpec_MachineClass `protobuf:"bytes,6,opt,name=machine_class,json=machineClass,proto3" json:"machine_class,omitempty"` +} + +func (x *MachineSetStatusSpec) Reset() { + *x = MachineSetStatusSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[37] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MachineSetStatusSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MachineSetStatusSpec) ProtoMessage() {} + +func (x *MachineSetStatusSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[37] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MachineSetStatusSpec.ProtoReflect.Descriptor instead. +func (*MachineSetStatusSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{37} +} + +func (x *MachineSetStatusSpec) GetPhase() MachineSetPhase { + if x != nil { + return x.Phase + } + return MachineSetPhase_Unknown +} + +func (x *MachineSetStatusSpec) GetReady() bool { + if x != nil { + return x.Ready + } + return false +} + +func (x *MachineSetStatusSpec) GetError() string { + if x != nil { + return x.Error + } + return "" +} + +func (x *MachineSetStatusSpec) GetMachines() *Machines { + if x != nil { + return x.Machines + } + return nil +} + +func (x *MachineSetStatusSpec) GetConfigHash() string { + if x != nil { + return x.ConfigHash + } + return "" +} + +func (x *MachineSetStatusSpec) GetMachineClass() *MachineSetSpec_MachineClass { + if x != nil { + return x.MachineClass + } + return nil +} + +// MachineSetNodeSpec is a binding between ClusterMachine and MachineSet. +type MachineSetNodeSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *MachineSetNodeSpec) Reset() { + *x = MachineSetNodeSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[38] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MachineSetNodeSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MachineSetNodeSpec) ProtoMessage() {} + +func (x *MachineSetNodeSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[38] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MachineSetNodeSpec.ProtoReflect.Descriptor instead. +func (*MachineSetNodeSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{38} +} + +// MachineLabelsSpec is the resource that adds user defined labels to the MachineStatus. +type MachineLabelsSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *MachineLabelsSpec) Reset() { + *x = MachineLabelsSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[39] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MachineLabelsSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MachineLabelsSpec) ProtoMessage() {} + +func (x *MachineLabelsSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[39] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MachineLabelsSpec.ProtoReflect.Descriptor instead. +func (*MachineLabelsSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{39} +} + +// MachineStatusSnapshotSpec describes latest known status of MachineStatus Talos resource. +type MachineStatusSnapshotSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + MachineStatus *machine.MachineStatusEvent `protobuf:"bytes,1,opt,name=machine_status,json=machineStatus,proto3" json:"machine_status,omitempty"` +} + +func (x *MachineStatusSnapshotSpec) Reset() { + *x = MachineStatusSnapshotSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[40] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MachineStatusSnapshotSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MachineStatusSnapshotSpec) ProtoMessage() {} + +func (x *MachineStatusSnapshotSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[40] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MachineStatusSnapshotSpec.ProtoReflect.Descriptor instead. +func (*MachineStatusSnapshotSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{40} +} + +func (x *MachineStatusSnapshotSpec) GetMachineStatus() *machine.MachineStatusEvent { + if x != nil { + return x.MachineStatus + } + return nil +} + +// ControlPlaneStatusSpec contains the status of the MachineSets which manage control plane nodes. +type ControlPlaneStatusSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Conditions []*ControlPlaneStatusSpec_Condition `protobuf:"bytes,1,rep,name=conditions,proto3" json:"conditions,omitempty"` +} + +func (x *ControlPlaneStatusSpec) Reset() { + *x = ControlPlaneStatusSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[41] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ControlPlaneStatusSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ControlPlaneStatusSpec) ProtoMessage() {} + +func (x *ControlPlaneStatusSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[41] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ControlPlaneStatusSpec.ProtoReflect.Descriptor instead. +func (*ControlPlaneStatusSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{41} +} + +func (x *ControlPlaneStatusSpec) GetConditions() []*ControlPlaneStatusSpec_Condition { + if x != nil { + return x.Conditions + } + return nil +} + +// ClusterEndpointSpec contains a list of SideroLink (management) control plane endpoints. +type ClusterEndpointSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // List of SideroLink addresses for control plane nodes. + ManagementAddresses []string `protobuf:"bytes,1,rep,name=management_addresses,json=managementAddresses,proto3" json:"management_addresses,omitempty"` +} + +func (x *ClusterEndpointSpec) Reset() { + *x = ClusterEndpointSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[42] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ClusterEndpointSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClusterEndpointSpec) ProtoMessage() {} + +func (x *ClusterEndpointSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[42] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ClusterEndpointSpec.ProtoReflect.Descriptor instead. +func (*ClusterEndpointSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{42} +} + +func (x *ClusterEndpointSpec) GetManagementAddresses() []string { + if x != nil { + return x.ManagementAddresses + } + return nil +} + +// KubernetesStatusSpec contains the status of the Kubernetes critical resources in the cluster. +type KubernetesStatusSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // status of each node, sorted by nodename + Nodes []*KubernetesStatusSpec_NodeStatus `protobuf:"bytes,1,rep,name=nodes,proto3" json:"nodes,omitempty"` + // status of each static pod on each node, sorted by nodename, then by pod's app + StaticPods []*KubernetesStatusSpec_NodeStaticPods `protobuf:"bytes,2,rep,name=static_pods,json=staticPods,proto3" json:"static_pods,omitempty"` +} + +func (x *KubernetesStatusSpec) Reset() { + *x = KubernetesStatusSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[43] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *KubernetesStatusSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*KubernetesStatusSpec) ProtoMessage() {} + +func (x *KubernetesStatusSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[43] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use KubernetesStatusSpec.ProtoReflect.Descriptor instead. +func (*KubernetesStatusSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{43} +} + +func (x *KubernetesStatusSpec) GetNodes() []*KubernetesStatusSpec_NodeStatus { + if x != nil { + return x.Nodes + } + return nil +} + +func (x *KubernetesStatusSpec) GetStaticPods() []*KubernetesStatusSpec_NodeStaticPods { + if x != nil { + return x.StaticPods + } + return nil +} + +// KubernetesUpgradeStatus spec contains the status of the Kubernetes upgrade process. +type KubernetesUpgradeStatusSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Current upgrade phase. + Phase KubernetesUpgradeStatusSpec_Phase `protobuf:"varint,1,opt,name=phase,proto3,enum=specs.KubernetesUpgradeStatusSpec_Phase" json:"phase,omitempty"` + // If phase is Failed, this contains the error message. + Error string `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` + // If phase is Upgrading, this contains the current upgrade step. + Step string `protobuf:"bytes,3,opt,name=step,proto3" json:"step,omitempty"` + // If phase is Upgrading, this contains the current upgrade step progress. + Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` + // Last successful upgrade version. + LastUpgradeVersion string `protobuf:"bytes,5,opt,name=last_upgrade_version,json=lastUpgradeVersion,proto3" json:"last_upgrade_version,omitempty"` + // Current version of the upgrade (if phase == Upgrading). + CurrentUpgradeVersion string `protobuf:"bytes,7,opt,name=current_upgrade_version,json=currentUpgradeVersion,proto3" json:"current_upgrade_version,omitempty"` + // List of versions available for upgrade. + UpgradeVersions []string `protobuf:"bytes,6,rep,name=upgrade_versions,json=upgradeVersions,proto3" json:"upgrade_versions,omitempty"` +} + +func (x *KubernetesUpgradeStatusSpec) Reset() { + *x = KubernetesUpgradeStatusSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[44] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *KubernetesUpgradeStatusSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*KubernetesUpgradeStatusSpec) ProtoMessage() {} + +func (x *KubernetesUpgradeStatusSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[44] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use KubernetesUpgradeStatusSpec.ProtoReflect.Descriptor instead. +func (*KubernetesUpgradeStatusSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{44} +} + +func (x *KubernetesUpgradeStatusSpec) GetPhase() KubernetesUpgradeStatusSpec_Phase { + if x != nil { + return x.Phase + } + return KubernetesUpgradeStatusSpec_Unknown +} + +func (x *KubernetesUpgradeStatusSpec) GetError() string { + if x != nil { + return x.Error + } + return "" +} + +func (x *KubernetesUpgradeStatusSpec) GetStep() string { + if x != nil { + return x.Step + } + return "" +} + +func (x *KubernetesUpgradeStatusSpec) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +func (x *KubernetesUpgradeStatusSpec) GetLastUpgradeVersion() string { + if x != nil { + return x.LastUpgradeVersion + } + return "" +} + +func (x *KubernetesUpgradeStatusSpec) GetCurrentUpgradeVersion() string { + if x != nil { + return x.CurrentUpgradeVersion + } + return "" +} + +func (x *KubernetesUpgradeStatusSpec) GetUpgradeVersions() []string { + if x != nil { + return x.UpgradeVersions + } + return nil +} + +// KubernetesUpgradeManifestStatus contains status of Kubernetes upgrade manifest sync. +type KubernetesUpgradeManifestStatusSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Number of manifests out of sync. + OutOfSync int32 `protobuf:"varint,1,opt,name=out_of_sync,json=outOfSync,proto3" json:"out_of_sync,omitempty"` + // Last fatal error encountered (which prevented the sync). + LastFatalError string `protobuf:"bytes,2,opt,name=last_fatal_error,json=lastFatalError,proto3" json:"last_fatal_error,omitempty"` +} + +func (x *KubernetesUpgradeManifestStatusSpec) Reset() { + *x = KubernetesUpgradeManifestStatusSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[45] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *KubernetesUpgradeManifestStatusSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*KubernetesUpgradeManifestStatusSpec) ProtoMessage() {} + +func (x *KubernetesUpgradeManifestStatusSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[45] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use KubernetesUpgradeManifestStatusSpec.ProtoReflect.Descriptor instead. +func (*KubernetesUpgradeManifestStatusSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{45} +} + +func (x *KubernetesUpgradeManifestStatusSpec) GetOutOfSync() int32 { + if x != nil { + return x.OutOfSync + } + return 0 +} + +func (x *KubernetesUpgradeManifestStatusSpec) GetLastFatalError() string { + if x != nil { + return x.LastFatalError + } + return "" +} + +// DestroyStatusSpec describes the state of resource destroy. +type DestroyStatusSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Phase describes the current destroy phase. + Phase string `protobuf:"bytes,1,opt,name=phase,proto3" json:"phase,omitempty"` +} + +func (x *DestroyStatusSpec) Reset() { + *x = DestroyStatusSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[46] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DestroyStatusSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DestroyStatusSpec) ProtoMessage() {} + +func (x *DestroyStatusSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[46] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DestroyStatusSpec.ProtoReflect.Descriptor instead. +func (*DestroyStatusSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{46} +} + +func (x *DestroyStatusSpec) GetPhase() string { + if x != nil { + return x.Phase + } + return "" +} + +// OngoingTaskSpec describes any ongoing tasks. +type OngoingTaskSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Title of the ongoing task. + Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"` + // Details contains the detailed task description. + // + // Types that are assignable to Details: + // + // *OngoingTaskSpec_TalosUpgrade + // *OngoingTaskSpec_KubernetesUpgrade + // *OngoingTaskSpec_Destroy + Details isOngoingTaskSpec_Details `protobuf_oneof:"details"` +} + +func (x *OngoingTaskSpec) Reset() { + *x = OngoingTaskSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[47] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *OngoingTaskSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OngoingTaskSpec) ProtoMessage() {} + +func (x *OngoingTaskSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[47] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use OngoingTaskSpec.ProtoReflect.Descriptor instead. +func (*OngoingTaskSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{47} +} + +func (x *OngoingTaskSpec) GetTitle() string { + if x != nil { + return x.Title + } + return "" +} + +func (m *OngoingTaskSpec) GetDetails() isOngoingTaskSpec_Details { + if m != nil { + return m.Details + } + return nil +} + +func (x *OngoingTaskSpec) GetTalosUpgrade() *TalosUpgradeStatusSpec { + if x, ok := x.GetDetails().(*OngoingTaskSpec_TalosUpgrade); ok { + return x.TalosUpgrade + } + return nil +} + +func (x *OngoingTaskSpec) GetKubernetesUpgrade() *KubernetesUpgradeStatusSpec { + if x, ok := x.GetDetails().(*OngoingTaskSpec_KubernetesUpgrade); ok { + return x.KubernetesUpgrade + } + return nil +} + +func (x *OngoingTaskSpec) GetDestroy() *DestroyStatusSpec { + if x, ok := x.GetDetails().(*OngoingTaskSpec_Destroy); ok { + return x.Destroy + } + return nil +} + +type isOngoingTaskSpec_Details interface { + isOngoingTaskSpec_Details() +} + +type OngoingTaskSpec_TalosUpgrade struct { + TalosUpgrade *TalosUpgradeStatusSpec `protobuf:"bytes,2,opt,name=talos_upgrade,json=talosUpgrade,proto3,oneof"` +} + +type OngoingTaskSpec_KubernetesUpgrade struct { + KubernetesUpgrade *KubernetesUpgradeStatusSpec `protobuf:"bytes,3,opt,name=kubernetes_upgrade,json=kubernetesUpgrade,proto3,oneof"` +} + +type OngoingTaskSpec_Destroy struct { + Destroy *DestroyStatusSpec `protobuf:"bytes,4,opt,name=destroy,proto3,oneof"` +} + +func (*OngoingTaskSpec_TalosUpgrade) isOngoingTaskSpec_Details() {} + +func (*OngoingTaskSpec_KubernetesUpgrade) isOngoingTaskSpec_Details() {} + +func (*OngoingTaskSpec_Destroy) isOngoingTaskSpec_Details() {} + +// ClusterMachineEncryptionKeySpec keeps generated encryption key for the machine disk encryption. +type ClusterMachineEncryptionKeySpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Data stores generated encryption key for the machine. + Data []byte `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` +} + +func (x *ClusterMachineEncryptionKeySpec) Reset() { + *x = ClusterMachineEncryptionKeySpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[48] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ClusterMachineEncryptionKeySpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClusterMachineEncryptionKeySpec) ProtoMessage() {} + +func (x *ClusterMachineEncryptionKeySpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[48] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ClusterMachineEncryptionKeySpec.ProtoReflect.Descriptor instead. +func (*ClusterMachineEncryptionKeySpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{48} +} + +func (x *ClusterMachineEncryptionKeySpec) GetData() []byte { + if x != nil { + return x.Data + } + return nil +} + +// ExposedServiceSpec describes a Kubernetes service exposed through Omni from a workload cluster. +type ExposedServiceSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Port is the host port the service is exposed on. + Port uint32 `protobuf:"varint,1,opt,name=port,proto3" json:"port,omitempty"` + // Label is the human-readable label of the service to be displayed on Omni Web. + Label string `protobuf:"bytes,2,opt,name=label,proto3" json:"label,omitempty"` + // IconBase64 is the icon of the service to be displayed on Omni Web. + IconBase64 string `protobuf:"bytes,3,opt,name=icon_base64,json=iconBase64,proto3" json:"icon_base64,omitempty"` +} + +func (x *ExposedServiceSpec) Reset() { + *x = ExposedServiceSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[49] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ExposedServiceSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExposedServiceSpec) ProtoMessage() {} + +func (x *ExposedServiceSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[49] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ExposedServiceSpec.ProtoReflect.Descriptor instead. +func (*ExposedServiceSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{49} +} + +func (x *ExposedServiceSpec) GetPort() uint32 { + if x != nil { + return x.Port + } + return 0 +} + +func (x *ExposedServiceSpec) GetLabel() string { + if x != nil { + return x.Label + } + return "" +} + +func (x *ExposedServiceSpec) GetIconBase64() string { + if x != nil { + return x.IconBase64 + } + return "" +} + +type FeaturesConfigSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // EnableWorkloadProxying enables workload proxying feature. + EnableWorkloadProxying bool `protobuf:"varint,1,opt,name=enable_workload_proxying,json=enableWorkloadProxying,proto3" json:"enable_workload_proxying,omitempty"` + // EtcdBackupSettings represents omni etcd backup settings. + EtcdBackupSettings *EtcdBackupSettings `protobuf:"bytes,2,opt,name=etcd_backup_settings,json=etcdBackupSettings,proto3" json:"etcd_backup_settings,omitempty"` +} + +func (x *FeaturesConfigSpec) Reset() { + *x = FeaturesConfigSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[50] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FeaturesConfigSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FeaturesConfigSpec) ProtoMessage() {} + +func (x *FeaturesConfigSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[50] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FeaturesConfigSpec.ProtoReflect.Descriptor instead. +func (*FeaturesConfigSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{50} +} + +func (x *FeaturesConfigSpec) GetEnableWorkloadProxying() bool { + if x != nil { + return x.EnableWorkloadProxying + } + return false +} + +func (x *FeaturesConfigSpec) GetEtcdBackupSettings() *EtcdBackupSettings { + if x != nil { + return x.EtcdBackupSettings + } + return nil +} + +type EtcdBackupSettings struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // TickInterval is the interval between checking for backups in controller. + TickInterval *durationpb.Duration `protobuf:"bytes,1,opt,name=tick_interval,json=tickInterval,proto3" json:"tick_interval,omitempty"` + // MinInterval is the minimum interval between backups. + MinInterval *durationpb.Duration `protobuf:"bytes,2,opt,name=min_interval,json=minInterval,proto3" json:"min_interval,omitempty"` + // MaxInterval is the maximum interval between backups. + MaxInterval *durationpb.Duration `protobuf:"bytes,3,opt,name=max_interval,json=maxInterval,proto3" json:"max_interval,omitempty"` +} + +func (x *EtcdBackupSettings) Reset() { + *x = EtcdBackupSettings{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[51] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EtcdBackupSettings) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EtcdBackupSettings) ProtoMessage() {} + +func (x *EtcdBackupSettings) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[51] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EtcdBackupSettings.ProtoReflect.Descriptor instead. +func (*EtcdBackupSettings) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{51} +} + +func (x *EtcdBackupSettings) GetTickInterval() *durationpb.Duration { + if x != nil { + return x.TickInterval + } + return nil +} + +func (x *EtcdBackupSettings) GetMinInterval() *durationpb.Duration { + if x != nil { + return x.MinInterval + } + return nil +} + +func (x *EtcdBackupSettings) GetMaxInterval() *durationpb.Duration { + if x != nil { + return x.MaxInterval + } + return nil +} + +// MachineClassSpec describes an Omni MachineClass resource spec. +type MachineClassSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // MatchLabels is the list of labels to match the machine to make it part of the machine class. + MatchLabels []string `protobuf:"bytes,1,rep,name=match_labels,json=matchLabels,proto3" json:"match_labels,omitempty"` +} + +func (x *MachineClassSpec) Reset() { + *x = MachineClassSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[52] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MachineClassSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MachineClassSpec) ProtoMessage() {} + +func (x *MachineClassSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[52] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MachineClassSpec.ProtoReflect.Descriptor instead. +func (*MachineClassSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{52} +} + +func (x *MachineClassSpec) GetMatchLabels() []string { + if x != nil { + return x.MatchLabels + } + return nil +} + +// MachineConfigGenOptionsSpec describes machine related config generation inputs. +type MachineConfigGenOptionsSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + InstallDisk string `protobuf:"bytes,1,opt,name=install_disk,json=installDisk,proto3" json:"install_disk,omitempty"` +} + +func (x *MachineConfigGenOptionsSpec) Reset() { + *x = MachineConfigGenOptionsSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[53] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MachineConfigGenOptionsSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MachineConfigGenOptionsSpec) ProtoMessage() {} + +func (x *MachineConfigGenOptionsSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[53] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MachineConfigGenOptionsSpec.ProtoReflect.Descriptor instead. +func (*MachineConfigGenOptionsSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{53} +} + +func (x *MachineConfigGenOptionsSpec) GetInstallDisk() string { + if x != nil { + return x.InstallDisk + } + return "" +} + +// EtcdAuditResult is updated when the etcd audit removes a member. +// +// This resource is used to re-trigger the controlplane status checks when etcd audit removes a member. +type EtcdAuditResultSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // EtcdMemberIds contains the list of ids of the members that were last removed. + // The list is always sorted. + EtcdMemberIds []uint64 `protobuf:"varint,1,rep,packed,name=etcd_member_ids,json=etcdMemberIds,proto3" json:"etcd_member_ids,omitempty"` +} + +func (x *EtcdAuditResultSpec) Reset() { + *x = EtcdAuditResultSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[54] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EtcdAuditResultSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EtcdAuditResultSpec) ProtoMessage() {} + +func (x *EtcdAuditResultSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[54] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EtcdAuditResultSpec.ProtoReflect.Descriptor instead. +func (*EtcdAuditResultSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{54} +} + +func (x *EtcdAuditResultSpec) GetEtcdMemberIds() []uint64 { + if x != nil { + return x.EtcdMemberIds + } + return nil +} + +// KubeconfigSpec describes a Kubernetes client configuraiton for a cluster. +type KubeconfigSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Marshalled kubeconfig. + Data []byte `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` +} + +func (x *KubeconfigSpec) Reset() { + *x = KubeconfigSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[55] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *KubeconfigSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*KubeconfigSpec) ProtoMessage() {} + +func (x *KubeconfigSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[55] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use KubeconfigSpec.ProtoReflect.Descriptor instead. +func (*KubeconfigSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{55} +} + +func (x *KubeconfigSpec) GetData() []byte { + if x != nil { + return x.Data + } + return nil +} + +// KubernetesUsageSpec represents kubernetes resource usage for a cluster. +type KubernetesUsageSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Cpu *KubernetesUsageSpec_Quantity `protobuf:"bytes,1,opt,name=cpu,proto3" json:"cpu,omitempty"` + Mem *KubernetesUsageSpec_Quantity `protobuf:"bytes,2,opt,name=mem,proto3" json:"mem,omitempty"` + Storage *KubernetesUsageSpec_Quantity `protobuf:"bytes,3,opt,name=storage,proto3" json:"storage,omitempty"` + Pods *KubernetesUsageSpec_Pod `protobuf:"bytes,4,opt,name=pods,proto3" json:"pods,omitempty"` +} + +func (x *KubernetesUsageSpec) Reset() { + *x = KubernetesUsageSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[56] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *KubernetesUsageSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*KubernetesUsageSpec) ProtoMessage() {} + +func (x *KubernetesUsageSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[56] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use KubernetesUsageSpec.ProtoReflect.Descriptor instead. +func (*KubernetesUsageSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{56} +} + +func (x *KubernetesUsageSpec) GetCpu() *KubernetesUsageSpec_Quantity { + if x != nil { + return x.Cpu + } + return nil +} + +func (x *KubernetesUsageSpec) GetMem() *KubernetesUsageSpec_Quantity { + if x != nil { + return x.Mem + } + return nil +} + +func (x *KubernetesUsageSpec) GetStorage() *KubernetesUsageSpec_Quantity { + if x != nil { + return x.Storage + } + return nil +} + +func (x *KubernetesUsageSpec) GetPods() *KubernetesUsageSpec_Pod { + if x != nil { + return x.Pods + } + return nil +} + +// ImagePullRequestSpec describes an Omni ImagePullRequest resource spec. +type ImagePullRequestSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // NodeImageList are the images to be pulled into the node. + NodeImageList []*ImagePullRequestSpec_NodeImageList `protobuf:"bytes,1,rep,name=node_image_list,json=nodeImageList,proto3" json:"node_image_list,omitempty"` +} + +func (x *ImagePullRequestSpec) Reset() { + *x = ImagePullRequestSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[57] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ImagePullRequestSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ImagePullRequestSpec) ProtoMessage() {} + +func (x *ImagePullRequestSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[57] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ImagePullRequestSpec.ProtoReflect.Descriptor instead. +func (*ImagePullRequestSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{57} +} + +func (x *ImagePullRequestSpec) GetNodeImageList() []*ImagePullRequestSpec_NodeImageList { + if x != nil { + return x.NodeImageList + } + return nil +} + +// ImagePullStatusSpec describes an Omni ImagePullStatus resource spec. +type ImagePullStatusSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + LastProcessedNode string `protobuf:"bytes,1,opt,name=last_processed_node,json=lastProcessedNode,proto3" json:"last_processed_node,omitempty"` + LastProcessedImage string `protobuf:"bytes,2,opt,name=last_processed_image,json=lastProcessedImage,proto3" json:"last_processed_image,omitempty"` + LastProcessedError string `protobuf:"bytes,3,opt,name=last_processed_error,json=lastProcessedError,proto3" json:"last_processed_error,omitempty"` + ProcessedCount uint32 `protobuf:"varint,4,opt,name=processed_count,json=processedCount,proto3" json:"processed_count,omitempty"` + TotalCount uint32 `protobuf:"varint,5,opt,name=total_count,json=totalCount,proto3" json:"total_count,omitempty"` + // RequestVersion is the version of the ImagePullRequest that this status is for. + RequestVersion string `protobuf:"bytes,6,opt,name=request_version,json=requestVersion,proto3" json:"request_version,omitempty"` +} + +func (x *ImagePullStatusSpec) Reset() { + *x = ImagePullStatusSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[58] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ImagePullStatusSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ImagePullStatusSpec) ProtoMessage() {} + +func (x *ImagePullStatusSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[58] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ImagePullStatusSpec.ProtoReflect.Descriptor instead. +func (*ImagePullStatusSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{58} +} + +func (x *ImagePullStatusSpec) GetLastProcessedNode() string { + if x != nil { + return x.LastProcessedNode + } + return "" +} + +func (x *ImagePullStatusSpec) GetLastProcessedImage() string { + if x != nil { + return x.LastProcessedImage + } + return "" +} + +func (x *ImagePullStatusSpec) GetLastProcessedError() string { + if x != nil { + return x.LastProcessedError + } + return "" +} + +func (x *ImagePullStatusSpec) GetProcessedCount() uint32 { + if x != nil { + return x.ProcessedCount + } + return 0 +} + +func (x *ImagePullStatusSpec) GetTotalCount() uint32 { + if x != nil { + return x.TotalCount + } + return 0 +} + +func (x *ImagePullStatusSpec) GetRequestVersion() string { + if x != nil { + return x.RequestVersion + } + return "" +} + +// SchematicSpec keeps all schematics generated by Omni. +// For each schematic it keeps information about the list of extensions. +type SchematicSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Extensions []string `protobuf:"bytes,1,rep,name=extensions,proto3" json:"extensions,omitempty"` +} + +func (x *SchematicSpec) Reset() { + *x = SchematicSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[59] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SchematicSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SchematicSpec) ProtoMessage() {} + +func (x *SchematicSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[59] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SchematicSpec.ProtoReflect.Descriptor instead. +func (*SchematicSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{59} +} + +func (x *SchematicSpec) GetExtensions() []string { + if x != nil { + return x.Extensions + } + return nil +} + +// TalosExtensionsSpec represents all available extensions for a particular Talos version. +type TalosExtensionsSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Items []*TalosExtensionsSpec_Info `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` +} + +func (x *TalosExtensionsSpec) Reset() { + *x = TalosExtensionsSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[60] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TalosExtensionsSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TalosExtensionsSpec) ProtoMessage() {} + +func (x *TalosExtensionsSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[60] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TalosExtensionsSpec.ProtoReflect.Descriptor instead. +func (*TalosExtensionsSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{60} +} + +func (x *TalosExtensionsSpec) GetItems() []*TalosExtensionsSpec_Info { + if x != nil { + return x.Items + } + return nil +} + +// SchematicConfigurationSpec is the desired Image Factory schematic for a machine, machine set or a cluster. +type SchematicConfigurationSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SchematicId string `protobuf:"bytes,1,opt,name=schematic_id,json=schematicId,proto3" json:"schematic_id,omitempty"` + Target SchematicConfigurationSpec_Target `protobuf:"varint,2,opt,name=target,proto3,enum=specs.SchematicConfigurationSpec_Target" json:"target,omitempty"` +} + +func (x *SchematicConfigurationSpec) Reset() { + *x = SchematicConfigurationSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[61] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SchematicConfigurationSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SchematicConfigurationSpec) ProtoMessage() {} + +func (x *SchematicConfigurationSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[61] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SchematicConfigurationSpec.ProtoReflect.Descriptor instead. +func (*SchematicConfigurationSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{61} +} + +func (x *SchematicConfigurationSpec) GetSchematicId() string { + if x != nil { + return x.SchematicId + } + return "" +} + +func (x *SchematicConfigurationSpec) GetTarget() SchematicConfigurationSpec_Target { + if x != nil { + return x.Target + } + return SchematicConfigurationSpec_Unknown +} + +// HardwareStatus describes machine hardware status. +type MachineStatusSpec_HardwareStatus struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // CPU information. + Processors []*MachineStatusSpec_HardwareStatus_Processor `protobuf:"bytes,1,rep,name=processors,proto3" json:"processors,omitempty"` + // Memory information. + MemoryModules []*MachineStatusSpec_HardwareStatus_MemoryModule `protobuf:"bytes,2,rep,name=memory_modules,json=memoryModules,proto3" json:"memory_modules,omitempty"` + // Blockdevice information. + Blockdevices []*MachineStatusSpec_HardwareStatus_BlockDevice `protobuf:"bytes,3,rep,name=blockdevices,proto3" json:"blockdevices,omitempty"` + // Machine architecture. + Arch string `protobuf:"bytes,4,opt,name=arch,proto3" json:"arch,omitempty"` +} + +func (x *MachineStatusSpec_HardwareStatus) Reset() { + *x = MachineStatusSpec_HardwareStatus{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[62] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MachineStatusSpec_HardwareStatus) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MachineStatusSpec_HardwareStatus) ProtoMessage() {} + +func (x *MachineStatusSpec_HardwareStatus) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[62] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MachineStatusSpec_HardwareStatus.ProtoReflect.Descriptor instead. +func (*MachineStatusSpec_HardwareStatus) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{1, 0} +} + +func (x *MachineStatusSpec_HardwareStatus) GetProcessors() []*MachineStatusSpec_HardwareStatus_Processor { + if x != nil { + return x.Processors + } + return nil +} + +func (x *MachineStatusSpec_HardwareStatus) GetMemoryModules() []*MachineStatusSpec_HardwareStatus_MemoryModule { + if x != nil { + return x.MemoryModules + } + return nil +} + +func (x *MachineStatusSpec_HardwareStatus) GetBlockdevices() []*MachineStatusSpec_HardwareStatus_BlockDevice { + if x != nil { + return x.Blockdevices + } + return nil +} + +func (x *MachineStatusSpec_HardwareStatus) GetArch() string { + if x != nil { + return x.Arch + } + return "" +} + +// NetworkStatus describes the status of a machine network . +type MachineStatusSpec_NetworkStatus struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Current machine hostname. + Hostname string `protobuf:"bytes,1,opt,name=hostname,proto3" json:"hostname,omitempty"` + // Current machine domainname. + Domainname string `protobuf:"bytes,2,opt,name=domainname,proto3" json:"domainname,omitempty"` + // List of machine IPs. + Addresses []string `protobuf:"bytes,3,rep,name=addresses,proto3" json:"addresses,omitempty"` + // List of default gateway IPs. + DefaultGateways []string `protobuf:"bytes,4,rep,name=default_gateways,json=defaultGateways,proto3" json:"default_gateways,omitempty"` + // List of physical network interfaces. + NetworkLinks []*MachineStatusSpec_NetworkStatus_NetworkLinkStatus `protobuf:"bytes,5,rep,name=network_links,json=networkLinks,proto3" json:"network_links,omitempty"` +} + +func (x *MachineStatusSpec_NetworkStatus) Reset() { + *x = MachineStatusSpec_NetworkStatus{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[63] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MachineStatusSpec_NetworkStatus) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MachineStatusSpec_NetworkStatus) ProtoMessage() {} + +func (x *MachineStatusSpec_NetworkStatus) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[63] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MachineStatusSpec_NetworkStatus.ProtoReflect.Descriptor instead. +func (*MachineStatusSpec_NetworkStatus) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{1, 1} +} + +func (x *MachineStatusSpec_NetworkStatus) GetHostname() string { + if x != nil { + return x.Hostname + } + return "" +} + +func (x *MachineStatusSpec_NetworkStatus) GetDomainname() string { + if x != nil { + return x.Domainname + } + return "" +} + +func (x *MachineStatusSpec_NetworkStatus) GetAddresses() []string { + if x != nil { + return x.Addresses + } + return nil +} + +func (x *MachineStatusSpec_NetworkStatus) GetDefaultGateways() []string { + if x != nil { + return x.DefaultGateways + } + return nil +} + +func (x *MachineStatusSpec_NetworkStatus) GetNetworkLinks() []*MachineStatusSpec_NetworkStatus_NetworkLinkStatus { + if x != nil { + return x.NetworkLinks + } + return nil +} + +// PlatformMetadata describes platform-specific information. +type MachineStatusSpec_PlatformMetadata struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Platform is the name of the platform (e.g. `aws`, `gcp`, `azure`). + Platform string `protobuf:"bytes,1,opt,name=platform,proto3" json:"platform,omitempty"` + // Hostname is the hostname of the machine. + Hostname string `protobuf:"bytes,2,opt,name=hostname,proto3" json:"hostname,omitempty"` + // Region (in the cloud). + Region string `protobuf:"bytes,3,opt,name=region,proto3" json:"region,omitempty"` + // Availability zone (in the cloud). + Zone string `protobuf:"bytes,4,opt,name=zone,proto3" json:"zone,omitempty"` + // Instance type (in the cloud). + InstanceType string `protobuf:"bytes,5,opt,name=instance_type,json=instanceType,proto3" json:"instance_type,omitempty"` + // Instance ID (in the cloud). + InstanceId string `protobuf:"bytes,6,opt,name=instance_id,json=instanceId,proto3" json:"instance_id,omitempty"` + // Provider ID (for the Node resource). + ProviderId string `protobuf:"bytes,7,opt,name=provider_id,json=providerId,proto3" json:"provider_id,omitempty"` + // Spot instance flag. + Spot bool `protobuf:"varint,8,opt,name=spot,proto3" json:"spot,omitempty"` +} + +func (x *MachineStatusSpec_PlatformMetadata) Reset() { + *x = MachineStatusSpec_PlatformMetadata{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[64] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MachineStatusSpec_PlatformMetadata) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MachineStatusSpec_PlatformMetadata) ProtoMessage() {} + +func (x *MachineStatusSpec_PlatformMetadata) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[64] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MachineStatusSpec_PlatformMetadata.ProtoReflect.Descriptor instead. +func (*MachineStatusSpec_PlatformMetadata) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{1, 2} +} + +func (x *MachineStatusSpec_PlatformMetadata) GetPlatform() string { + if x != nil { + return x.Platform + } + return "" +} + +func (x *MachineStatusSpec_PlatformMetadata) GetHostname() string { + if x != nil { + return x.Hostname + } + return "" +} + +func (x *MachineStatusSpec_PlatformMetadata) GetRegion() string { + if x != nil { + return x.Region + } + return "" +} + +func (x *MachineStatusSpec_PlatformMetadata) GetZone() string { + if x != nil { + return x.Zone + } + return "" +} + +func (x *MachineStatusSpec_PlatformMetadata) GetInstanceType() string { + if x != nil { + return x.InstanceType + } + return "" +} + +func (x *MachineStatusSpec_PlatformMetadata) GetInstanceId() string { + if x != nil { + return x.InstanceId + } + return "" +} + +func (x *MachineStatusSpec_PlatformMetadata) GetProviderId() string { + if x != nil { + return x.ProviderId + } + return "" +} + +func (x *MachineStatusSpec_PlatformMetadata) GetSpot() bool { + if x != nil { + return x.Spot + } + return false +} + +type MachineStatusSpec_Schematic struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Id is the image factory schematic id used for the image generation. + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + // Invalid marks the machine as having extensions installed bypassing image factory. + // Which makes it impossible to detect schematic id and manage the image generation + // using image factory. + Invalid bool `protobuf:"varint,2,opt,name=invalid,proto3" json:"invalid,omitempty"` +} + +func (x *MachineStatusSpec_Schematic) Reset() { + *x = MachineStatusSpec_Schematic{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[65] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MachineStatusSpec_Schematic) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MachineStatusSpec_Schematic) ProtoMessage() {} + +func (x *MachineStatusSpec_Schematic) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[65] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MachineStatusSpec_Schematic.ProtoReflect.Descriptor instead. +func (*MachineStatusSpec_Schematic) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{1, 3} +} + +func (x *MachineStatusSpec_Schematic) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *MachineStatusSpec_Schematic) GetInvalid() bool { + if x != nil { + return x.Invalid + } + return false +} + +// Processor describes machine CPU. +type MachineStatusSpec_HardwareStatus_Processor struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Number of cores. + CoreCount uint32 `protobuf:"varint,1,opt,name=core_count,json=coreCount,proto3" json:"core_count,omitempty"` + // Number of threads. + ThreadCount uint32 `protobuf:"varint,2,opt,name=thread_count,json=threadCount,proto3" json:"thread_count,omitempty"` + // CPU frequency in MHz. + Frequency uint32 `protobuf:"varint,3,opt,name=frequency,proto3" json:"frequency,omitempty"` + // CPU manufacturer and model. + Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"` + // CPU manufacturer. + Manufacturer string `protobuf:"bytes,5,opt,name=manufacturer,proto3" json:"manufacturer,omitempty"` +} + +func (x *MachineStatusSpec_HardwareStatus_Processor) Reset() { + *x = MachineStatusSpec_HardwareStatus_Processor{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[67] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MachineStatusSpec_HardwareStatus_Processor) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MachineStatusSpec_HardwareStatus_Processor) ProtoMessage() {} + +func (x *MachineStatusSpec_HardwareStatus_Processor) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[67] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MachineStatusSpec_HardwareStatus_Processor.ProtoReflect.Descriptor instead. +func (*MachineStatusSpec_HardwareStatus_Processor) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{1, 0, 0} +} + +func (x *MachineStatusSpec_HardwareStatus_Processor) GetCoreCount() uint32 { + if x != nil { + return x.CoreCount + } + return 0 +} + +func (x *MachineStatusSpec_HardwareStatus_Processor) GetThreadCount() uint32 { + if x != nil { + return x.ThreadCount + } + return 0 +} + +func (x *MachineStatusSpec_HardwareStatus_Processor) GetFrequency() uint32 { + if x != nil { + return x.Frequency + } + return 0 +} + +func (x *MachineStatusSpec_HardwareStatus_Processor) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *MachineStatusSpec_HardwareStatus_Processor) GetManufacturer() string { + if x != nil { + return x.Manufacturer + } + return "" +} + +// MemoryModule describes machine memory. +type MachineStatusSpec_HardwareStatus_MemoryModule struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Size of memory in MB. + SizeMb uint32 `protobuf:"varint,1,opt,name=size_mb,json=sizeMb,proto3" json:"size_mb,omitempty"` + // Memory manufacturer and model. + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` +} + +func (x *MachineStatusSpec_HardwareStatus_MemoryModule) Reset() { + *x = MachineStatusSpec_HardwareStatus_MemoryModule{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[68] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MachineStatusSpec_HardwareStatus_MemoryModule) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MachineStatusSpec_HardwareStatus_MemoryModule) ProtoMessage() {} + +func (x *MachineStatusSpec_HardwareStatus_MemoryModule) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[68] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MachineStatusSpec_HardwareStatus_MemoryModule.ProtoReflect.Descriptor instead. +func (*MachineStatusSpec_HardwareStatus_MemoryModule) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{1, 0, 1} +} + +func (x *MachineStatusSpec_HardwareStatus_MemoryModule) GetSizeMb() uint32 { + if x != nil { + return x.SizeMb + } + return 0 +} + +func (x *MachineStatusSpec_HardwareStatus_MemoryModule) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +// BlockDevice describes a block device. +type MachineStatusSpec_HardwareStatus_BlockDevice struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Size indicates the disk size in bytes. + Size uint64 `protobuf:"varint,1,opt,name=size,proto3" json:"size,omitempty"` + // Model idicates the disk model. + Model string `protobuf:"bytes,2,opt,name=model,proto3" json:"model,omitempty"` + // Linux blockdevice name (e.g. `/dev/sda`). + LinuxName string `protobuf:"bytes,3,opt,name=linux_name,json=linuxName,proto3" json:"linux_name,omitempty"` + // Name as in `/sys/block/<dev>/device/name`. + Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` + // Serial as in `/sys/block/<dev>/device/serial`. + Serial string `protobuf:"bytes,5,opt,name=serial,proto3" json:"serial,omitempty"` + // Uuid as in `/sys/block/<dev>/device/uuid`. + Uuid string `protobuf:"bytes,7,opt,name=uuid,proto3" json:"uuid,omitempty"` + // Wwid as in `/sys/block/<dev>/device/wwid`. + Wwid string `protobuf:"bytes,8,opt,name=wwid,proto3" json:"wwid,omitempty"` + // Type is a type of the disk: nvme, ssd, hdd, sd card. + Type string `protobuf:"bytes,9,opt,name=type,proto3" json:"type,omitempty"` + // BusPath is the bus path of the disk. + BusPath string `protobuf:"bytes,10,opt,name=bus_path,json=busPath,proto3" json:"bus_path,omitempty"` + // SystemDisk is the system disk flag. + SystemDisk bool `protobuf:"varint,11,opt,name=system_disk,json=systemDisk,proto3" json:"system_disk,omitempty"` +} + +func (x *MachineStatusSpec_HardwareStatus_BlockDevice) Reset() { + *x = MachineStatusSpec_HardwareStatus_BlockDevice{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[69] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MachineStatusSpec_HardwareStatus_BlockDevice) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MachineStatusSpec_HardwareStatus_BlockDevice) ProtoMessage() {} + +func (x *MachineStatusSpec_HardwareStatus_BlockDevice) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[69] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MachineStatusSpec_HardwareStatus_BlockDevice.ProtoReflect.Descriptor instead. +func (*MachineStatusSpec_HardwareStatus_BlockDevice) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{1, 0, 2} +} + +func (x *MachineStatusSpec_HardwareStatus_BlockDevice) GetSize() uint64 { + if x != nil { + return x.Size + } + return 0 +} + +func (x *MachineStatusSpec_HardwareStatus_BlockDevice) GetModel() string { + if x != nil { + return x.Model + } + return "" +} + +func (x *MachineStatusSpec_HardwareStatus_BlockDevice) GetLinuxName() string { + if x != nil { + return x.LinuxName + } + return "" +} + +func (x *MachineStatusSpec_HardwareStatus_BlockDevice) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *MachineStatusSpec_HardwareStatus_BlockDevice) GetSerial() string { + if x != nil { + return x.Serial + } + return "" +} + +func (x *MachineStatusSpec_HardwareStatus_BlockDevice) GetUuid() string { + if x != nil { + return x.Uuid + } + return "" +} + +func (x *MachineStatusSpec_HardwareStatus_BlockDevice) GetWwid() string { + if x != nil { + return x.Wwid + } + return "" +} + +func (x *MachineStatusSpec_HardwareStatus_BlockDevice) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *MachineStatusSpec_HardwareStatus_BlockDevice) GetBusPath() string { + if x != nil { + return x.BusPath + } + return "" +} + +func (x *MachineStatusSpec_HardwareStatus_BlockDevice) GetSystemDisk() bool { + if x != nil { + return x.SystemDisk + } + return false +} + +// Physical network interfaces. +type MachineStatusSpec_NetworkStatus_NetworkLinkStatus struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Linux interface name. + LinuxName string `protobuf:"bytes,1,opt,name=linux_name,json=linuxName,proto3" json:"linux_name,omitempty"` + // MAC address. + HardwareAddress string `protobuf:"bytes,2,opt,name=hardware_address,json=hardwareAddress,proto3" json:"hardware_address,omitempty"` + // Speed in Mbps. + SpeedMbps uint32 `protobuf:"varint,3,opt,name=speed_mbps,json=speedMbps,proto3" json:"speed_mbps,omitempty"` + // Link status. + LinkUp bool `protobuf:"varint,4,opt,name=link_up,json=linkUp,proto3" json:"link_up,omitempty"` + // Hardware description. + Description string `protobuf:"bytes,5,opt,name=description,proto3" json:"description,omitempty"` +} + +func (x *MachineStatusSpec_NetworkStatus_NetworkLinkStatus) Reset() { + *x = MachineStatusSpec_NetworkStatus_NetworkLinkStatus{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[70] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MachineStatusSpec_NetworkStatus_NetworkLinkStatus) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MachineStatusSpec_NetworkStatus_NetworkLinkStatus) ProtoMessage() {} + +func (x *MachineStatusSpec_NetworkStatus_NetworkLinkStatus) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[70] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MachineStatusSpec_NetworkStatus_NetworkLinkStatus.ProtoReflect.Descriptor instead. +func (*MachineStatusSpec_NetworkStatus_NetworkLinkStatus) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{1, 1, 0} +} + +func (x *MachineStatusSpec_NetworkStatus_NetworkLinkStatus) GetLinuxName() string { + if x != nil { + return x.LinuxName + } + return "" +} + +func (x *MachineStatusSpec_NetworkStatus_NetworkLinkStatus) GetHardwareAddress() string { + if x != nil { + return x.HardwareAddress + } + return "" +} + +func (x *MachineStatusSpec_NetworkStatus_NetworkLinkStatus) GetSpeedMbps() uint32 { + if x != nil { + return x.SpeedMbps + } + return 0 +} + +func (x *MachineStatusSpec_NetworkStatus_NetworkLinkStatus) GetLinkUp() bool { + if x != nil { + return x.LinkUp + } + return false +} + +func (x *MachineStatusSpec_NetworkStatus_NetworkLinkStatus) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +type ClusterSpec_Features struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // EnableWorkloadProxy enables workload proxy. + EnableWorkloadProxy bool `protobuf:"varint,1,opt,name=enable_workload_proxy,json=enableWorkloadProxy,proto3" json:"enable_workload_proxy,omitempty"` + // DiskEncryption enables disk encryption on all nodes. + DiskEncryption bool `protobuf:"varint,2,opt,name=disk_encryption,json=diskEncryption,proto3" json:"disk_encryption,omitempty"` +} + +func (x *ClusterSpec_Features) Reset() { + *x = ClusterSpec_Features{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[71] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ClusterSpec_Features) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClusterSpec_Features) ProtoMessage() {} + +func (x *ClusterSpec_Features) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[71] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ClusterSpec_Features.ProtoReflect.Descriptor instead. +func (*ClusterSpec_Features) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{3, 0} +} + +func (x *ClusterSpec_Features) GetEnableWorkloadProxy() bool { + if x != nil { + return x.EnableWorkloadProxy + } + return false +} + +func (x *ClusterSpec_Features) GetDiskEncryption() bool { + if x != nil { + return x.DiskEncryption + } + return false +} + +// MachineClass defines the machine class configuration. +type MachineSetSpec_MachineClass struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Name defines the machine class id to select the machines from. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // MachineCount defines fixed amount of the machines to allocated from the machine class. + MachineCount uint32 `protobuf:"varint,2,opt,name=machine_count,json=machineCount,proto3" json:"machine_count,omitempty"` + // AllocationType defines special constants for the amount of machines to be allocated. + AllocationType MachineSetSpec_MachineClass_AllocationType `protobuf:"varint,3,opt,name=allocation_type,json=allocationType,proto3,enum=specs.MachineSetSpec_MachineClass_AllocationType" json:"allocation_type,omitempty"` +} + +func (x *MachineSetSpec_MachineClass) Reset() { + *x = MachineSetSpec_MachineClass{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[72] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MachineSetSpec_MachineClass) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MachineSetSpec_MachineClass) ProtoMessage() {} + +func (x *MachineSetSpec_MachineClass) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[72] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MachineSetSpec_MachineClass.ProtoReflect.Descriptor instead. +func (*MachineSetSpec_MachineClass) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{35, 0} +} + +func (x *MachineSetSpec_MachineClass) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *MachineSetSpec_MachineClass) GetMachineCount() uint32 { + if x != nil { + return x.MachineCount + } + return 0 +} + +func (x *MachineSetSpec_MachineClass) GetAllocationType() MachineSetSpec_MachineClass_AllocationType { + if x != nil { + return x.AllocationType + } + return MachineSetSpec_MachineClass_Static +} + +// BootstrapSpec defines the bootstrap spec for the control plane machine set. +// It can contain a reference to an etcd backup, which can be used to bootstrap etcd. +type MachineSetSpec_BootstrapSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // ClusterUuid is the UUID of the cluster to bootstrap. It can be obtained via `omnictl get clusteruuid <cluster-name>` + ClusterUuid string `protobuf:"bytes,1,opt,name=cluster_uuid,json=clusterUuid,proto3" json:"cluster_uuid,omitempty"` + // Snapshot is the file name of the etcd snapshot to restore from. It follows the format similar to `FFFFFFFFFFFFFFFF.snapshot`. + Snapshot string `protobuf:"bytes,2,opt,name=snapshot,proto3" json:"snapshot,omitempty"` +} + +func (x *MachineSetSpec_BootstrapSpec) Reset() { + *x = MachineSetSpec_BootstrapSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[73] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MachineSetSpec_BootstrapSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MachineSetSpec_BootstrapSpec) ProtoMessage() {} + +func (x *MachineSetSpec_BootstrapSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[73] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MachineSetSpec_BootstrapSpec.ProtoReflect.Descriptor instead. +func (*MachineSetSpec_BootstrapSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{35, 1} +} + +func (x *MachineSetSpec_BootstrapSpec) GetClusterUuid() string { + if x != nil { + return x.ClusterUuid + } + return "" +} + +func (x *MachineSetSpec_BootstrapSpec) GetSnapshot() string { + if x != nil { + return x.Snapshot + } + return "" +} + +// RollingUpdateStrategyConfig defines the rolling update strategy configuration. +type MachineSetSpec_RollingUpdateStrategyConfig struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // MaxParallelism is the maximum number of machines that can be processed in parallel. + // When unset or set to 0, it defaults to 1. + MaxParallelism uint32 `protobuf:"varint,1,opt,name=max_parallelism,json=maxParallelism,proto3" json:"max_parallelism,omitempty"` +} + +func (x *MachineSetSpec_RollingUpdateStrategyConfig) Reset() { + *x = MachineSetSpec_RollingUpdateStrategyConfig{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[74] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MachineSetSpec_RollingUpdateStrategyConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MachineSetSpec_RollingUpdateStrategyConfig) ProtoMessage() {} + +func (x *MachineSetSpec_RollingUpdateStrategyConfig) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[74] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MachineSetSpec_RollingUpdateStrategyConfig.ProtoReflect.Descriptor instead. +func (*MachineSetSpec_RollingUpdateStrategyConfig) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{35, 2} +} + +func (x *MachineSetSpec_RollingUpdateStrategyConfig) GetMaxParallelism() uint32 { + if x != nil { + return x.MaxParallelism + } + return 0 +} + +// UpdateConfig defines the update configuration. +type MachineSetSpec_UpdateStrategyConfig struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Rolling is the rolling update configuration. + // Used only when the UpdateStrategy is set to Rolling. + Rolling *MachineSetSpec_RollingUpdateStrategyConfig `protobuf:"bytes,1,opt,name=rolling,proto3" json:"rolling,omitempty"` +} + +func (x *MachineSetSpec_UpdateStrategyConfig) Reset() { + *x = MachineSetSpec_UpdateStrategyConfig{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[75] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MachineSetSpec_UpdateStrategyConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MachineSetSpec_UpdateStrategyConfig) ProtoMessage() {} + +func (x *MachineSetSpec_UpdateStrategyConfig) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[75] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MachineSetSpec_UpdateStrategyConfig.ProtoReflect.Descriptor instead. +func (*MachineSetSpec_UpdateStrategyConfig) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{35, 3} +} + +func (x *MachineSetSpec_UpdateStrategyConfig) GetRolling() *MachineSetSpec_RollingUpdateStrategyConfig { + if x != nil { + return x.Rolling + } + return nil +} + +type ControlPlaneStatusSpec_Condition struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Type ConditionType `protobuf:"varint,1,opt,name=type,proto3,enum=specs.ConditionType" json:"type,omitempty"` + Reason string `protobuf:"bytes,2,opt,name=reason,proto3" json:"reason,omitempty"` + Status ControlPlaneStatusSpec_Condition_Status `protobuf:"varint,3,opt,name=status,proto3,enum=specs.ControlPlaneStatusSpec_Condition_Status" json:"status,omitempty"` + Severity ControlPlaneStatusSpec_Condition_Severity `protobuf:"varint,4,opt,name=severity,proto3,enum=specs.ControlPlaneStatusSpec_Condition_Severity" json:"severity,omitempty"` +} + +func (x *ControlPlaneStatusSpec_Condition) Reset() { + *x = ControlPlaneStatusSpec_Condition{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[76] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ControlPlaneStatusSpec_Condition) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ControlPlaneStatusSpec_Condition) ProtoMessage() {} + +func (x *ControlPlaneStatusSpec_Condition) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[76] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ControlPlaneStatusSpec_Condition.ProtoReflect.Descriptor instead. +func (*ControlPlaneStatusSpec_Condition) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{41, 0} +} + +func (x *ControlPlaneStatusSpec_Condition) GetType() ConditionType { + if x != nil { + return x.Type + } + return ConditionType_UnknownCondition +} + +func (x *ControlPlaneStatusSpec_Condition) GetReason() string { + if x != nil { + return x.Reason + } + return "" +} + +func (x *ControlPlaneStatusSpec_Condition) GetStatus() ControlPlaneStatusSpec_Condition_Status { + if x != nil { + return x.Status + } + return ControlPlaneStatusSpec_Condition_Unknown +} + +func (x *ControlPlaneStatusSpec_Condition) GetSeverity() ControlPlaneStatusSpec_Condition_Severity { + if x != nil { + return x.Severity + } + return ControlPlaneStatusSpec_Condition_Info +} + +type KubernetesStatusSpec_NodeStatus struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Nodename string `protobuf:"bytes,1,opt,name=nodename,proto3" json:"nodename,omitempty"` + KubeletVersion string `protobuf:"bytes,2,opt,name=kubelet_version,json=kubeletVersion,proto3" json:"kubelet_version,omitempty"` + Ready bool `protobuf:"varint,3,opt,name=ready,proto3" json:"ready,omitempty"` +} + +func (x *KubernetesStatusSpec_NodeStatus) Reset() { + *x = KubernetesStatusSpec_NodeStatus{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[77] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *KubernetesStatusSpec_NodeStatus) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*KubernetesStatusSpec_NodeStatus) ProtoMessage() {} + +func (x *KubernetesStatusSpec_NodeStatus) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[77] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use KubernetesStatusSpec_NodeStatus.ProtoReflect.Descriptor instead. +func (*KubernetesStatusSpec_NodeStatus) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{43, 0} +} + +func (x *KubernetesStatusSpec_NodeStatus) GetNodename() string { + if x != nil { + return x.Nodename + } + return "" +} + +func (x *KubernetesStatusSpec_NodeStatus) GetKubeletVersion() string { + if x != nil { + return x.KubeletVersion + } + return "" +} + +func (x *KubernetesStatusSpec_NodeStatus) GetReady() bool { + if x != nil { + return x.Ready + } + return false +} + +type KubernetesStatusSpec_StaticPodStatus struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + App string `protobuf:"bytes,1,opt,name=app,proto3" json:"app,omitempty"` + Version string `protobuf:"bytes,2,opt,name=version,proto3" json:"version,omitempty"` + Ready bool `protobuf:"varint,3,opt,name=ready,proto3" json:"ready,omitempty"` +} + +func (x *KubernetesStatusSpec_StaticPodStatus) Reset() { + *x = KubernetesStatusSpec_StaticPodStatus{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[78] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *KubernetesStatusSpec_StaticPodStatus) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*KubernetesStatusSpec_StaticPodStatus) ProtoMessage() {} + +func (x *KubernetesStatusSpec_StaticPodStatus) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[78] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use KubernetesStatusSpec_StaticPodStatus.ProtoReflect.Descriptor instead. +func (*KubernetesStatusSpec_StaticPodStatus) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{43, 1} +} + +func (x *KubernetesStatusSpec_StaticPodStatus) GetApp() string { + if x != nil { + return x.App + } + return "" +} + +func (x *KubernetesStatusSpec_StaticPodStatus) GetVersion() string { + if x != nil { + return x.Version + } + return "" +} + +func (x *KubernetesStatusSpec_StaticPodStatus) GetReady() bool { + if x != nil { + return x.Ready + } + return false +} + +type KubernetesStatusSpec_NodeStaticPods struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Nodename string `protobuf:"bytes,1,opt,name=nodename,proto3" json:"nodename,omitempty"` + StaticPods []*KubernetesStatusSpec_StaticPodStatus `protobuf:"bytes,2,rep,name=static_pods,json=staticPods,proto3" json:"static_pods,omitempty"` +} + +func (x *KubernetesStatusSpec_NodeStaticPods) Reset() { + *x = KubernetesStatusSpec_NodeStaticPods{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[79] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *KubernetesStatusSpec_NodeStaticPods) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*KubernetesStatusSpec_NodeStaticPods) ProtoMessage() {} + +func (x *KubernetesStatusSpec_NodeStaticPods) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[79] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use KubernetesStatusSpec_NodeStaticPods.ProtoReflect.Descriptor instead. +func (*KubernetesStatusSpec_NodeStaticPods) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{43, 2} +} + +func (x *KubernetesStatusSpec_NodeStaticPods) GetNodename() string { + if x != nil { + return x.Nodename + } + return "" +} + +func (x *KubernetesStatusSpec_NodeStaticPods) GetStaticPods() []*KubernetesStatusSpec_StaticPodStatus { + if x != nil { + return x.StaticPods + } + return nil +} + +type KubernetesUsageSpec_Quantity struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Requests float64 `protobuf:"fixed64,1,opt,name=requests,proto3" json:"requests,omitempty"` + Limits float64 `protobuf:"fixed64,2,opt,name=limits,proto3" json:"limits,omitempty"` + Capacity float64 `protobuf:"fixed64,3,opt,name=capacity,proto3" json:"capacity,omitempty"` +} + +func (x *KubernetesUsageSpec_Quantity) Reset() { + *x = KubernetesUsageSpec_Quantity{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[80] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *KubernetesUsageSpec_Quantity) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*KubernetesUsageSpec_Quantity) ProtoMessage() {} + +func (x *KubernetesUsageSpec_Quantity) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[80] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use KubernetesUsageSpec_Quantity.ProtoReflect.Descriptor instead. +func (*KubernetesUsageSpec_Quantity) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{56, 0} +} + +func (x *KubernetesUsageSpec_Quantity) GetRequests() float64 { + if x != nil { + return x.Requests + } + return 0 +} + +func (x *KubernetesUsageSpec_Quantity) GetLimits() float64 { + if x != nil { + return x.Limits + } + return 0 +} + +func (x *KubernetesUsageSpec_Quantity) GetCapacity() float64 { + if x != nil { + return x.Capacity + } + return 0 +} + +type KubernetesUsageSpec_Pod struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Count int32 `protobuf:"varint,1,opt,name=count,proto3" json:"count,omitempty"` + Capacity int32 `protobuf:"varint,3,opt,name=capacity,proto3" json:"capacity,omitempty"` +} + +func (x *KubernetesUsageSpec_Pod) Reset() { + *x = KubernetesUsageSpec_Pod{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[81] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *KubernetesUsageSpec_Pod) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*KubernetesUsageSpec_Pod) ProtoMessage() {} + +func (x *KubernetesUsageSpec_Pod) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[81] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use KubernetesUsageSpec_Pod.ProtoReflect.Descriptor instead. +func (*KubernetesUsageSpec_Pod) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{56, 1} +} + +func (x *KubernetesUsageSpec_Pod) GetCount() int32 { + if x != nil { + return x.Count + } + return 0 +} + +func (x *KubernetesUsageSpec_Pod) GetCapacity() int32 { + if x != nil { + return x.Capacity + } + return 0 +} + +type ImagePullRequestSpec_NodeImageList struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Node string `protobuf:"bytes,1,opt,name=node,proto3" json:"node,omitempty"` + Images []string `protobuf:"bytes,2,rep,name=images,proto3" json:"images,omitempty"` +} + +func (x *ImagePullRequestSpec_NodeImageList) Reset() { + *x = ImagePullRequestSpec_NodeImageList{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[82] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ImagePullRequestSpec_NodeImageList) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ImagePullRequestSpec_NodeImageList) ProtoMessage() {} + +func (x *ImagePullRequestSpec_NodeImageList) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[82] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ImagePullRequestSpec_NodeImageList.ProtoReflect.Descriptor instead. +func (*ImagePullRequestSpec_NodeImageList) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{57, 0} +} + +func (x *ImagePullRequestSpec_NodeImageList) GetNode() string { + if x != nil { + return x.Node + } + return "" +} + +func (x *ImagePullRequestSpec_NodeImageList) GetImages() []string { + if x != nil { + return x.Images + } + return nil +} + +// Info is a merged representation of the extensions manifest and image factory versions response. +type TalosExtensionsSpec_Info struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Author string `protobuf:"bytes,2,opt,name=author,proto3" json:"author,omitempty"` + Version string `protobuf:"bytes,3,opt,name=version,proto3" json:"version,omitempty"` + Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"` + Ref string `protobuf:"bytes,5,opt,name=ref,proto3" json:"ref,omitempty"` + Digest string `protobuf:"bytes,6,opt,name=digest,proto3" json:"digest,omitempty"` +} + +func (x *TalosExtensionsSpec_Info) Reset() { + *x = TalosExtensionsSpec_Info{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_omni_proto_msgTypes[83] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TalosExtensionsSpec_Info) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TalosExtensionsSpec_Info) ProtoMessage() {} + +func (x *TalosExtensionsSpec_Info) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_omni_proto_msgTypes[83] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TalosExtensionsSpec_Info.ProtoReflect.Descriptor instead. +func (*TalosExtensionsSpec_Info) Descriptor() ([]byte, []int) { + return file_omni_specs_omni_proto_rawDescGZIP(), []int{60, 0} +} + +func (x *TalosExtensionsSpec_Info) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *TalosExtensionsSpec_Info) GetAuthor() string { + if x != nil { + return x.Author + } + return "" +} + +func (x *TalosExtensionsSpec_Info) GetVersion() string { + if x != nil { + return x.Version + } + return "" +} + +func (x *TalosExtensionsSpec_Info) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *TalosExtensionsSpec_Info) GetRef() string { + if x != nil { + return x.Ref + } + return "" +} + +func (x *TalosExtensionsSpec_Info) GetDigest() string { + if x != nil { + return x.Digest + } + return "" +} + +var File_omni_specs_omni_proto protoreflect.FileDescriptor + +var file_omni_specs_omni_proto_rawDesc = []byte{ + 0x0a, 0x15, 0x6f, 0x6d, 0x6e, 0x69, 0x2f, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2f, 0x6f, 0x6d, 0x6e, + 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x73, 0x70, 0x65, 0x63, 0x73, 0x1a, 0x1b, + 0x74, 0x61, 0x6c, 0x6f, 0x73, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x2f, 0x6d, 0x61, + 0x63, 0x68, 0x69, 0x6e, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x66, 0x0a, 0x0b, + 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x2d, 0x0a, 0x12, 0x6d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x4a, 0x04, + 0x08, 0x04, 0x10, 0x05, 0x22, 0x86, 0x12, 0x0a, 0x11, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x61, + 0x6c, 0x6f, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x74, 0x61, 0x6c, 0x6f, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x43, 0x0a, 0x08, 0x68, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x27, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, + 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x48, 0x61, 0x72, 0x64, + 0x77, 0x61, 0x72, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x08, 0x68, 0x61, 0x72, 0x64, + 0x77, 0x61, 0x72, 0x65, 0x12, 0x40, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2e, 0x4d, 0x61, + 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x70, 0x65, 0x63, 0x2e, + 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x07, 0x6e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x61, 0x73, 0x74, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x2d, 0x0a, 0x12, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x11, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, + 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x63, + 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x6e, + 0x61, 0x6e, 0x63, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x31, + 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x73, + 0x70, 0x65, 0x63, 0x73, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x6f, 0x6c, + 0x65, 0x12, 0x56, 0x0a, 0x11, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x73, + 0x70, 0x65, 0x63, 0x73, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x10, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, + 0x6d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x4c, 0x0a, 0x0c, 0x69, 0x6d, 0x61, + 0x67, 0x65, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x29, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x69, 0x6d, 0x61, 0x67, + 0x65, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x40, 0x0a, 0x09, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x74, 0x69, 0x63, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x73, 0x70, 0x65, + 0x63, 0x73, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x53, 0x70, 0x65, 0x63, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x52, 0x09, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x1a, 0xa9, 0x06, 0x0a, 0x0e, 0x48, 0x61, + 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x51, 0x0a, 0x0a, + 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x31, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x48, 0x61, 0x72, 0x64, 0x77, + 0x61, 0x72, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, + 0x73, 0x6f, 0x72, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, + 0x5b, 0x0a, 0x0e, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2e, + 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x70, 0x65, + 0x63, 0x2e, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x0d, 0x6d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x57, 0x0a, 0x0c, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x48, 0x61, 0x72, + 0x64, 0x77, 0x61, 0x72, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x72, 0x63, 0x68, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x72, 0x63, 0x68, 0x1a, 0xb1, 0x01, 0x0a, 0x09, 0x50, 0x72, + 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6f, 0x72, 0x65, 0x5f, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x63, 0x6f, 0x72, + 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, + 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x74, 0x68, + 0x72, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x66, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x66, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x6d, 0x61, 0x6e, + 0x75, 0x66, 0x61, 0x63, 0x74, 0x75, 0x72, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x6d, 0x61, 0x6e, 0x75, 0x66, 0x61, 0x63, 0x74, 0x75, 0x72, 0x65, 0x72, 0x1a, 0x49, 0x0a, + 0x0c, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x17, 0x0a, + 0x07, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x6d, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, + 0x73, 0x69, 0x7a, 0x65, 0x4d, 0x62, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xfa, 0x01, 0x0a, 0x0b, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x12, 0x12, 0x0a, + 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, + 0x64, 0x12, 0x12, 0x0a, 0x04, 0x77, 0x77, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x77, 0x77, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x62, 0x75, 0x73, + 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x75, 0x73, + 0x50, 0x61, 0x74, 0x68, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x64, + 0x69, 0x73, 0x6b, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x73, 0x79, 0x73, 0x74, 0x65, + 0x6d, 0x44, 0x69, 0x73, 0x6b, 0x1a, 0xad, 0x03, 0x0a, 0x0d, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, + 0x73, 0x12, 0x29, 0x0a, 0x10, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x12, 0x5d, 0x0a, 0x0d, + 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x18, 0x05, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2e, 0x4d, 0x61, 0x63, 0x68, + 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x4e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x4e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x4c, 0x69, 0x6e, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0c, 0x6e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4c, 0x69, 0x6e, 0x6b, 0x73, 0x1a, 0xb7, 0x01, 0x0a, 0x11, + 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4c, 0x69, 0x6e, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x29, 0x0a, 0x10, 0x68, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x5f, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x68, 0x61, 0x72, 0x64, + 0x77, 0x61, 0x72, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x73, + 0x70, 0x65, 0x65, 0x64, 0x5f, 0x6d, 0x62, 0x70, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x09, 0x73, 0x70, 0x65, 0x65, 0x64, 0x4d, 0x62, 0x70, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x6c, 0x69, + 0x6e, 0x6b, 0x5f, 0x75, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x69, 0x6e, + 0x6b, 0x55, 0x70, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xf1, 0x01, 0x0a, 0x10, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, + 0x72, 0x6d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6c, + 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6c, + 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x7a, 0x6f, + 0x6e, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x7a, 0x6f, 0x6e, 0x65, 0x12, 0x23, + 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x70, 0x6f, 0x74, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x04, 0x73, 0x70, 0x6f, 0x74, 0x1a, 0x35, 0x0a, 0x09, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x1a, 0x3e, 0x0a, 0x10, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x2f, 0x0a, 0x04, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, + 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x43, 0x4f, 0x4e, 0x54, 0x52, 0x4f, 0x4c, 0x5f, 0x50, 0x4c, + 0x41, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x57, 0x4f, 0x52, 0x4b, 0x45, 0x52, 0x10, + 0x02, 0x4a, 0x04, 0x08, 0x08, 0x10, 0x09, 0x4a, 0x04, 0x08, 0x0c, 0x10, 0x0d, 0x22, 0x45, 0x0a, + 0x0f, 0x54, 0x61, 0x6c, 0x6f, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, + 0x12, 0x0e, 0x0a, 0x02, 0x63, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x63, 0x61, + 0x12, 0x10, 0x0a, 0x03, 0x63, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x63, + 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x22, 0xf6, 0x02, 0x0a, 0x0b, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x53, 0x70, 0x65, 0x63, 0x12, 0x27, 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x5f, + 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, + 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x2d, 0x0a, + 0x12, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x6b, 0x75, 0x62, 0x65, 0x72, + 0x6e, 0x65, 0x74, 0x65, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, + 0x74, 0x61, 0x6c, 0x6f, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x61, 0x6c, 0x6f, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x37, 0x0a, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2e, 0x43, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, + 0x52, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x48, 0x0a, 0x14, 0x62, 0x61, + 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x73, + 0x2e, 0x45, 0x74, 0x63, 0x64, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x52, + 0x13, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x67, 0x0a, 0x08, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, + 0x12, 0x32, 0x0a, 0x15, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, + 0x72, 0x6f, 0x78, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x65, 0x6e, 0x63, + 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x64, + 0x69, 0x73, 0x6b, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x61, 0x0a, + 0x0e, 0x45, 0x74, 0x63, 0x64, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x12, + 0x35, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x22, 0x41, 0x0a, 0x18, 0x45, 0x74, 0x63, 0x64, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x45, 0x6e, + 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x12, 0x25, 0x0a, 0x0e, + 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x4b, 0x65, 0x79, 0x22, 0x2c, 0x0a, 0x10, 0x45, 0x74, 0x63, 0x64, 0x42, 0x61, 0x63, 0x6b, 0x75, + 0x70, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0x7b, 0x0a, 0x0e, 0x45, 0x74, 0x63, 0x64, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, + 0x70, 0x65, 0x63, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1a, + 0x0a, 0x08, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, + 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x8c, + 0x02, 0x0a, 0x0e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x53, 0x70, 0x65, + 0x63, 0x12, 0x35, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x55, 0x75, 0x69, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x65, + 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4b, + 0x65, 0x79, 0x12, 0x39, 0x0a, 0x19, 0x61, 0x65, 0x73, 0x5f, 0x63, 0x62, 0x63, 0x5f, 0x65, 0x6e, + 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x61, 0x65, 0x73, 0x43, 0x62, 0x63, 0x45, 0x6e, 0x63, + 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x3e, 0x0a, + 0x1b, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x62, 0x6f, 0x78, 0x5f, 0x65, 0x6e, 0x63, 0x72, 0x79, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x19, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x62, 0x6f, 0x78, 0x45, 0x6e, 0x63, + 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x22, 0xd7, 0x01, + 0x0a, 0x14, 0x45, 0x74, 0x63, 0x64, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, 0x33, 0x43, 0x6f, + 0x6e, 0x66, 0x53, 0x70, 0x65, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x16, + 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x12, 0x22, 0x0a, 0x0d, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6b, 0x65, 0x79, + 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x4b, 0x65, 0x79, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, + 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4b, + 0x65, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xb1, 0x02, 0x0a, 0x14, 0x45, 0x74, 0x63, 0x64, + 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x70, 0x65, 0x63, + 0x12, 0x3a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x22, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2e, 0x45, 0x74, 0x63, 0x64, 0x42, 0x61, 0x63, + 0x6b, 0x75, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x12, 0x44, 0x0a, 0x10, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, + 0x70, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x42, 0x61, + 0x63, 0x6b, 0x75, 0x70, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x4a, 0x0a, 0x13, 0x6c, 0x61, 0x73, 0x74, + 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x52, 0x11, 0x6c, 0x61, 0x73, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x41, 0x74, 0x74, + 0x65, 0x6d, 0x70, 0x74, 0x22, 0x35, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, + 0x0a, 0x07, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4f, + 0x6b, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x10, 0x02, 0x12, 0x0b, + 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x10, 0x03, 0x22, 0x4f, 0x0a, 0x14, 0x45, + 0x74, 0x63, 0x64, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, + 0x70, 0x65, 0x63, 0x12, 0x37, 0x0a, 0x09, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x61, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x08, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x41, 0x74, 0x22, 0x7b, 0x0a, 0x19, + 0x45, 0x74, 0x63, 0x64, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x2d, 0x0a, 0x12, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x13, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xc8, 0x01, 0x0a, 0x1b, 0x45, 0x74, + 0x63, 0x64, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x4f, 0x76, 0x65, 0x72, 0x61, 0x6c, 0x6c, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x2d, 0x0a, 0x12, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x13, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x49, 0x0a, 0x12, 0x6c, 0x61, 0x73, + 0x74, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2e, 0x45, 0x74, + 0x63, 0x64, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x70, + 0x65, 0x63, 0x52, 0x10, 0x6c, 0x61, 0x73, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x22, 0x49, 0x0a, 0x12, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4d, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x2d, 0x0a, 0x12, 0x6b, 0x75, + 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, + 0x65, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x22, + 0x3b, 0x0a, 0x1f, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, + 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x50, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x53, 0x70, + 0x65, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x22, 0x68, 0x0a, 0x1e, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x54, 0x61, + 0x6c, 0x6f, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x12, 0x23, + 0x0a, 0x0d, 0x74, 0x61, 0x6c, 0x6f, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x61, 0x6c, 0x6f, 0x73, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x74, 0x69, 0x63, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x74, 0x69, 0x63, 0x49, 0x64, 0x22, 0x91, 0x01, 0x0a, 0x18, 0x43, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, + 0x70, 0x65, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x36, 0x0a, 0x17, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x29, 0x0a, 0x10, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x67, 0x65, 0x6e, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x36, 0x0a, 0x20, 0x52, 0x65, + 0x64, 0x61, 0x63, 0x74, 0x65, 0x64, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4d, 0x61, 0x63, + 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x12, 0x12, + 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, + 0x74, 0x61, 0x22, 0x9e, 0x01, 0x0a, 0x1a, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4d, 0x61, + 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x53, 0x70, 0x65, + 0x63, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x24, 0x0a, 0x0e, 0x65, 0x74, 0x63, 0x64, 0x5f, 0x6d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, + 0x65, 0x74, 0x63, 0x64, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, + 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x6f, 0x64, 0x65, + 0x5f, 0x69, 0x70, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x6e, 0x6f, 0x64, 0x65, + 0x49, 0x70, 0x73, 0x22, 0xa9, 0x01, 0x0a, 0x1a, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4d, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x70, + 0x65, 0x63, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x5f, 0x69, 0x6d, + 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6c, 0x6c, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x2d, 0x0a, 0x12, 0x6b, 0x75, 0x62, 0x65, 0x72, + 0x6e, 0x65, 0x74, 0x65, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x11, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, + 0x6c, 0x5f, 0x64, 0x69, 0x73, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x44, 0x69, 0x73, 0x6b, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x74, + 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x22, + 0x8b, 0x04, 0x0a, 0x18, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x14, 0x0a, 0x05, + 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, + 0x64, 0x79, 0x12, 0x3b, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x25, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x70, + 0x65, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x67, 0x65, 0x12, + 0x25, 0x0a, 0x0e, 0x61, 0x70, 0x69, 0x64, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x61, 0x70, 0x69, 0x64, 0x41, 0x76, 0x61, + 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x29, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x5f, 0x75, 0x70, 0x5f, 0x74, 0x6f, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x55, 0x70, 0x54, 0x6f, 0x44, 0x61, 0x74, + 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6c, 0x61, + 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x2d, 0x0a, + 0x12, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x48, 0x0a, 0x13, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x5f, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x73, 0x70, 0x65, 0x63, + 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x41, 0x70, 0x70, 0x6c, 0x79, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xa4, 0x01, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x67, 0x65, + 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, + 0x07, 0x42, 0x4f, 0x4f, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x49, 0x4e, + 0x53, 0x54, 0x41, 0x4c, 0x4c, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x55, 0x50, + 0x47, 0x52, 0x41, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x4f, 0x4e, + 0x46, 0x49, 0x47, 0x55, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x55, + 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x45, 0x42, 0x4f, 0x4f, + 0x54, 0x49, 0x4e, 0x47, 0x10, 0x07, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x48, 0x55, 0x54, 0x54, 0x49, + 0x4e, 0x47, 0x5f, 0x44, 0x4f, 0x57, 0x4e, 0x10, 0x08, 0x12, 0x12, 0x0a, 0x0e, 0x42, 0x45, 0x46, + 0x4f, 0x52, 0x45, 0x5f, 0x44, 0x45, 0x53, 0x54, 0x52, 0x4f, 0x59, 0x10, 0x09, 0x12, 0x0e, 0x0a, + 0x0a, 0x44, 0x45, 0x53, 0x54, 0x52, 0x4f, 0x59, 0x49, 0x4e, 0x47, 0x10, 0x05, 0x22, 0x76, 0x0a, + 0x08, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, + 0x18, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x07, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x65, 0x64, 0x22, 0x9e, 0x03, 0x0a, 0x11, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x1c, 0x0a, 0x09, 0x61, + 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, + 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2b, 0x0a, 0x08, 0x6d, 0x61, 0x63, + 0x68, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x73, 0x70, + 0x65, 0x63, 0x73, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x08, 0x6d, 0x61, + 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2e, 0x43, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x70, 0x65, 0x63, 0x2e, + 0x50, 0x68, 0x61, 0x73, 0x65, 0x52, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, + 0x64, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, + 0x41, 0x50, 0x49, 0x52, 0x65, 0x61, 0x64, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, + 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x41, 0x50, 0x49, 0x52, 0x65, 0x61, + 0x64, 0x79, 0x12, 0x2c, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x70, 0x6c, 0x61, + 0x6e, 0x65, 0x52, 0x65, 0x61, 0x64, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x52, 0x65, 0x61, 0x64, 0x79, + 0x12, 0x3f, 0x0a, 0x1c, 0x68, 0x61, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, + 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x73, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, 0x68, 0x61, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x50, 0x6c, 0x61, 0x6e, 0x65, + 0x73, 0x22, 0x53, 0x0a, 0x05, 0x50, 0x68, 0x61, 0x73, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, + 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x43, 0x41, 0x4c, 0x49, + 0x4e, 0x47, 0x5f, 0x55, 0x50, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x43, 0x41, 0x4c, 0x49, + 0x4e, 0x47, 0x5f, 0x44, 0x4f, 0x57, 0x4e, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x55, 0x4e, + 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x12, 0x0e, 0x0a, 0x0a, 0x44, 0x45, 0x53, 0x54, 0x52, 0x4f, + 0x59, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x22, 0x21, 0x0a, 0x0b, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x55, 0x55, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x22, 0x34, 0x0a, 0x18, 0x43, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x53, 0x70, 0x65, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0xe0, 0x02, 0x0a, 0x1e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x70, + 0x65, 0x63, 0x12, 0x43, 0x0a, 0x1e, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6d, 0x61, + 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1b, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x17, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x41, 0x0a, 0x1d, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x73, 0x68, 0x61, 0x32, 0x35, 0x36, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4d, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x68, 0x61, 0x32, + 0x35, 0x36, 0x12, 0x2a, 0x0a, 0x11, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6c, + 0x61, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x23, + 0x0a, 0x0d, 0x74, 0x61, 0x6c, 0x6f, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x61, 0x6c, 0x6f, 0x73, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x74, 0x69, 0x63, + 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x74, 0x69, 0x63, 0x49, 0x64, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x4a, 0x04, 0x08, 0x02, + 0x10, 0x03, 0x22, 0x40, 0x0a, 0x1a, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x42, 0x6f, 0x6f, + 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x70, 0x65, 0x63, + 0x12, 0x22, 0x0a, 0x0c, 0x62, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x62, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, + 0x70, 0x70, 0x65, 0x64, 0x22, 0x28, 0x0a, 0x12, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, + 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, + 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x8a, + 0x01, 0x0a, 0x16, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x69, 0x6e, + 0x64, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x69, + 0x6e, 0x64, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x2f, 0x0a, 0x13, 0x73, 0x69, 0x64, 0x65, 0x72, 0x6f, + 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x12, 0x73, 0x69, 0x64, 0x65, 0x72, 0x6f, 0x6c, 0x69, 0x6e, 0x6b, 0x45, + 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x64, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x22, 0x58, 0x0a, 0x16, 0x4c, + 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x12, + 0x18, 0x0a, 0x07, 0x73, 0x74, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x73, 0x74, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x4a, + 0x04, 0x08, 0x02, 0x10, 0x03, 0x22, 0x31, 0x0a, 0x15, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, + 0x74, 0x65, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x12, 0x18, + 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x72, 0x0a, 0x10, 0x54, 0x61, 0x6c, 0x6f, + 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x12, 0x18, 0x0a, 0x07, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x44, 0x0a, 0x1e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, + 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x5f, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x1c, + 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, + 0x65, 0x74, 0x65, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xa1, 0x02, 0x0a, + 0x15, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x64, + 0x69, 0x61, 0x53, 0x70, 0x65, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x72, + 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x72, + 0x63, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x72, 0x63, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x72, 0x65, 0x66, + 0x69, 0x78, 0x12, 0x28, 0x0a, 0x10, 0x64, 0x65, 0x73, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, + 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x64, 0x65, + 0x73, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x1c, 0x0a, 0x09, + 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0e, 0x6e, 0x6f, + 0x5f, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x5f, 0x62, 0x6f, 0x6f, 0x74, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0c, 0x6e, 0x6f, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x42, 0x6f, 0x6f, 0x74, + 0x22, 0x25, 0x0a, 0x0f, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x50, 0x61, 0x74, 0x63, 0x68, 0x53, + 0x70, 0x65, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x81, 0x08, 0x0a, 0x0e, 0x4d, 0x61, 0x63, 0x68, + 0x69, 0x6e, 0x65, 0x53, 0x65, 0x74, 0x53, 0x70, 0x65, 0x63, 0x12, 0x4d, 0x0a, 0x0f, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2e, 0x4d, 0x61, 0x63, 0x68, + 0x69, 0x6e, 0x65, 0x53, 0x65, 0x74, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x52, 0x0e, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x47, 0x0a, 0x0d, 0x6d, 0x61, 0x63, + 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x22, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, + 0x53, 0x65, 0x74, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, + 0x6c, 0x61, 0x73, 0x73, 0x52, 0x0c, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6c, 0x61, + 0x73, 0x73, 0x12, 0x4a, 0x0a, 0x0e, 0x62, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x5f, + 0x73, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x73, 0x70, 0x65, + 0x63, 0x73, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, 0x65, 0x74, 0x53, 0x70, 0x65, + 0x63, 0x2e, 0x42, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x53, 0x70, 0x65, 0x63, 0x52, + 0x0d, 0x62, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x53, 0x70, 0x65, 0x63, 0x12, 0x4d, + 0x0a, 0x0f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, + 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2e, + 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, 0x65, 0x74, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x52, 0x0e, 0x64, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x60, 0x0a, + 0x16, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, + 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, + 0x73, 0x70, 0x65, 0x63, 0x73, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, 0x65, 0x74, + 0x53, 0x70, 0x65, 0x63, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x72, 0x61, 0x74, + 0x65, 0x67, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x14, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, + 0x60, 0x0a, 0x16, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, + 0x67, 0x79, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2a, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, + 0x65, 0x74, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x72, + 0x61, 0x74, 0x65, 0x67, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x14, 0x64, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x1a, 0xd0, 0x01, 0x0a, 0x0c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6c, 0x61, + 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, + 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x5a, 0x0a, 0x0f, 0x61, + 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x31, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2e, 0x4d, 0x61, 0x63, + 0x68, 0x69, 0x6e, 0x65, 0x53, 0x65, 0x74, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x4d, 0x61, 0x63, 0x68, + 0x69, 0x6e, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x2e, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0e, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x22, 0x2b, 0x0a, 0x0e, 0x41, 0x6c, 0x6c, 0x6f, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x74, 0x61, + 0x74, 0x69, 0x63, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x55, 0x6e, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x65, 0x64, 0x10, 0x01, 0x1a, 0x4e, 0x0a, 0x0d, 0x42, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, + 0x70, 0x53, 0x70, 0x65, 0x63, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x55, 0x75, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x1a, 0x46, 0x0a, 0x1b, 0x52, 0x6f, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x12, 0x27, 0x0a, 0x0f, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6c, + 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x6d, 0x61, + 0x78, 0x50, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x1a, 0x63, 0x0a, 0x14, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x12, 0x4b, 0x0a, 0x07, 0x72, 0x6f, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2e, 0x4d, 0x61, + 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, 0x65, 0x74, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x52, 0x6f, 0x6c, + 0x6c, 0x69, 0x6e, 0x67, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, + 0x67, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x72, 0x6f, 0x6c, 0x6c, 0x69, 0x6e, + 0x67, 0x22, 0x28, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x72, 0x61, 0x74, + 0x65, 0x67, 0x79, 0x12, 0x09, 0x0a, 0x05, 0x55, 0x6e, 0x73, 0x65, 0x74, 0x10, 0x00, 0x12, 0x0b, + 0x0a, 0x07, 0x52, 0x6f, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x10, 0x01, 0x22, 0xf4, 0x02, 0x0a, 0x16, + 0x54, 0x61, 0x6c, 0x6f, 0x73, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x39, 0x0a, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2e, 0x54, 0x61, + 0x6c, 0x6f, 0x73, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x53, 0x70, 0x65, 0x63, 0x2e, 0x50, 0x68, 0x61, 0x73, 0x65, 0x52, 0x05, 0x70, 0x68, 0x61, 0x73, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x74, 0x65, 0x70, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x74, 0x65, 0x70, 0x12, 0x16, 0x0a, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x75, 0x70, 0x67, 0x72, + 0x61, 0x64, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x17, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x5f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x55, + 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, + 0x10, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x48, 0x0a, 0x05, 0x50, 0x68, 0x61, 0x73, + 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x0d, + 0x0a, 0x09, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x10, 0x01, 0x12, 0x08, 0x0a, + 0x04, 0x44, 0x6f, 0x6e, 0x65, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x61, 0x69, 0x6c, 0x65, + 0x64, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, + 0x10, 0x04, 0x22, 0x87, 0x02, 0x0a, 0x14, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, 0x65, + 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x2c, 0x0a, 0x05, 0x70, + 0x68, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x73, 0x70, 0x65, + 0x63, 0x73, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, 0x65, 0x74, 0x50, 0x68, 0x61, + 0x73, 0x65, 0x52, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, + 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x2b, 0x0a, 0x08, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, + 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2e, + 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x08, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, + 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x68, 0x61, 0x73, + 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, + 0x61, 0x73, 0x68, 0x12, 0x47, 0x0a, 0x0d, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x73, 0x70, 0x65, + 0x63, 0x73, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, 0x65, 0x74, 0x53, 0x70, 0x65, + 0x63, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x52, 0x0c, + 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x22, 0x14, 0x0a, 0x12, + 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x70, + 0x65, 0x63, 0x22, 0x13, 0x0a, 0x11, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4c, 0x61, 0x62, + 0x65, 0x6c, 0x73, 0x53, 0x70, 0x65, 0x63, 0x22, 0x5f, 0x0a, 0x19, 0x4d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x53, 0x70, 0x65, 0x63, 0x12, 0x42, 0x0a, 0x0e, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6d, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x0d, 0x6d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xa5, 0x03, 0x0a, 0x16, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, + 0x70, 0x65, 0x63, 0x12, 0x47, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2e, + 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0xc1, 0x02, 0x0a, + 0x09, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x73, + 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x73, + 0x70, 0x65, 0x63, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x50, 0x6c, 0x61, 0x6e, + 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x43, 0x6f, 0x6e, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x4c, 0x0a, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x30, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2e, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x52, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, + 0x74, 0x79, 0x22, 0x2e, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, + 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x65, 0x61, + 0x64, 0x79, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x4e, 0x6f, 0x74, 0x52, 0x65, 0x61, 0x64, 0x79, + 0x10, 0x02, 0x22, 0x2c, 0x0a, 0x08, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, 0x08, + 0x0a, 0x04, 0x49, 0x6e, 0x66, 0x6f, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x57, 0x61, 0x72, 0x6e, + 0x69, 0x6e, 0x67, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x10, 0x02, + 0x22, 0x48, 0x0a, 0x13, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x45, 0x6e, 0x64, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x53, 0x70, 0x65, 0x63, 0x12, 0x31, 0x0a, 0x14, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x13, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x22, 0xdb, 0x03, 0x0a, 0x14, 0x4b, + 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, + 0x70, 0x65, 0x63, 0x12, 0x3c, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, + 0x6e, 0x65, 0x74, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x70, 0x65, 0x63, 0x2e, + 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, + 0x73, 0x12, 0x4b, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x5f, 0x70, 0x6f, 0x64, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2e, 0x4b, + 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, + 0x70, 0x65, 0x63, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x50, 0x6f, + 0x64, 0x73, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x50, 0x6f, 0x64, 0x73, 0x1a, 0x67, + 0x0a, 0x0a, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, + 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x6b, 0x75, 0x62, 0x65, + 0x6c, 0x65, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0e, 0x6b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x1a, 0x53, 0x0a, 0x0f, 0x53, 0x74, 0x61, 0x74, 0x69, + 0x63, 0x50, 0x6f, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x70, + 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x70, 0x70, 0x12, 0x18, 0x0a, 0x07, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x1a, 0x7a, 0x0a, 0x0e, + 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x50, 0x6f, 0x64, 0x73, 0x12, 0x1a, + 0x0a, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x4c, 0x0a, 0x0b, 0x73, 0x74, + 0x61, 0x74, 0x69, 0x63, 0x5f, 0x70, 0x6f, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x2b, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, + 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x53, 0x74, 0x61, + 0x74, 0x69, 0x63, 0x50, 0x6f, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0a, 0x73, 0x74, + 0x61, 0x74, 0x69, 0x63, 0x50, 0x6f, 0x64, 0x73, 0x22, 0xfe, 0x02, 0x0a, 0x1b, 0x4b, 0x75, 0x62, + 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x3e, 0x0a, 0x05, 0x70, 0x68, 0x61, 0x73, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2e, + 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, + 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x50, 0x68, 0x61, 0x73, + 0x65, 0x52, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, + 0x0a, 0x04, 0x73, 0x74, 0x65, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x74, + 0x65, 0x70, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x6c, 0x61, + 0x73, 0x74, 0x5f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, + 0x67, 0x72, 0x61, 0x64, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x17, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, + 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, + 0x48, 0x0a, 0x05, 0x50, 0x68, 0x61, 0x73, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x6e, 0x6b, 0x6e, + 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x69, + 0x6e, 0x67, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x6f, 0x6e, 0x65, 0x10, 0x02, 0x12, 0x0a, + 0x0a, 0x06, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x65, + 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x10, 0x04, 0x22, 0x6f, 0x0a, 0x23, 0x4b, 0x75, 0x62, + 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x4d, 0x61, + 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x70, 0x65, 0x63, + 0x12, 0x1e, 0x0a, 0x0b, 0x6f, 0x75, 0x74, 0x5f, 0x6f, 0x66, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x6f, 0x75, 0x74, 0x4f, 0x66, 0x53, 0x79, 0x6e, 0x63, + 0x12, 0x28, 0x0a, 0x10, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x66, 0x61, 0x74, 0x61, 0x6c, 0x5f, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6c, 0x61, 0x73, 0x74, + 0x46, 0x61, 0x74, 0x61, 0x6c, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x29, 0x0a, 0x11, 0x44, 0x65, + 0x73, 0x74, 0x72, 0x6f, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, + 0x14, 0x0a, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x70, 0x68, 0x61, 0x73, 0x65, 0x22, 0x83, 0x02, 0x0a, 0x0f, 0x4f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, + 0x67, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x70, 0x65, 0x63, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, + 0x44, 0x0a, 0x0d, 0x74, 0x61, 0x6c, 0x6f, 0x73, 0x5f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2e, 0x54, + 0x61, 0x6c, 0x6f, 0x73, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x53, 0x70, 0x65, 0x63, 0x48, 0x00, 0x52, 0x0c, 0x74, 0x61, 0x6c, 0x6f, 0x73, 0x55, 0x70, + 0x67, 0x72, 0x61, 0x64, 0x65, 0x12, 0x53, 0x0a, 0x12, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, + 0x74, 0x65, 0x73, 0x5f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x22, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, + 0x65, 0x74, 0x65, 0x73, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x53, 0x70, 0x65, 0x63, 0x48, 0x00, 0x52, 0x11, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, + 0x74, 0x65, 0x73, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x12, 0x34, 0x0a, 0x07, 0x64, 0x65, + 0x73, 0x74, 0x72, 0x6f, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x73, 0x70, + 0x65, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x53, 0x70, 0x65, 0x63, 0x48, 0x00, 0x52, 0x07, 0x64, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, + 0x42, 0x09, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x35, 0x0a, 0x1f, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x45, 0x6e, 0x63, + 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x53, 0x70, 0x65, 0x63, 0x12, 0x12, + 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, + 0x74, 0x61, 0x22, 0x5f, 0x0a, 0x12, 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x63, 0x6f, 0x6e, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x36, + 0x34, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x63, 0x6f, 0x6e, 0x42, 0x61, 0x73, + 0x65, 0x36, 0x34, 0x22, 0x9b, 0x01, 0x0a, 0x12, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x12, 0x38, 0x0a, 0x18, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x70, 0x72, + 0x6f, 0x78, 0x79, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x78, + 0x79, 0x69, 0x6e, 0x67, 0x12, 0x4b, 0x0a, 0x14, 0x65, 0x74, 0x63, 0x64, 0x5f, 0x62, 0x61, 0x63, + 0x6b, 0x75, 0x70, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2e, 0x45, 0x74, 0x63, 0x64, 0x42, + 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x12, 0x65, + 0x74, 0x63, 0x64, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x22, 0xd6, 0x01, 0x0a, 0x12, 0x45, 0x74, 0x63, 0x64, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, + 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x3e, 0x0a, 0x0d, 0x74, 0x69, 0x63, 0x6b, + 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x74, 0x69, 0x63, 0x6b, + 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x3c, 0x0a, 0x0c, 0x6d, 0x69, 0x6e, 0x5f, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x6d, 0x69, 0x6e, 0x49, 0x6e, + 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x3c, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x49, 0x6e, 0x74, 0x65, + 0x72, 0x76, 0x61, 0x6c, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x22, 0x35, 0x0a, 0x10, 0x4d, 0x61, + 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x21, + 0x0a, 0x0c, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x4c, 0x61, 0x62, 0x65, 0x6c, + 0x73, 0x22, 0x40, 0x0a, 0x1b, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x47, 0x65, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x53, 0x70, 0x65, 0x63, + 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x5f, 0x64, 0x69, 0x73, 0x6b, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x44, + 0x69, 0x73, 0x6b, 0x22, 0x3d, 0x0a, 0x13, 0x45, 0x74, 0x63, 0x64, 0x41, 0x75, 0x64, 0x69, 0x74, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x53, 0x70, 0x65, 0x63, 0x12, 0x26, 0x0a, 0x0f, 0x65, 0x74, + 0x63, 0x64, 0x5f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x04, 0x52, 0x0d, 0x65, 0x74, 0x63, 0x64, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x49, + 0x64, 0x73, 0x22, 0x24, 0x0a, 0x0e, 0x4b, 0x75, 0x62, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x53, 0x70, 0x65, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x8b, 0x03, 0x0a, 0x13, 0x4b, 0x75, 0x62, + 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x55, 0x73, 0x61, 0x67, 0x65, 0x53, 0x70, 0x65, 0x63, + 0x12, 0x35, 0x0a, 0x03, 0x63, 0x70, 0x75, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, + 0x73, 0x70, 0x65, 0x63, 0x73, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, + 0x55, 0x73, 0x61, 0x67, 0x65, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, + 0x74, 0x79, 0x52, 0x03, 0x63, 0x70, 0x75, 0x12, 0x35, 0x0a, 0x03, 0x6d, 0x65, 0x6d, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2e, 0x4b, 0x75, 0x62, + 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x55, 0x73, 0x61, 0x67, 0x65, 0x53, 0x70, 0x65, 0x63, + 0x2e, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x03, 0x6d, 0x65, 0x6d, 0x12, 0x3d, + 0x0a, 0x07, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x23, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, + 0x65, 0x73, 0x55, 0x73, 0x61, 0x67, 0x65, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x51, 0x75, 0x61, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x52, 0x07, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x12, 0x32, 0x0a, + 0x04, 0x70, 0x6f, 0x64, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x73, 0x70, + 0x65, 0x63, 0x73, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x55, 0x73, + 0x61, 0x67, 0x65, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x50, 0x6f, 0x64, 0x52, 0x04, 0x70, 0x6f, 0x64, + 0x73, 0x1a, 0x5a, 0x0a, 0x08, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x1a, 0x0a, + 0x08, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x08, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x06, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x1a, 0x37, 0x0a, + 0x03, 0x50, 0x6f, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, + 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x63, 0x61, + 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x22, 0xa6, 0x01, 0x0a, 0x14, 0x49, 0x6d, 0x61, 0x67, 0x65, + 0x50, 0x75, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x53, 0x70, 0x65, 0x63, 0x12, + 0x51, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x6c, 0x69, + 0x73, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x73, + 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x50, 0x75, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4c, 0x69, + 0x73, 0x74, 0x1a, 0x3b, 0x0a, 0x0d, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4c, + 0x69, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x22, + 0x9c, 0x02, 0x0a, 0x13, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x50, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x2e, 0x0a, 0x13, 0x6c, 0x61, 0x73, 0x74, 0x5f, + 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x6c, 0x61, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, + 0x73, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x6c, 0x61, 0x73, 0x74, 0x5f, + 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x63, 0x65, + 0x73, 0x73, 0x65, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x6c, 0x61, 0x73, + 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x5f, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x50, 0x72, 0x6f, + 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x70, + 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x2f, + 0x0a, 0x0d, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x53, 0x70, 0x65, 0x63, 0x12, + 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, + 0xe7, 0x01, 0x0a, 0x13, 0x54, 0x61, 0x6c, 0x6f, 0x73, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x35, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2e, 0x54, + 0x61, 0x6c, 0x6f, 0x73, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x53, 0x70, + 0x65, 0x63, 0x2e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x1a, 0x98, + 0x01, 0x0a, 0x04, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x61, + 0x75, 0x74, 0x68, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x75, 0x74, + 0x68, 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x10, 0x0a, 0x03, 0x72, 0x65, 0x66, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x72, 0x65, + 0x66, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x22, 0xc9, 0x01, 0x0a, 0x1a, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x74, 0x69, 0x63, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x49, 0x64, 0x12, 0x40, 0x0a, 0x06, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x73, 0x70, + 0x65, 0x63, 0x73, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x54, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0x46, 0x0a, + 0x06, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, + 0x77, 0x6e, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4d, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x4d, 0x61, 0x63, 0x68, + 0x69, 0x6e, 0x65, 0x53, 0x65, 0x74, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x10, 0x03, 0x2a, 0x46, 0x0a, 0x11, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x41, + 0x70, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, + 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x45, 0x4e, 0x44, 0x49, + 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x45, 0x44, 0x10, + 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x03, 0x2a, 0x7a, 0x0a, + 0x0f, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, 0x65, 0x74, 0x50, 0x68, 0x61, 0x73, 0x65, + 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x0d, 0x0a, + 0x09, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x55, 0x70, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, + 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x44, 0x6f, 0x77, 0x6e, 0x10, 0x02, 0x12, 0x0b, 0x0a, + 0x07, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x10, 0x03, 0x12, 0x0e, 0x0a, 0x0a, 0x44, 0x65, + 0x73, 0x74, 0x72, 0x6f, 0x79, 0x69, 0x6e, 0x67, 0x10, 0x04, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x61, + 0x69, 0x6c, 0x65, 0x64, 0x10, 0x05, 0x12, 0x11, 0x0a, 0x0d, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x06, 0x2a, 0x48, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x55, 0x6e, + 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x00, + 0x12, 0x08, 0x0a, 0x04, 0x45, 0x74, 0x63, 0x64, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x57, 0x69, + 0x72, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x10, 0x02, 0x42, 0x32, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x73, 0x69, 0x64, 0x65, 0x72, 0x6f, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x6f, 0x6d, 0x6e, + 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6f, 0x6d, 0x6e, + 0x69, 0x2f, 0x73, 0x70, 0x65, 0x63, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_omni_specs_omni_proto_rawDescOnce sync.Once + file_omni_specs_omni_proto_rawDescData = file_omni_specs_omni_proto_rawDesc +) + +func file_omni_specs_omni_proto_rawDescGZIP() []byte { + file_omni_specs_omni_proto_rawDescOnce.Do(func() { + file_omni_specs_omni_proto_rawDescData = protoimpl.X.CompressGZIP(file_omni_specs_omni_proto_rawDescData) + }) + return file_omni_specs_omni_proto_rawDescData +} + +var file_omni_specs_omni_proto_enumTypes = make([]protoimpl.EnumInfo, 14) +var file_omni_specs_omni_proto_msgTypes = make([]protoimpl.MessageInfo, 84) +var file_omni_specs_omni_proto_goTypes = []interface{}{ + (ConfigApplyStatus)(0), // 0: specs.ConfigApplyStatus + (MachineSetPhase)(0), // 1: specs.MachineSetPhase + (ConditionType)(0), // 2: specs.ConditionType + (MachineStatusSpec_Role)(0), // 3: specs.MachineStatusSpec.Role + (EtcdBackupStatusSpec_Status)(0), // 4: specs.EtcdBackupStatusSpec.Status + (ClusterMachineStatusSpec_Stage)(0), // 5: specs.ClusterMachineStatusSpec.Stage + (ClusterStatusSpec_Phase)(0), // 6: specs.ClusterStatusSpec.Phase + (MachineSetSpec_UpdateStrategy)(0), // 7: specs.MachineSetSpec.UpdateStrategy + (MachineSetSpec_MachineClass_AllocationType)(0), // 8: specs.MachineSetSpec.MachineClass.AllocationType + (TalosUpgradeStatusSpec_Phase)(0), // 9: specs.TalosUpgradeStatusSpec.Phase + (ControlPlaneStatusSpec_Condition_Status)(0), // 10: specs.ControlPlaneStatusSpec.Condition.Status + (ControlPlaneStatusSpec_Condition_Severity)(0), // 11: specs.ControlPlaneStatusSpec.Condition.Severity + (KubernetesUpgradeStatusSpec_Phase)(0), // 12: specs.KubernetesUpgradeStatusSpec.Phase + (SchematicConfigurationSpec_Target)(0), // 13: specs.SchematicConfigurationSpec.Target + (*MachineSpec)(nil), // 14: specs.MachineSpec + (*MachineStatusSpec)(nil), // 15: specs.MachineStatusSpec + (*TalosConfigSpec)(nil), // 16: specs.TalosConfigSpec + (*ClusterSpec)(nil), // 17: specs.ClusterSpec + (*EtcdBackupConf)(nil), // 18: specs.EtcdBackupConf + (*EtcdBackupEncryptionSpec)(nil), // 19: specs.EtcdBackupEncryptionSpec + (*EtcdBackupHeader)(nil), // 20: specs.EtcdBackupHeader + (*EtcdBackupSpec)(nil), // 21: specs.EtcdBackupSpec + (*BackupDataSpec)(nil), // 22: specs.BackupDataSpec + (*EtcdBackupS3ConfSpec)(nil), // 23: specs.EtcdBackupS3ConfSpec + (*EtcdBackupStatusSpec)(nil), // 24: specs.EtcdBackupStatusSpec + (*EtcdManualBackupSpec)(nil), // 25: specs.EtcdManualBackupSpec + (*EtcdBackupStoreStatusSpec)(nil), // 26: specs.EtcdBackupStoreStatusSpec + (*EtcdBackupOverallStatusSpec)(nil), // 27: specs.EtcdBackupOverallStatusSpec + (*ClusterMachineSpec)(nil), // 28: specs.ClusterMachineSpec + (*ClusterMachineConfigPatchesSpec)(nil), // 29: specs.ClusterMachineConfigPatchesSpec + (*ClusterMachineTalosVersionSpec)(nil), // 30: specs.ClusterMachineTalosVersionSpec + (*ClusterMachineConfigSpec)(nil), // 31: specs.ClusterMachineConfigSpec + (*RedactedClusterMachineConfigSpec)(nil), // 32: specs.RedactedClusterMachineConfigSpec + (*ClusterMachineIdentitySpec)(nil), // 33: specs.ClusterMachineIdentitySpec + (*ClusterMachineTemplateSpec)(nil), // 34: specs.ClusterMachineTemplateSpec + (*ClusterMachineStatusSpec)(nil), // 35: specs.ClusterMachineStatusSpec + (*Machines)(nil), // 36: specs.Machines + (*ClusterStatusSpec)(nil), // 37: specs.ClusterStatusSpec + (*ClusterUUID)(nil), // 38: specs.ClusterUUID + (*ClusterConfigVersionSpec)(nil), // 39: specs.ClusterConfigVersionSpec + (*ClusterMachineConfigStatusSpec)(nil), // 40: specs.ClusterMachineConfigStatusSpec + (*ClusterBootstrapStatusSpec)(nil), // 41: specs.ClusterBootstrapStatusSpec + (*ClusterSecretsSpec)(nil), // 42: specs.ClusterSecretsSpec + (*LoadBalancerConfigSpec)(nil), // 43: specs.LoadBalancerConfigSpec + (*LoadBalancerStatusSpec)(nil), // 44: specs.LoadBalancerStatusSpec + (*KubernetesVersionSpec)(nil), // 45: specs.KubernetesVersionSpec + (*TalosVersionSpec)(nil), // 46: specs.TalosVersionSpec + (*InstallationMediaSpec)(nil), // 47: specs.InstallationMediaSpec + (*ConfigPatchSpec)(nil), // 48: specs.ConfigPatchSpec + (*MachineSetSpec)(nil), // 49: specs.MachineSetSpec + (*TalosUpgradeStatusSpec)(nil), // 50: specs.TalosUpgradeStatusSpec + (*MachineSetStatusSpec)(nil), // 51: specs.MachineSetStatusSpec + (*MachineSetNodeSpec)(nil), // 52: specs.MachineSetNodeSpec + (*MachineLabelsSpec)(nil), // 53: specs.MachineLabelsSpec + (*MachineStatusSnapshotSpec)(nil), // 54: specs.MachineStatusSnapshotSpec + (*ControlPlaneStatusSpec)(nil), // 55: specs.ControlPlaneStatusSpec + (*ClusterEndpointSpec)(nil), // 56: specs.ClusterEndpointSpec + (*KubernetesStatusSpec)(nil), // 57: specs.KubernetesStatusSpec + (*KubernetesUpgradeStatusSpec)(nil), // 58: specs.KubernetesUpgradeStatusSpec + (*KubernetesUpgradeManifestStatusSpec)(nil), // 59: specs.KubernetesUpgradeManifestStatusSpec + (*DestroyStatusSpec)(nil), // 60: specs.DestroyStatusSpec + (*OngoingTaskSpec)(nil), // 61: specs.OngoingTaskSpec + (*ClusterMachineEncryptionKeySpec)(nil), // 62: specs.ClusterMachineEncryptionKeySpec + (*ExposedServiceSpec)(nil), // 63: specs.ExposedServiceSpec + (*FeaturesConfigSpec)(nil), // 64: specs.FeaturesConfigSpec + (*EtcdBackupSettings)(nil), // 65: specs.EtcdBackupSettings + (*MachineClassSpec)(nil), // 66: specs.MachineClassSpec + (*MachineConfigGenOptionsSpec)(nil), // 67: specs.MachineConfigGenOptionsSpec + (*EtcdAuditResultSpec)(nil), // 68: specs.EtcdAuditResultSpec + (*KubeconfigSpec)(nil), // 69: specs.KubeconfigSpec + (*KubernetesUsageSpec)(nil), // 70: specs.KubernetesUsageSpec + (*ImagePullRequestSpec)(nil), // 71: specs.ImagePullRequestSpec + (*ImagePullStatusSpec)(nil), // 72: specs.ImagePullStatusSpec + (*SchematicSpec)(nil), // 73: specs.SchematicSpec + (*TalosExtensionsSpec)(nil), // 74: specs.TalosExtensionsSpec + (*SchematicConfigurationSpec)(nil), // 75: specs.SchematicConfigurationSpec + (*MachineStatusSpec_HardwareStatus)(nil), // 76: specs.MachineStatusSpec.HardwareStatus + (*MachineStatusSpec_NetworkStatus)(nil), // 77: specs.MachineStatusSpec.NetworkStatus + (*MachineStatusSpec_PlatformMetadata)(nil), // 78: specs.MachineStatusSpec.PlatformMetadata + (*MachineStatusSpec_Schematic)(nil), // 79: specs.MachineStatusSpec.Schematic + nil, // 80: specs.MachineStatusSpec.ImageLabelsEntry + (*MachineStatusSpec_HardwareStatus_Processor)(nil), // 81: specs.MachineStatusSpec.HardwareStatus.Processor + (*MachineStatusSpec_HardwareStatus_MemoryModule)(nil), // 82: specs.MachineStatusSpec.HardwareStatus.MemoryModule + (*MachineStatusSpec_HardwareStatus_BlockDevice)(nil), // 83: specs.MachineStatusSpec.HardwareStatus.BlockDevice + (*MachineStatusSpec_NetworkStatus_NetworkLinkStatus)(nil), // 84: specs.MachineStatusSpec.NetworkStatus.NetworkLinkStatus + (*ClusterSpec_Features)(nil), // 85: specs.ClusterSpec.Features + (*MachineSetSpec_MachineClass)(nil), // 86: specs.MachineSetSpec.MachineClass + (*MachineSetSpec_BootstrapSpec)(nil), // 87: specs.MachineSetSpec.BootstrapSpec + (*MachineSetSpec_RollingUpdateStrategyConfig)(nil), // 88: specs.MachineSetSpec.RollingUpdateStrategyConfig + (*MachineSetSpec_UpdateStrategyConfig)(nil), // 89: specs.MachineSetSpec.UpdateStrategyConfig + (*ControlPlaneStatusSpec_Condition)(nil), // 90: specs.ControlPlaneStatusSpec.Condition + (*KubernetesStatusSpec_NodeStatus)(nil), // 91: specs.KubernetesStatusSpec.NodeStatus + (*KubernetesStatusSpec_StaticPodStatus)(nil), // 92: specs.KubernetesStatusSpec.StaticPodStatus + (*KubernetesStatusSpec_NodeStaticPods)(nil), // 93: specs.KubernetesStatusSpec.NodeStaticPods + (*KubernetesUsageSpec_Quantity)(nil), // 94: specs.KubernetesUsageSpec.Quantity + (*KubernetesUsageSpec_Pod)(nil), // 95: specs.KubernetesUsageSpec.Pod + (*ImagePullRequestSpec_NodeImageList)(nil), // 96: specs.ImagePullRequestSpec.NodeImageList + (*TalosExtensionsSpec_Info)(nil), // 97: specs.TalosExtensionsSpec.Info + (*durationpb.Duration)(nil), // 98: google.protobuf.Duration + (*timestamppb.Timestamp)(nil), // 99: google.protobuf.Timestamp + (*machine.MachineStatusEvent)(nil), // 100: machine.MachineStatusEvent +} +var file_omni_specs_omni_proto_depIdxs = []int32{ + 76, // 0: specs.MachineStatusSpec.hardware:type_name -> specs.MachineStatusSpec.HardwareStatus + 77, // 1: specs.MachineStatusSpec.network:type_name -> specs.MachineStatusSpec.NetworkStatus + 3, // 2: specs.MachineStatusSpec.role:type_name -> specs.MachineStatusSpec.Role + 78, // 3: specs.MachineStatusSpec.platform_metadata:type_name -> specs.MachineStatusSpec.PlatformMetadata + 80, // 4: specs.MachineStatusSpec.image_labels:type_name -> specs.MachineStatusSpec.ImageLabelsEntry + 79, // 5: specs.MachineStatusSpec.schematic:type_name -> specs.MachineStatusSpec.Schematic + 85, // 6: specs.ClusterSpec.features:type_name -> specs.ClusterSpec.Features + 18, // 7: specs.ClusterSpec.backup_configuration:type_name -> specs.EtcdBackupConf + 98, // 8: specs.EtcdBackupConf.interval:type_name -> google.protobuf.Duration + 99, // 9: specs.EtcdBackupSpec.created_at:type_name -> google.protobuf.Timestamp + 98, // 10: specs.BackupDataSpec.interval:type_name -> google.protobuf.Duration + 4, // 11: specs.EtcdBackupStatusSpec.status:type_name -> specs.EtcdBackupStatusSpec.Status + 99, // 12: specs.EtcdBackupStatusSpec.last_backup_time:type_name -> google.protobuf.Timestamp + 99, // 13: specs.EtcdBackupStatusSpec.last_backup_attempt:type_name -> google.protobuf.Timestamp + 99, // 14: specs.EtcdManualBackupSpec.backup_at:type_name -> google.protobuf.Timestamp + 24, // 15: specs.EtcdBackupOverallStatusSpec.last_backup_status:type_name -> specs.EtcdBackupStatusSpec + 5, // 16: specs.ClusterMachineStatusSpec.stage:type_name -> specs.ClusterMachineStatusSpec.Stage + 0, // 17: specs.ClusterMachineStatusSpec.config_apply_status:type_name -> specs.ConfigApplyStatus + 36, // 18: specs.ClusterStatusSpec.machines:type_name -> specs.Machines + 6, // 19: specs.ClusterStatusSpec.phase:type_name -> specs.ClusterStatusSpec.Phase + 7, // 20: specs.MachineSetSpec.update_strategy:type_name -> specs.MachineSetSpec.UpdateStrategy + 86, // 21: specs.MachineSetSpec.machine_class:type_name -> specs.MachineSetSpec.MachineClass + 87, // 22: specs.MachineSetSpec.bootstrap_spec:type_name -> specs.MachineSetSpec.BootstrapSpec + 7, // 23: specs.MachineSetSpec.delete_strategy:type_name -> specs.MachineSetSpec.UpdateStrategy + 89, // 24: specs.MachineSetSpec.update_strategy_config:type_name -> specs.MachineSetSpec.UpdateStrategyConfig + 89, // 25: specs.MachineSetSpec.delete_strategy_config:type_name -> specs.MachineSetSpec.UpdateStrategyConfig + 9, // 26: specs.TalosUpgradeStatusSpec.phase:type_name -> specs.TalosUpgradeStatusSpec.Phase + 1, // 27: specs.MachineSetStatusSpec.phase:type_name -> specs.MachineSetPhase + 36, // 28: specs.MachineSetStatusSpec.machines:type_name -> specs.Machines + 86, // 29: specs.MachineSetStatusSpec.machine_class:type_name -> specs.MachineSetSpec.MachineClass + 100, // 30: specs.MachineStatusSnapshotSpec.machine_status:type_name -> machine.MachineStatusEvent + 90, // 31: specs.ControlPlaneStatusSpec.conditions:type_name -> specs.ControlPlaneStatusSpec.Condition + 91, // 32: specs.KubernetesStatusSpec.nodes:type_name -> specs.KubernetesStatusSpec.NodeStatus + 93, // 33: specs.KubernetesStatusSpec.static_pods:type_name -> specs.KubernetesStatusSpec.NodeStaticPods + 12, // 34: specs.KubernetesUpgradeStatusSpec.phase:type_name -> specs.KubernetesUpgradeStatusSpec.Phase + 50, // 35: specs.OngoingTaskSpec.talos_upgrade:type_name -> specs.TalosUpgradeStatusSpec + 58, // 36: specs.OngoingTaskSpec.kubernetes_upgrade:type_name -> specs.KubernetesUpgradeStatusSpec + 60, // 37: specs.OngoingTaskSpec.destroy:type_name -> specs.DestroyStatusSpec + 65, // 38: specs.FeaturesConfigSpec.etcd_backup_settings:type_name -> specs.EtcdBackupSettings + 98, // 39: specs.EtcdBackupSettings.tick_interval:type_name -> google.protobuf.Duration + 98, // 40: specs.EtcdBackupSettings.min_interval:type_name -> google.protobuf.Duration + 98, // 41: specs.EtcdBackupSettings.max_interval:type_name -> google.protobuf.Duration + 94, // 42: specs.KubernetesUsageSpec.cpu:type_name -> specs.KubernetesUsageSpec.Quantity + 94, // 43: specs.KubernetesUsageSpec.mem:type_name -> specs.KubernetesUsageSpec.Quantity + 94, // 44: specs.KubernetesUsageSpec.storage:type_name -> specs.KubernetesUsageSpec.Quantity + 95, // 45: specs.KubernetesUsageSpec.pods:type_name -> specs.KubernetesUsageSpec.Pod + 96, // 46: specs.ImagePullRequestSpec.node_image_list:type_name -> specs.ImagePullRequestSpec.NodeImageList + 97, // 47: specs.TalosExtensionsSpec.items:type_name -> specs.TalosExtensionsSpec.Info + 13, // 48: specs.SchematicConfigurationSpec.target:type_name -> specs.SchematicConfigurationSpec.Target + 81, // 49: specs.MachineStatusSpec.HardwareStatus.processors:type_name -> specs.MachineStatusSpec.HardwareStatus.Processor + 82, // 50: specs.MachineStatusSpec.HardwareStatus.memory_modules:type_name -> specs.MachineStatusSpec.HardwareStatus.MemoryModule + 83, // 51: specs.MachineStatusSpec.HardwareStatus.blockdevices:type_name -> specs.MachineStatusSpec.HardwareStatus.BlockDevice + 84, // 52: specs.MachineStatusSpec.NetworkStatus.network_links:type_name -> specs.MachineStatusSpec.NetworkStatus.NetworkLinkStatus + 8, // 53: specs.MachineSetSpec.MachineClass.allocation_type:type_name -> specs.MachineSetSpec.MachineClass.AllocationType + 88, // 54: specs.MachineSetSpec.UpdateStrategyConfig.rolling:type_name -> specs.MachineSetSpec.RollingUpdateStrategyConfig + 2, // 55: specs.ControlPlaneStatusSpec.Condition.type:type_name -> specs.ConditionType + 10, // 56: specs.ControlPlaneStatusSpec.Condition.status:type_name -> specs.ControlPlaneStatusSpec.Condition.Status + 11, // 57: specs.ControlPlaneStatusSpec.Condition.severity:type_name -> specs.ControlPlaneStatusSpec.Condition.Severity + 92, // 58: specs.KubernetesStatusSpec.NodeStaticPods.static_pods:type_name -> specs.KubernetesStatusSpec.StaticPodStatus + 59, // [59:59] is the sub-list for method output_type + 59, // [59:59] is the sub-list for method input_type + 59, // [59:59] is the sub-list for extension type_name + 59, // [59:59] is the sub-list for extension extendee + 0, // [0:59] is the sub-list for field type_name +} + +func init() { file_omni_specs_omni_proto_init() } +func file_omni_specs_omni_proto_init() { + if File_omni_specs_omni_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_omni_specs_omni_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MachineSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MachineStatusSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TalosConfigSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ClusterSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EtcdBackupConf); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EtcdBackupEncryptionSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EtcdBackupHeader); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EtcdBackupSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BackupDataSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EtcdBackupS3ConfSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EtcdBackupStatusSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EtcdManualBackupSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EtcdBackupStoreStatusSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EtcdBackupOverallStatusSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ClusterMachineSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ClusterMachineConfigPatchesSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ClusterMachineTalosVersionSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ClusterMachineConfigSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RedactedClusterMachineConfigSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ClusterMachineIdentitySpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ClusterMachineTemplateSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ClusterMachineStatusSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Machines); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ClusterStatusSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ClusterUUID); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ClusterConfigVersionSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ClusterMachineConfigStatusSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ClusterBootstrapStatusSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ClusterSecretsSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LoadBalancerConfigSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LoadBalancerStatusSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*KubernetesVersionSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TalosVersionSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*InstallationMediaSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ConfigPatchSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MachineSetSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TalosUpgradeStatusSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MachineSetStatusSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MachineSetNodeSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MachineLabelsSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MachineStatusSnapshotSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ControlPlaneStatusSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ClusterEndpointSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*KubernetesStatusSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*KubernetesUpgradeStatusSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*KubernetesUpgradeManifestStatusSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DestroyStatusSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OngoingTaskSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ClusterMachineEncryptionKeySpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ExposedServiceSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FeaturesConfigSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EtcdBackupSettings); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MachineClassSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MachineConfigGenOptionsSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EtcdAuditResultSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*KubeconfigSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*KubernetesUsageSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ImagePullRequestSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ImagePullStatusSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SchematicSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TalosExtensionsSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SchematicConfigurationSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MachineStatusSpec_HardwareStatus); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MachineStatusSpec_NetworkStatus); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MachineStatusSpec_PlatformMetadata); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MachineStatusSpec_Schematic); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MachineStatusSpec_HardwareStatus_Processor); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MachineStatusSpec_HardwareStatus_MemoryModule); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MachineStatusSpec_HardwareStatus_BlockDevice); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MachineStatusSpec_NetworkStatus_NetworkLinkStatus); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ClusterSpec_Features); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MachineSetSpec_MachineClass); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MachineSetSpec_BootstrapSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MachineSetSpec_RollingUpdateStrategyConfig); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MachineSetSpec_UpdateStrategyConfig); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ControlPlaneStatusSpec_Condition); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*KubernetesStatusSpec_NodeStatus); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*KubernetesStatusSpec_StaticPodStatus); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*KubernetesStatusSpec_NodeStaticPods); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*KubernetesUsageSpec_Quantity); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*KubernetesUsageSpec_Pod); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ImagePullRequestSpec_NodeImageList); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_omni_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TalosExtensionsSpec_Info); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + file_omni_specs_omni_proto_msgTypes[47].OneofWrappers = []interface{}{ + (*OngoingTaskSpec_TalosUpgrade)(nil), + (*OngoingTaskSpec_KubernetesUpgrade)(nil), + (*OngoingTaskSpec_Destroy)(nil), + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_omni_specs_omni_proto_rawDesc, + NumEnums: 14, + NumMessages: 84, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_omni_specs_omni_proto_goTypes, + DependencyIndexes: file_omni_specs_omni_proto_depIdxs, + EnumInfos: file_omni_specs_omni_proto_enumTypes, + MessageInfos: file_omni_specs_omni_proto_msgTypes, + }.Build() + File_omni_specs_omni_proto = out.File + file_omni_specs_omni_proto_rawDesc = nil + file_omni_specs_omni_proto_goTypes = nil + file_omni_specs_omni_proto_depIdxs = nil +} diff --git a/client/api/omni/specs/omni.proto b/client/api/omni/specs/omni.proto new file mode 100644 index 00000000..9c9b129d --- /dev/null +++ b/client/api/omni/specs/omni.proto @@ -0,0 +1,933 @@ +syntax = "proto3"; +package specs; + +option go_package = "github.com/siderolabs/omni/client/api/omni/specs"; + +import "talos/machine/machine.proto"; +import "google/protobuf/timestamp.proto"; +import "google/protobuf/duration.proto"; + +// MachineSpec describes a Machine. +message MachineSpec { + // IP which can be used to access Talos API. + string management_address = 1; + // Connected is copied from the corresponding Link resource. + bool connected = 2; + reserved 3; + reserved 4; +} + +// MachineStatusSpec describes state of a Machine. +message MachineStatusSpec { + // HardwareStatus describes machine hardware status. + message HardwareStatus { + // Processor describes machine CPU. + message Processor { + // Number of cores. + uint32 core_count = 1; + // Number of threads. + uint32 thread_count = 2; + // CPU frequency in MHz. + uint32 frequency = 3; + // CPU manufacturer and model. + string description = 4; + // CPU manufacturer. + string manufacturer = 5; + } + + // MemoryModule describes machine memory. + message MemoryModule { + // Size of memory in MB. + uint32 size_mb = 1; + // Memory manufacturer and model. + string description = 2; + } + + // BlockDevice describes a block device. + message BlockDevice { + // Size indicates the disk size in bytes. + uint64 size = 1; + // Model idicates the disk model. + string model = 2; + // Linux blockdevice name (e.g. `/dev/sda`). + string linux_name = 3; + // Name as in `/sys/block/<dev>/device/name`. + string name = 4; + // Serial as in `/sys/block/<dev>/device/serial`. + string serial = 5; + // Uuid as in `/sys/block/<dev>/device/uuid`. + string uuid = 7; + // Wwid as in `/sys/block/<dev>/device/wwid`. + string wwid = 8; + // Type is a type of the disk: nvme, ssd, hdd, sd card. + string type = 9; + // BusPath is the bus path of the disk. + string bus_path = 10; + // SystemDisk is the system disk flag. + bool system_disk = 11; + } + + // CPU information. + repeated Processor processors = 1; + // Memory information. + repeated MemoryModule memory_modules = 2; + // Blockdevice information. + repeated BlockDevice blockdevices = 3; + // Machine architecture. + string arch = 4; + } + + // NetworkStatus describes the status of a machine network . + message NetworkStatus { + // Physical network interfaces. + message NetworkLinkStatus { + // Linux interface name. + string linux_name = 1; + // MAC address. + string hardware_address = 2; + // Speed in Mbps. + uint32 speed_mbps = 3; + // Link status. + bool link_up = 4; + // Hardware description. + string description = 5; + }; + + // Current machine hostname. + string hostname = 1; + // Current machine domainname. + string domainname = 2; + // List of machine IPs. + repeated string addresses = 3; + // List of default gateway IPs. + repeated string default_gateways = 4; + // List of physical network interfaces. + repeated NetworkLinkStatus network_links = 5; + } + + // PlatformMetadata describes platform-specific information. + message PlatformMetadata { + // Platform is the name of the platform (e.g. `aws`, `gcp`, `azure`). + string platform = 1; + // Hostname is the hostname of the machine. + string hostname = 2; + // Region (in the cloud). + string region = 3; + // Availability zone (in the cloud). + string zone = 4; + // Instance type (in the cloud). + string instance_type = 5; + // Instance ID (in the cloud). + string instance_id = 6; + // Provider ID (for the Node resource). + string provider_id = 7; + // Spot instance flag. + bool spot = 8; + } + + message Schematic { + // Id is the image factory schematic id used for the image generation. + string id = 1; + + // Invalid marks the machine as having extensions installed bypassing image factory. + // Which makes it impossible to detect schematic id and manage the image generation + // using image factory. + bool invalid = 2; + } + + // Talos version. + string talos_version = 1; + + // Hardware-related information. + HardwareStatus hardware = 2; + + // Network-related information. + NetworkStatus network = 3; + + // Set if the last poll resulted in an error. + string last_error = 4; + + // Management address is copied from the machine resource. + string management_address = 5; + + // Connected is copied from the corresponding Link resource. + bool connected = 6; + + // Maintenance flag means that the node is running in the maintenance mode. + bool maintenance = 7; + + reserved 8; + + // Cluster is the name of the cluster the machine belongs to. + string cluster = 9; + + enum Role { + NONE = 0; + CONTROL_PLANE = 1; + WORKER = 2; + } + + // Role is the role of the machine in the cluster. + Role role = 10; + + // Platform-specific information. + PlatformMetadata platform_metadata = 11; + + reserved 12; + + map<string, string> image_labels = 13; + + Schematic schematic = 14; +} + +// TalosConfigSpec describes a Talos cluster config. +message TalosConfigSpec { + // Ca certificate authority. + string ca = 1; + + // Crt certificate. + string crt = 2; + + // Key certificate key. + string key = 3; +} + +// Cluster describes a Talos cluster. +message ClusterSpec { + message Features { + // EnableWorkloadProxy enables workload proxy. + bool enable_workload_proxy = 1; + // DiskEncryption enables disk encryption on all nodes. + bool disk_encryption = 2; + } + + // InstallImage the installer image to use. + string install_image = 1 [deprecated = true]; + + // KubernetesVersion to use on the node. + string kubernetes_version = 2; + + // TalosVersion cluster wide Talos version. + string talos_version = 3; + + // Features are the cluster features. + Features features = 4; + + // Backup describes the backup configuration. If it set to null that means that backups are disabled for this cluster. + EtcdBackupConf backup_configuration = 5; +} + +// EtcdBackupConf describes the backup configuration. +message EtcdBackupConf { + // Interval is the interval between backups. If not set, backups are disabled. + google.protobuf.Duration interval = 1; + // Enabled etcd backups. + bool enabled = 2; +} + +// EtcdBackupEncryptionSpec describes the backup encryption. +message EtcdBackupEncryptionSpec { + bytes encryption_key = 1; +} + +// EtcdBackupHeader describes the backup header. +message EtcdBackupHeader { + // Version is the version of the backup creator. + int64 version = 1; +} + +// EtcdBackupSpec describes the backup. +message EtcdBackupSpec { + // CreatedAt is the time when the backup was created. + google.protobuf.Timestamp created_at = 1; + + // Snapshot is the snapshot file name. + string snapshot = 2; + + // Size specifies the etcd backup size. + uint64 size = 3; +} + +// BackupDataSpec describes the data needed for etcd backup. +message BackupDataSpec { + google.protobuf.Duration interval = 1; + string cluster_uuid = 2; + bytes encryption_key = 3; + string aes_cbc_encryption_secret = 4; + string secretbox_encryption_secret = 5; +} + +// EtcdBackupS3ConfSpec describes the S3 configuration for the backup process. +message EtcdBackupS3ConfSpec { + string bucket = 1; + string region = 2; + string endpoint = 3; + string access_key_id = 4; + string secret_access_key = 5; + string session_token = 6; +} + +// EtcdBackupStatus describes cluster last backup status. +message EtcdBackupStatusSpec { + enum Status { + Unknown = 0; + Ok = 1; + Error = 2; + Running = 3; + } + + // Status is the status of the last backup. + Status status = 1; + + // Error is the error message if the backup failed. + string error = 2; + + // LastBackupTime is the time of the last backup. + google.protobuf.Timestamp last_backup_time = 3; + + // LastBackupAttempt is the time of the last backup attempt. + google.protobuf.Timestamp last_backup_attempt = 4; +} + +// EtcdManualBackupSpec describes the manual backup request. +message EtcdManualBackupSpec { + // BackupAt is the time when the backup should be created. + google.protobuf.Timestamp backup_at = 1; +} + +// EtcdBackupStoreStatusSpec is internal resource that decribes store configuration name and configuration last error. +message EtcdBackupStoreStatusSpec { + // ConfigurationName is the name of the configuration (disabled|local|s3). + string configuration_name = 1; + + // ConfigurationError is the error message if the configuration is invalid. + string configuration_error = 2; +} + +// EtcdBackupOverallStatusSpec describes the overall etcd backup system status. +message EtcdBackupOverallStatusSpec { + // ConfigurationName is the name of the configuration (disabled|local|s3). + string configuration_name = 1; + + // ConfigurationError is the error message if the configuration is invalid. + string configuration_error = 2; + + // LastBackupStatus is the status of the last backup. + EtcdBackupStatusSpec last_backup_status = 3; +} + +// ClusterMachineSpec describes a machine attached to a Cluster. +message ClusterMachineSpec { + reserved 1; + // KubernetesVersion to use on the machine (copied from Cluster at the moment of creation). + string kubernetes_version = 2; +} + +// ClusterMachineConfigPatchesSpec keeps the list of config patches to be applied on the machine. +message ClusterMachineConfigPatchesSpec { + // List of patches combined from all sources, as a final list of patches to apply. + repeated string patches = 1; +} + +// ClusterMachineTalosVersionSpec describes a machine Talos version and schematic. +message ClusterMachineTalosVersionSpec { + string talos_version = 1; + string schematic_id = 2; +} + +// ClusterMachineConfigSpec stores generated Talos node machine config. +message ClusterMachineConfigSpec { + bytes data = 1; + string cluster_machine_version = 2; + string generation_error = 3; +} + +// ClusterMachineConfigSpec stores generated Talos node machine config. +message RedactedClusterMachineConfigSpec { + string data = 1; +} + +// ClusterMachineIdentity keeps ClusterMachine related node information. +message ClusterMachineIdentitySpec { + // NodeIdentity is Talos node identity from Identity resource. + string node_identity = 1; + // EtcdMemberId is the id of the node how it's represented in the etcd quorum. + uint64 etcd_member_id = 2; + // Nodename is the Kubernetes node name. + string nodename = 3; + // NodeIps are the IPs of the Kubernetes node. + repeated string node_ips = 8; +} + +// ClusterMachineTemplateSpec +message ClusterMachineTemplateSpec { + // InstallImage the installer image to use. + string install_image = 1; + + // KubernetesVersion to use on the node. + string kubernetes_version = 2; + + // InstallDisk Talos system disk. + string install_disk = 3; + + // Patch represents machinery config patch. + string patch = 5; +} + +enum ConfigApplyStatus { + UNKNOWN = 0; + PENDING = 1; + APPLIED = 2; + FAILED = 3; +} + +// ClusterMachineStatusSpec +message ClusterMachineStatusSpec { + // Ready is true if all services are healthy. + bool ready = 1; + + enum Stage { + UNKNOWN = 0; + BOOTING = 1; + INSTALLING = 2; + UPGRADING = 6; + CONFIGURING = 3; + RUNNING = 4; + REBOOTING = 7; + SHUTTING_DOWN = 8; + BEFORE_DESTROY = 9; + DESTROYING = 5; + } + + Stage stage = 2; + + // ApidAvailable is true if the node is a control plane node and the apid service is healthy. + bool apid_available = 3; + + bool config_up_to_date = 4; + string last_config_error = 5; + + // Management address is copied from the machine status resource. + string management_address = 6; + + ConfigApplyStatus config_apply_status = 7; +} + +// Machines counts the number of machines in a set including health status. +message Machines { + // Total machines currently allocated. + uint32 total = 1; + // Healthy machines. + uint32 healthy = 2; + // Connected represents the number of machines in a machine set connected to the wireguard network. + uint32 connected = 3; + // Requested machines count, same as total for manual allocation, may differ for machine class mode. + uint32 requested = 4; +} + +// ClusterStatusSpec aggregates general information about a cluster. +message ClusterStatusSpec { + // Cluster is available when at least one controlplane node has APId up. + bool available = 1; + + Machines machines = 2; + + enum Phase { + UNKNOWN = 0; + SCALING_UP = 1; + SCALING_DOWN = 2; + RUNNING = 3; + DESTROYING = 4; + } + + Phase phase = 3; + + bool ready = 4; + bool kubernetesAPIReady = 5; + bool controlplaneReady = 6; + bool has_connected_control_planes = 7; +} + +// ClusterUUID keeps the UUID of the cluster. +message ClusterUUID { + string uuid = 1; +} + +// ClusterConfigVersion keeps the version of Talos which was used for initial config generation. +message ClusterConfigVersionSpec { + string version = 1; +} + +// ClusterMachineConfigStatusSpec machine configuration status spec. +message ClusterMachineConfigStatusSpec { + reserved 1; + reserved 2; + + string cluster_machine_config_version = 3; + string cluster_machine_version = 4; + string cluster_machine_config_sha256 = 5; + string last_config_error = 6; + string talos_version = 7; + string schematic_id = 8; +} + +// ClusterBootstrapStatusSpec keeps track of bootstrap calls for a cluster. +message ClusterBootstrapStatusSpec { + bool bootstrapped = 1; +} + +// ClusterSecretsSpec describes cluster secrets. +message ClusterSecretsSpec { + // Bytes holding serialized cluster secrets. + bytes data = 1; +} + +// LoadBalancerConfigSpec describes the configuration of a load balancer. +message LoadBalancerConfigSpec { + reserved 1; + string bind_port = 2; + // Full URL of the loadbalancer inside Omni environment. + string siderolink_endpoint = 4; + // IP adresses of the endpoints + repeated string endpoints = 3; +} + +// LoadBalancerStatusSpec reflects the status of a load balancer. +message LoadBalancerStatusSpec { + reserved 1; + reserved 2; + bool healthy = 3; + bool stopped = 4; +} + +// KubernetesVersionSpec represents an available Kubernetes version. +message KubernetesVersionSpec { + string version = 1; +} + +// TalosVersionSpec represents an available Talos version. +message TalosVersionSpec { + string version = 1; + repeated string compatible_kubernetes_versions = 2; +} + +// InstallationMediaSpec resource describes a Talos installation media that can be generated by the image factory. It also describes the necessary parameters to be passed to the image factory. +message InstallationMediaSpec { + // Name is the human readable name of the image. + string name = 1; + string architecture = 2; + string profile = 3; + string contentType = 6; + // SrcFilePrefix defines the src filename to download the image from. + string src_file_prefix = 7; + // DestFilePrefix defines the dest filename to download the image to. + string dest_file_prefix = 8; + // Extension defines the dest filename extension. + string extension = 9; + // NoSecureBoot means that the installation media doesn't support SecureBoot generation. + bool no_secure_boot = 11; +} + +// ConfigPatchSpec represents the machine config patch. +message ConfigPatchSpec { + string data = 1; +} + +// MachineSetPhaseSpec is machine set phase. +enum MachineSetPhase { + Unknown = 0; + ScalingUp = 1; + ScalingDown = 2; + Running = 3; + Destroying = 4; + Failed = 5; + Reconfiguring = 6; +} + +// MachineSetSpec describes the cluster machine group. +message MachineSetSpec { + // MachineClass defines the machine class configuration. + message MachineClass { + enum AllocationType { + // Static uses the count defined in the count field. + Static = 0; + // Unlimited allocates all available machines from the machine class. + Unlimited = 1; + } + + // Name defines the machine class id to select the machines from. + string name = 1; + // MachineCount defines fixed amount of the machines to allocated from the machine class. + uint32 machine_count = 2; + // AllocationType defines special constants for the amount of machines to be allocated. + AllocationType allocation_type = 3; + } + + // BootstrapSpec defines the bootstrap spec for the control plane machine set. + // It can contain a reference to an etcd backup, which can be used to bootstrap etcd. + message BootstrapSpec { + // ClusterUuid is the UUID of the cluster to bootstrap. It can be obtained via `omnictl get clusteruuid <cluster-name>` + string cluster_uuid = 1; + + // Snapshot is the file name of the etcd snapshot to restore from. It follows the format similar to `FFFFFFFFFFFFFFFF.snapshot`. + string snapshot = 2; + } + + // UpdateStrategy defines the update strategy of the machine set. + enum UpdateStrategy { + Unset = 0; + Rolling = 1; + } + + // RollingUpdateStrategyConfig defines the rolling update strategy configuration. + message RollingUpdateStrategyConfig { + // MaxParallelism is the maximum number of machines that can be processed in parallel. + // When unset or set to 0, it defaults to 1. + uint32 max_parallelism = 1; + } + + // UpdateConfig defines the update configuration. + message UpdateStrategyConfig { + // Rolling is the rolling update configuration. + // Used only when the UpdateStrategy is set to Rolling. + RollingUpdateStrategyConfig rolling = 1; + } + + // UpdateStrategy is the update strategy of the machine set. + UpdateStrategy update_strategy = 1; + + // MachineClass is the machine class to pick machines from for the machine set. + MachineClass machine_class = 2; + + // BootstrapSpec defines the bootstrapping spec of the machine set. + // This field is immutable, only valid for the control plane machine set and used only once at the creation time. + // When set, the machine set won't be created from scratch, instead, it will be bootstrapped using the given spec. + BootstrapSpec bootstrap_spec = 3; + + // DeleteStrategy defines the delete strategy of the machine set. + UpdateStrategy delete_strategy = 4; + + // UpdateStrategyConfig defines the update strategy configuration. + UpdateStrategyConfig update_strategy_config = 5; + + // DeleteStrategyConfig defines the delete strategy configuration. + UpdateStrategyConfig delete_strategy_config = 6; +} + +// TalosUpgradeStatusSpec contains the status of the Talos upgrade process. +message TalosUpgradeStatusSpec { + enum Phase { + Unknown = 0; + Upgrading = 1; + Done = 2; + Failed = 3; + Reverting = 4; + } + + // Current upgrade phase. + Phase phase = 1; + + // If phase is Failed, this contains the error message. + string error = 2; + + // If phase is Upgrading, this contains the current upgrade step. + string step = 3; + + // If phase is Upgrading, this contains the current upgrade step progress. + string status = 4; + + // Last successful upgrade version. + string last_upgrade_version = 5; + + // Current version of the upgrade (if phase == Upgrading). + string current_upgrade_version = 6; + + // List of versions available for upgrade. + repeated string upgrade_versions = 7; +} + +// MachineSetStatusSpec describes machine set status. +message MachineSetStatusSpec { + MachineSetPhase phase = 1; + bool ready = 2; + string error = 3; + Machines machines = 4; + // config_hash is the combined hash of all cluster machines which are part of the machine set. + string config_hash = 5; + // MachineClass is copied from the input MachineSet resource. + MachineSetSpec.MachineClass machine_class = 6; +} + +// MachineSetNodeSpec is a binding between ClusterMachine and MachineSet. +message MachineSetNodeSpec {} + +// MachineLabelsSpec is the resource that adds user defined labels to the MachineStatus. +message MachineLabelsSpec {} + +// MachineStatusSnapshotSpec describes latest known status of MachineStatus Talos resource. +message MachineStatusSnapshotSpec { + machine.MachineStatusEvent machine_status = 1; +} + +enum ConditionType { + UnknownCondition = 0; + Etcd = 1; + WireguardConnection = 2; +} + +// ControlPlaneStatusSpec contains the status of the MachineSets which manage control plane nodes. +message ControlPlaneStatusSpec { + message Condition { + enum Status { + Unknown = 0; + Ready = 1; + NotReady = 2; + } + + enum Severity { + Info = 0; + Warning = 1; + Error = 2; + } + + ConditionType type = 1; + string reason = 2; + Status status = 3; + Severity severity = 4; + } + + repeated Condition conditions = 1; +} + +// ClusterEndpointSpec contains a list of SideroLink (management) control plane endpoints. +message ClusterEndpointSpec { + // List of SideroLink addresses for control plane nodes. + repeated string management_addresses = 1; +} + +// KubernetesStatusSpec contains the status of the Kubernetes critical resources in the cluster. +message KubernetesStatusSpec { + message NodeStatus { + string nodename = 1; + string kubelet_version = 2; + bool ready = 3; + } + + // status of each node, sorted by nodename + repeated NodeStatus nodes = 1; + + message StaticPodStatus { + string app = 1; + string version = 2; + bool ready = 3; + } + + message NodeStaticPods { + string nodename = 1; + repeated StaticPodStatus static_pods = 2; + } + + // status of each static pod on each node, sorted by nodename, then by pod's app + repeated NodeStaticPods static_pods = 2; +} + +// KubernetesUpgradeStatus spec contains the status of the Kubernetes upgrade process. +message KubernetesUpgradeStatusSpec { + enum Phase { + Unknown = 0; + Upgrading = 1; + Done = 2; + Failed = 3; + Reverting = 4; + } + + // Current upgrade phase. + Phase phase = 1; + + // If phase is Failed, this contains the error message. + string error = 2; + + // If phase is Upgrading, this contains the current upgrade step. + string step = 3; + + // If phase is Upgrading, this contains the current upgrade step progress. + string status = 4; + + // Last successful upgrade version. + string last_upgrade_version = 5; + + // Current version of the upgrade (if phase == Upgrading). + string current_upgrade_version = 7; + + // List of versions available for upgrade. + repeated string upgrade_versions = 6; +} + +// KubernetesUpgradeManifestStatus contains status of Kubernetes upgrade manifest sync. +message KubernetesUpgradeManifestStatusSpec { + // Number of manifests out of sync. + int32 out_of_sync = 1; + // Last fatal error encountered (which prevented the sync). + string last_fatal_error = 2; +} + +// DestroyStatusSpec describes the state of resource destroy. +message DestroyStatusSpec { + // Phase describes the current destroy phase. + string phase = 1; +} + +// OngoingTaskSpec describes any ongoing tasks. +message OngoingTaskSpec { + // Title of the ongoing task. + string title = 1; + + // Details contains the detailed task description. + oneof details { + TalosUpgradeStatusSpec talos_upgrade = 2; + KubernetesUpgradeStatusSpec kubernetes_upgrade = 3; + DestroyStatusSpec destroy = 4; + } +} + +// ClusterMachineEncryptionKeySpec keeps generated encryption key for the machine disk encryption. +message ClusterMachineEncryptionKeySpec { + // Data stores generated encryption key for the machine. + bytes data = 1; +} + +// ExposedServiceSpec describes a Kubernetes service exposed through Omni from a workload cluster. +message ExposedServiceSpec { + // Port is the host port the service is exposed on. + uint32 port = 1; + + // Label is the human-readable label of the service to be displayed on Omni Web. + string label = 2; + + // IconBase64 is the icon of the service to be displayed on Omni Web. + string icon_base64 = 3; +} + +message FeaturesConfigSpec { + // EnableWorkloadProxying enables workload proxying feature. + bool enable_workload_proxying = 1; + + // EtcdBackupSettings represents omni etcd backup settings. + EtcdBackupSettings etcd_backup_settings = 2; +} + +message EtcdBackupSettings { + // TickInterval is the interval between checking for backups in controller. + google.protobuf.Duration tick_interval = 1; + + // MinInterval is the minimum interval between backups. + google.protobuf.Duration min_interval = 2; + + // MaxInterval is the maximum interval between backups. + google.protobuf.Duration max_interval = 3; + + reserved 4; +} + +// MachineClassSpec describes an Omni MachineClass resource spec. +message MachineClassSpec { + // MatchLabels is the list of labels to match the machine to make it part of the machine class. + repeated string match_labels = 1; +} + +// MachineConfigGenOptionsSpec describes machine related config generation inputs. +message MachineConfigGenOptionsSpec { + string install_disk = 1; +} + +// EtcdAuditResult is updated when the etcd audit removes a member. +// +// This resource is used to re-trigger the controlplane status checks when etcd audit removes a member. +message EtcdAuditResultSpec { + // EtcdMemberIds contains the list of ids of the members that were last removed. + // The list is always sorted. + repeated uint64 etcd_member_ids = 1; +} + +// KubeconfigSpec describes a Kubernetes client configuraiton for a cluster. +message KubeconfigSpec { + // Marshalled kubeconfig. + bytes data = 1; +} + +// KubernetesUsageSpec represents kubernetes resource usage for a cluster. +message KubernetesUsageSpec { + message Quantity { + double requests = 1; + double limits = 2; + double capacity = 3; + } + + message Pod { + int32 count = 1; + int32 capacity = 3; + } + + Quantity cpu = 1; + Quantity mem = 2; + Quantity storage = 3; + Pod pods = 4; +} + +// ImagePullRequestSpec describes an Omni ImagePullRequest resource spec. +message ImagePullRequestSpec { + message NodeImageList { + string node = 1; + repeated string images = 2; + } + + // NodeImageList are the images to be pulled into the node. + repeated NodeImageList node_image_list = 1; +} + +// ImagePullStatusSpec describes an Omni ImagePullStatus resource spec. +message ImagePullStatusSpec { + string last_processed_node = 1; + string last_processed_image = 2; + string last_processed_error = 3; + uint32 processed_count = 4; + uint32 total_count = 5; + + // RequestVersion is the version of the ImagePullRequest that this status is for. + string request_version = 6; +} + +// SchematicSpec keeps all schematics generated by Omni. +// For each schematic it keeps information about the list of extensions. +message SchematicSpec { + repeated string extensions = 1; +} + +// TalosExtensionsSpec represents all available extensions for a particular Talos version. +message TalosExtensionsSpec { + // Info is a merged representation of the extensions manifest and image factory versions response. + message Info { + string name = 1; + string author = 2; + string version = 3; + string description = 4; + string ref = 5; + string digest = 6; + } + + repeated Info items = 1; +} + +// SchematicConfigurationSpec is the desired Image Factory schematic for a machine, machine set or a cluster. +message SchematicConfigurationSpec { + enum Target { + Unknown = 0; + ClusterMachine = 1; + MachineSet = 2; + Cluster = 3; + } + + string schematic_id = 1; + + Target target = 2; +} \ No newline at end of file diff --git a/client/api/omni/specs/omni_vtproto.pb.go b/client/api/omni/specs/omni_vtproto.pb.go new file mode 100644 index 00000000..60df3acc --- /dev/null +++ b/client/api/omni/specs/omni_vtproto.pb.go @@ -0,0 +1,22572 @@ +// Code generated by protoc-gen-go-vtproto. DO NOT EDIT. +// protoc-gen-go-vtproto version: v0.6.0 +// source: omni/specs/omni.proto + +package specs + +import ( + binary "encoding/binary" + fmt "fmt" + io "io" + math "math" + + protohelpers "github.com/planetscale/vtprotobuf/protohelpers" + durationpb1 "github.com/planetscale/vtprotobuf/types/known/durationpb" + timestamppb1 "github.com/planetscale/vtprotobuf/types/known/timestamppb" + machine "github.com/siderolabs/talos/pkg/machinery/api/machine" + proto "google.golang.org/protobuf/proto" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + durationpb "google.golang.org/protobuf/types/known/durationpb" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +func (m *MachineSpec) CloneVT() *MachineSpec { + if m == nil { + return (*MachineSpec)(nil) + } + r := new(MachineSpec) + r.ManagementAddress = m.ManagementAddress + r.Connected = m.Connected + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *MachineSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *MachineStatusSpec_HardwareStatus_Processor) CloneVT() *MachineStatusSpec_HardwareStatus_Processor { + if m == nil { + return (*MachineStatusSpec_HardwareStatus_Processor)(nil) + } + r := new(MachineStatusSpec_HardwareStatus_Processor) + r.CoreCount = m.CoreCount + r.ThreadCount = m.ThreadCount + r.Frequency = m.Frequency + r.Description = m.Description + r.Manufacturer = m.Manufacturer + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *MachineStatusSpec_HardwareStatus_Processor) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *MachineStatusSpec_HardwareStatus_MemoryModule) CloneVT() *MachineStatusSpec_HardwareStatus_MemoryModule { + if m == nil { + return (*MachineStatusSpec_HardwareStatus_MemoryModule)(nil) + } + r := new(MachineStatusSpec_HardwareStatus_MemoryModule) + r.SizeMb = m.SizeMb + r.Description = m.Description + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *MachineStatusSpec_HardwareStatus_MemoryModule) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *MachineStatusSpec_HardwareStatus_BlockDevice) CloneVT() *MachineStatusSpec_HardwareStatus_BlockDevice { + if m == nil { + return (*MachineStatusSpec_HardwareStatus_BlockDevice)(nil) + } + r := new(MachineStatusSpec_HardwareStatus_BlockDevice) + r.Size = m.Size + r.Model = m.Model + r.LinuxName = m.LinuxName + r.Name = m.Name + r.Serial = m.Serial + r.Uuid = m.Uuid + r.Wwid = m.Wwid + r.Type = m.Type + r.BusPath = m.BusPath + r.SystemDisk = m.SystemDisk + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *MachineStatusSpec_HardwareStatus_BlockDevice) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *MachineStatusSpec_HardwareStatus) CloneVT() *MachineStatusSpec_HardwareStatus { + if m == nil { + return (*MachineStatusSpec_HardwareStatus)(nil) + } + r := new(MachineStatusSpec_HardwareStatus) + r.Arch = m.Arch + if rhs := m.Processors; rhs != nil { + tmpContainer := make([]*MachineStatusSpec_HardwareStatus_Processor, len(rhs)) + for k, v := range rhs { + tmpContainer[k] = v.CloneVT() + } + r.Processors = tmpContainer + } + if rhs := m.MemoryModules; rhs != nil { + tmpContainer := make([]*MachineStatusSpec_HardwareStatus_MemoryModule, len(rhs)) + for k, v := range rhs { + tmpContainer[k] = v.CloneVT() + } + r.MemoryModules = tmpContainer + } + if rhs := m.Blockdevices; rhs != nil { + tmpContainer := make([]*MachineStatusSpec_HardwareStatus_BlockDevice, len(rhs)) + for k, v := range rhs { + tmpContainer[k] = v.CloneVT() + } + r.Blockdevices = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *MachineStatusSpec_HardwareStatus) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *MachineStatusSpec_NetworkStatus_NetworkLinkStatus) CloneVT() *MachineStatusSpec_NetworkStatus_NetworkLinkStatus { + if m == nil { + return (*MachineStatusSpec_NetworkStatus_NetworkLinkStatus)(nil) + } + r := new(MachineStatusSpec_NetworkStatus_NetworkLinkStatus) + r.LinuxName = m.LinuxName + r.HardwareAddress = m.HardwareAddress + r.SpeedMbps = m.SpeedMbps + r.LinkUp = m.LinkUp + r.Description = m.Description + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *MachineStatusSpec_NetworkStatus_NetworkLinkStatus) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *MachineStatusSpec_NetworkStatus) CloneVT() *MachineStatusSpec_NetworkStatus { + if m == nil { + return (*MachineStatusSpec_NetworkStatus)(nil) + } + r := new(MachineStatusSpec_NetworkStatus) + r.Hostname = m.Hostname + r.Domainname = m.Domainname + if rhs := m.Addresses; rhs != nil { + tmpContainer := make([]string, len(rhs)) + copy(tmpContainer, rhs) + r.Addresses = tmpContainer + } + if rhs := m.DefaultGateways; rhs != nil { + tmpContainer := make([]string, len(rhs)) + copy(tmpContainer, rhs) + r.DefaultGateways = tmpContainer + } + if rhs := m.NetworkLinks; rhs != nil { + tmpContainer := make([]*MachineStatusSpec_NetworkStatus_NetworkLinkStatus, len(rhs)) + for k, v := range rhs { + tmpContainer[k] = v.CloneVT() + } + r.NetworkLinks = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *MachineStatusSpec_NetworkStatus) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *MachineStatusSpec_PlatformMetadata) CloneVT() *MachineStatusSpec_PlatformMetadata { + if m == nil { + return (*MachineStatusSpec_PlatformMetadata)(nil) + } + r := new(MachineStatusSpec_PlatformMetadata) + r.Platform = m.Platform + r.Hostname = m.Hostname + r.Region = m.Region + r.Zone = m.Zone + r.InstanceType = m.InstanceType + r.InstanceId = m.InstanceId + r.ProviderId = m.ProviderId + r.Spot = m.Spot + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *MachineStatusSpec_PlatformMetadata) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *MachineStatusSpec_Schematic) CloneVT() *MachineStatusSpec_Schematic { + if m == nil { + return (*MachineStatusSpec_Schematic)(nil) + } + r := new(MachineStatusSpec_Schematic) + r.Id = m.Id + r.Invalid = m.Invalid + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *MachineStatusSpec_Schematic) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *MachineStatusSpec) CloneVT() *MachineStatusSpec { + if m == nil { + return (*MachineStatusSpec)(nil) + } + r := new(MachineStatusSpec) + r.TalosVersion = m.TalosVersion + r.Hardware = m.Hardware.CloneVT() + r.Network = m.Network.CloneVT() + r.LastError = m.LastError + r.ManagementAddress = m.ManagementAddress + r.Connected = m.Connected + r.Maintenance = m.Maintenance + r.Cluster = m.Cluster + r.Role = m.Role + r.PlatformMetadata = m.PlatformMetadata.CloneVT() + r.Schematic = m.Schematic.CloneVT() + if rhs := m.ImageLabels; rhs != nil { + tmpContainer := make(map[string]string, len(rhs)) + for k, v := range rhs { + tmpContainer[k] = v + } + r.ImageLabels = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *MachineStatusSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *TalosConfigSpec) CloneVT() *TalosConfigSpec { + if m == nil { + return (*TalosConfigSpec)(nil) + } + r := new(TalosConfigSpec) + r.Ca = m.Ca + r.Crt = m.Crt + r.Key = m.Key + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *TalosConfigSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *ClusterSpec_Features) CloneVT() *ClusterSpec_Features { + if m == nil { + return (*ClusterSpec_Features)(nil) + } + r := new(ClusterSpec_Features) + r.EnableWorkloadProxy = m.EnableWorkloadProxy + r.DiskEncryption = m.DiskEncryption + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *ClusterSpec_Features) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *ClusterSpec) CloneVT() *ClusterSpec { + if m == nil { + return (*ClusterSpec)(nil) + } + r := new(ClusterSpec) + r.InstallImage = m.InstallImage + r.KubernetesVersion = m.KubernetesVersion + r.TalosVersion = m.TalosVersion + r.Features = m.Features.CloneVT() + r.BackupConfiguration = m.BackupConfiguration.CloneVT() + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *ClusterSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *EtcdBackupConf) CloneVT() *EtcdBackupConf { + if m == nil { + return (*EtcdBackupConf)(nil) + } + r := new(EtcdBackupConf) + r.Interval = (*durationpb.Duration)((*durationpb1.Duration)(m.Interval).CloneVT()) + r.Enabled = m.Enabled + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *EtcdBackupConf) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *EtcdBackupEncryptionSpec) CloneVT() *EtcdBackupEncryptionSpec { + if m == nil { + return (*EtcdBackupEncryptionSpec)(nil) + } + r := new(EtcdBackupEncryptionSpec) + if rhs := m.EncryptionKey; rhs != nil { + tmpBytes := make([]byte, len(rhs)) + copy(tmpBytes, rhs) + r.EncryptionKey = tmpBytes + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *EtcdBackupEncryptionSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *EtcdBackupHeader) CloneVT() *EtcdBackupHeader { + if m == nil { + return (*EtcdBackupHeader)(nil) + } + r := new(EtcdBackupHeader) + r.Version = m.Version + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *EtcdBackupHeader) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *EtcdBackupSpec) CloneVT() *EtcdBackupSpec { + if m == nil { + return (*EtcdBackupSpec)(nil) + } + r := new(EtcdBackupSpec) + r.CreatedAt = (*timestamppb.Timestamp)((*timestamppb1.Timestamp)(m.CreatedAt).CloneVT()) + r.Snapshot = m.Snapshot + r.Size = m.Size + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *EtcdBackupSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *BackupDataSpec) CloneVT() *BackupDataSpec { + if m == nil { + return (*BackupDataSpec)(nil) + } + r := new(BackupDataSpec) + r.Interval = (*durationpb.Duration)((*durationpb1.Duration)(m.Interval).CloneVT()) + r.ClusterUuid = m.ClusterUuid + r.AesCbcEncryptionSecret = m.AesCbcEncryptionSecret + r.SecretboxEncryptionSecret = m.SecretboxEncryptionSecret + if rhs := m.EncryptionKey; rhs != nil { + tmpBytes := make([]byte, len(rhs)) + copy(tmpBytes, rhs) + r.EncryptionKey = tmpBytes + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *BackupDataSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *EtcdBackupS3ConfSpec) CloneVT() *EtcdBackupS3ConfSpec { + if m == nil { + return (*EtcdBackupS3ConfSpec)(nil) + } + r := new(EtcdBackupS3ConfSpec) + r.Bucket = m.Bucket + r.Region = m.Region + r.Endpoint = m.Endpoint + r.AccessKeyId = m.AccessKeyId + r.SecretAccessKey = m.SecretAccessKey + r.SessionToken = m.SessionToken + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *EtcdBackupS3ConfSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *EtcdBackupStatusSpec) CloneVT() *EtcdBackupStatusSpec { + if m == nil { + return (*EtcdBackupStatusSpec)(nil) + } + r := new(EtcdBackupStatusSpec) + r.Status = m.Status + r.Error = m.Error + r.LastBackupTime = (*timestamppb.Timestamp)((*timestamppb1.Timestamp)(m.LastBackupTime).CloneVT()) + r.LastBackupAttempt = (*timestamppb.Timestamp)((*timestamppb1.Timestamp)(m.LastBackupAttempt).CloneVT()) + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *EtcdBackupStatusSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *EtcdManualBackupSpec) CloneVT() *EtcdManualBackupSpec { + if m == nil { + return (*EtcdManualBackupSpec)(nil) + } + r := new(EtcdManualBackupSpec) + r.BackupAt = (*timestamppb.Timestamp)((*timestamppb1.Timestamp)(m.BackupAt).CloneVT()) + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *EtcdManualBackupSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *EtcdBackupStoreStatusSpec) CloneVT() *EtcdBackupStoreStatusSpec { + if m == nil { + return (*EtcdBackupStoreStatusSpec)(nil) + } + r := new(EtcdBackupStoreStatusSpec) + r.ConfigurationName = m.ConfigurationName + r.ConfigurationError = m.ConfigurationError + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *EtcdBackupStoreStatusSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *EtcdBackupOverallStatusSpec) CloneVT() *EtcdBackupOverallStatusSpec { + if m == nil { + return (*EtcdBackupOverallStatusSpec)(nil) + } + r := new(EtcdBackupOverallStatusSpec) + r.ConfigurationName = m.ConfigurationName + r.ConfigurationError = m.ConfigurationError + r.LastBackupStatus = m.LastBackupStatus.CloneVT() + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *EtcdBackupOverallStatusSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *ClusterMachineSpec) CloneVT() *ClusterMachineSpec { + if m == nil { + return (*ClusterMachineSpec)(nil) + } + r := new(ClusterMachineSpec) + r.KubernetesVersion = m.KubernetesVersion + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *ClusterMachineSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *ClusterMachineConfigPatchesSpec) CloneVT() *ClusterMachineConfigPatchesSpec { + if m == nil { + return (*ClusterMachineConfigPatchesSpec)(nil) + } + r := new(ClusterMachineConfigPatchesSpec) + if rhs := m.Patches; rhs != nil { + tmpContainer := make([]string, len(rhs)) + copy(tmpContainer, rhs) + r.Patches = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *ClusterMachineConfigPatchesSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *ClusterMachineTalosVersionSpec) CloneVT() *ClusterMachineTalosVersionSpec { + if m == nil { + return (*ClusterMachineTalosVersionSpec)(nil) + } + r := new(ClusterMachineTalosVersionSpec) + r.TalosVersion = m.TalosVersion + r.SchematicId = m.SchematicId + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *ClusterMachineTalosVersionSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *ClusterMachineConfigSpec) CloneVT() *ClusterMachineConfigSpec { + if m == nil { + return (*ClusterMachineConfigSpec)(nil) + } + r := new(ClusterMachineConfigSpec) + r.ClusterMachineVersion = m.ClusterMachineVersion + r.GenerationError = m.GenerationError + if rhs := m.Data; rhs != nil { + tmpBytes := make([]byte, len(rhs)) + copy(tmpBytes, rhs) + r.Data = tmpBytes + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *ClusterMachineConfigSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *RedactedClusterMachineConfigSpec) CloneVT() *RedactedClusterMachineConfigSpec { + if m == nil { + return (*RedactedClusterMachineConfigSpec)(nil) + } + r := new(RedactedClusterMachineConfigSpec) + r.Data = m.Data + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *RedactedClusterMachineConfigSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *ClusterMachineIdentitySpec) CloneVT() *ClusterMachineIdentitySpec { + if m == nil { + return (*ClusterMachineIdentitySpec)(nil) + } + r := new(ClusterMachineIdentitySpec) + r.NodeIdentity = m.NodeIdentity + r.EtcdMemberId = m.EtcdMemberId + r.Nodename = m.Nodename + if rhs := m.NodeIps; rhs != nil { + tmpContainer := make([]string, len(rhs)) + copy(tmpContainer, rhs) + r.NodeIps = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *ClusterMachineIdentitySpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *ClusterMachineTemplateSpec) CloneVT() *ClusterMachineTemplateSpec { + if m == nil { + return (*ClusterMachineTemplateSpec)(nil) + } + r := new(ClusterMachineTemplateSpec) + r.InstallImage = m.InstallImage + r.KubernetesVersion = m.KubernetesVersion + r.InstallDisk = m.InstallDisk + r.Patch = m.Patch + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *ClusterMachineTemplateSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *ClusterMachineStatusSpec) CloneVT() *ClusterMachineStatusSpec { + if m == nil { + return (*ClusterMachineStatusSpec)(nil) + } + r := new(ClusterMachineStatusSpec) + r.Ready = m.Ready + r.Stage = m.Stage + r.ApidAvailable = m.ApidAvailable + r.ConfigUpToDate = m.ConfigUpToDate + r.LastConfigError = m.LastConfigError + r.ManagementAddress = m.ManagementAddress + r.ConfigApplyStatus = m.ConfigApplyStatus + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *ClusterMachineStatusSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *Machines) CloneVT() *Machines { + if m == nil { + return (*Machines)(nil) + } + r := new(Machines) + r.Total = m.Total + r.Healthy = m.Healthy + r.Connected = m.Connected + r.Requested = m.Requested + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *Machines) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *ClusterStatusSpec) CloneVT() *ClusterStatusSpec { + if m == nil { + return (*ClusterStatusSpec)(nil) + } + r := new(ClusterStatusSpec) + r.Available = m.Available + r.Machines = m.Machines.CloneVT() + r.Phase = m.Phase + r.Ready = m.Ready + r.KubernetesAPIReady = m.KubernetesAPIReady + r.ControlplaneReady = m.ControlplaneReady + r.HasConnectedControlPlanes = m.HasConnectedControlPlanes + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *ClusterStatusSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *ClusterUUID) CloneVT() *ClusterUUID { + if m == nil { + return (*ClusterUUID)(nil) + } + r := new(ClusterUUID) + r.Uuid = m.Uuid + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *ClusterUUID) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *ClusterConfigVersionSpec) CloneVT() *ClusterConfigVersionSpec { + if m == nil { + return (*ClusterConfigVersionSpec)(nil) + } + r := new(ClusterConfigVersionSpec) + r.Version = m.Version + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *ClusterConfigVersionSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *ClusterMachineConfigStatusSpec) CloneVT() *ClusterMachineConfigStatusSpec { + if m == nil { + return (*ClusterMachineConfigStatusSpec)(nil) + } + r := new(ClusterMachineConfigStatusSpec) + r.ClusterMachineConfigVersion = m.ClusterMachineConfigVersion + r.ClusterMachineVersion = m.ClusterMachineVersion + r.ClusterMachineConfigSha256 = m.ClusterMachineConfigSha256 + r.LastConfigError = m.LastConfigError + r.TalosVersion = m.TalosVersion + r.SchematicId = m.SchematicId + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *ClusterMachineConfigStatusSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *ClusterBootstrapStatusSpec) CloneVT() *ClusterBootstrapStatusSpec { + if m == nil { + return (*ClusterBootstrapStatusSpec)(nil) + } + r := new(ClusterBootstrapStatusSpec) + r.Bootstrapped = m.Bootstrapped + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *ClusterBootstrapStatusSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *ClusterSecretsSpec) CloneVT() *ClusterSecretsSpec { + if m == nil { + return (*ClusterSecretsSpec)(nil) + } + r := new(ClusterSecretsSpec) + if rhs := m.Data; rhs != nil { + tmpBytes := make([]byte, len(rhs)) + copy(tmpBytes, rhs) + r.Data = tmpBytes + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *ClusterSecretsSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *LoadBalancerConfigSpec) CloneVT() *LoadBalancerConfigSpec { + if m == nil { + return (*LoadBalancerConfigSpec)(nil) + } + r := new(LoadBalancerConfigSpec) + r.BindPort = m.BindPort + r.SiderolinkEndpoint = m.SiderolinkEndpoint + if rhs := m.Endpoints; rhs != nil { + tmpContainer := make([]string, len(rhs)) + copy(tmpContainer, rhs) + r.Endpoints = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *LoadBalancerConfigSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *LoadBalancerStatusSpec) CloneVT() *LoadBalancerStatusSpec { + if m == nil { + return (*LoadBalancerStatusSpec)(nil) + } + r := new(LoadBalancerStatusSpec) + r.Healthy = m.Healthy + r.Stopped = m.Stopped + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *LoadBalancerStatusSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *KubernetesVersionSpec) CloneVT() *KubernetesVersionSpec { + if m == nil { + return (*KubernetesVersionSpec)(nil) + } + r := new(KubernetesVersionSpec) + r.Version = m.Version + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *KubernetesVersionSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *TalosVersionSpec) CloneVT() *TalosVersionSpec { + if m == nil { + return (*TalosVersionSpec)(nil) + } + r := new(TalosVersionSpec) + r.Version = m.Version + if rhs := m.CompatibleKubernetesVersions; rhs != nil { + tmpContainer := make([]string, len(rhs)) + copy(tmpContainer, rhs) + r.CompatibleKubernetesVersions = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *TalosVersionSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *InstallationMediaSpec) CloneVT() *InstallationMediaSpec { + if m == nil { + return (*InstallationMediaSpec)(nil) + } + r := new(InstallationMediaSpec) + r.Name = m.Name + r.Architecture = m.Architecture + r.Profile = m.Profile + r.ContentType = m.ContentType + r.SrcFilePrefix = m.SrcFilePrefix + r.DestFilePrefix = m.DestFilePrefix + r.Extension = m.Extension + r.NoSecureBoot = m.NoSecureBoot + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *InstallationMediaSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *ConfigPatchSpec) CloneVT() *ConfigPatchSpec { + if m == nil { + return (*ConfigPatchSpec)(nil) + } + r := new(ConfigPatchSpec) + r.Data = m.Data + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *ConfigPatchSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *MachineSetSpec_MachineClass) CloneVT() *MachineSetSpec_MachineClass { + if m == nil { + return (*MachineSetSpec_MachineClass)(nil) + } + r := new(MachineSetSpec_MachineClass) + r.Name = m.Name + r.MachineCount = m.MachineCount + r.AllocationType = m.AllocationType + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *MachineSetSpec_MachineClass) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *MachineSetSpec_BootstrapSpec) CloneVT() *MachineSetSpec_BootstrapSpec { + if m == nil { + return (*MachineSetSpec_BootstrapSpec)(nil) + } + r := new(MachineSetSpec_BootstrapSpec) + r.ClusterUuid = m.ClusterUuid + r.Snapshot = m.Snapshot + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *MachineSetSpec_BootstrapSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *MachineSetSpec_RollingUpdateStrategyConfig) CloneVT() *MachineSetSpec_RollingUpdateStrategyConfig { + if m == nil { + return (*MachineSetSpec_RollingUpdateStrategyConfig)(nil) + } + r := new(MachineSetSpec_RollingUpdateStrategyConfig) + r.MaxParallelism = m.MaxParallelism + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *MachineSetSpec_RollingUpdateStrategyConfig) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *MachineSetSpec_UpdateStrategyConfig) CloneVT() *MachineSetSpec_UpdateStrategyConfig { + if m == nil { + return (*MachineSetSpec_UpdateStrategyConfig)(nil) + } + r := new(MachineSetSpec_UpdateStrategyConfig) + r.Rolling = m.Rolling.CloneVT() + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *MachineSetSpec_UpdateStrategyConfig) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *MachineSetSpec) CloneVT() *MachineSetSpec { + if m == nil { + return (*MachineSetSpec)(nil) + } + r := new(MachineSetSpec) + r.UpdateStrategy = m.UpdateStrategy + r.MachineClass = m.MachineClass.CloneVT() + r.BootstrapSpec = m.BootstrapSpec.CloneVT() + r.DeleteStrategy = m.DeleteStrategy + r.UpdateStrategyConfig = m.UpdateStrategyConfig.CloneVT() + r.DeleteStrategyConfig = m.DeleteStrategyConfig.CloneVT() + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *MachineSetSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *TalosUpgradeStatusSpec) CloneVT() *TalosUpgradeStatusSpec { + if m == nil { + return (*TalosUpgradeStatusSpec)(nil) + } + r := new(TalosUpgradeStatusSpec) + r.Phase = m.Phase + r.Error = m.Error + r.Step = m.Step + r.Status = m.Status + r.LastUpgradeVersion = m.LastUpgradeVersion + r.CurrentUpgradeVersion = m.CurrentUpgradeVersion + if rhs := m.UpgradeVersions; rhs != nil { + tmpContainer := make([]string, len(rhs)) + copy(tmpContainer, rhs) + r.UpgradeVersions = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *TalosUpgradeStatusSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *MachineSetStatusSpec) CloneVT() *MachineSetStatusSpec { + if m == nil { + return (*MachineSetStatusSpec)(nil) + } + r := new(MachineSetStatusSpec) + r.Phase = m.Phase + r.Ready = m.Ready + r.Error = m.Error + r.Machines = m.Machines.CloneVT() + r.ConfigHash = m.ConfigHash + r.MachineClass = m.MachineClass.CloneVT() + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *MachineSetStatusSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *MachineSetNodeSpec) CloneVT() *MachineSetNodeSpec { + if m == nil { + return (*MachineSetNodeSpec)(nil) + } + r := new(MachineSetNodeSpec) + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *MachineSetNodeSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *MachineLabelsSpec) CloneVT() *MachineLabelsSpec { + if m == nil { + return (*MachineLabelsSpec)(nil) + } + r := new(MachineLabelsSpec) + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *MachineLabelsSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *MachineStatusSnapshotSpec) CloneVT() *MachineStatusSnapshotSpec { + if m == nil { + return (*MachineStatusSnapshotSpec)(nil) + } + r := new(MachineStatusSnapshotSpec) + if rhs := m.MachineStatus; rhs != nil { + if vtpb, ok := interface{}(rhs).(interface { + CloneVT() *machine.MachineStatusEvent + }); ok { + r.MachineStatus = vtpb.CloneVT() + } else { + r.MachineStatus = proto.Clone(rhs).(*machine.MachineStatusEvent) + } + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *MachineStatusSnapshotSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *ControlPlaneStatusSpec_Condition) CloneVT() *ControlPlaneStatusSpec_Condition { + if m == nil { + return (*ControlPlaneStatusSpec_Condition)(nil) + } + r := new(ControlPlaneStatusSpec_Condition) + r.Type = m.Type + r.Reason = m.Reason + r.Status = m.Status + r.Severity = m.Severity + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *ControlPlaneStatusSpec_Condition) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *ControlPlaneStatusSpec) CloneVT() *ControlPlaneStatusSpec { + if m == nil { + return (*ControlPlaneStatusSpec)(nil) + } + r := new(ControlPlaneStatusSpec) + if rhs := m.Conditions; rhs != nil { + tmpContainer := make([]*ControlPlaneStatusSpec_Condition, len(rhs)) + for k, v := range rhs { + tmpContainer[k] = v.CloneVT() + } + r.Conditions = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *ControlPlaneStatusSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *ClusterEndpointSpec) CloneVT() *ClusterEndpointSpec { + if m == nil { + return (*ClusterEndpointSpec)(nil) + } + r := new(ClusterEndpointSpec) + if rhs := m.ManagementAddresses; rhs != nil { + tmpContainer := make([]string, len(rhs)) + copy(tmpContainer, rhs) + r.ManagementAddresses = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *ClusterEndpointSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *KubernetesStatusSpec_NodeStatus) CloneVT() *KubernetesStatusSpec_NodeStatus { + if m == nil { + return (*KubernetesStatusSpec_NodeStatus)(nil) + } + r := new(KubernetesStatusSpec_NodeStatus) + r.Nodename = m.Nodename + r.KubeletVersion = m.KubeletVersion + r.Ready = m.Ready + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *KubernetesStatusSpec_NodeStatus) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *KubernetesStatusSpec_StaticPodStatus) CloneVT() *KubernetesStatusSpec_StaticPodStatus { + if m == nil { + return (*KubernetesStatusSpec_StaticPodStatus)(nil) + } + r := new(KubernetesStatusSpec_StaticPodStatus) + r.App = m.App + r.Version = m.Version + r.Ready = m.Ready + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *KubernetesStatusSpec_StaticPodStatus) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *KubernetesStatusSpec_NodeStaticPods) CloneVT() *KubernetesStatusSpec_NodeStaticPods { + if m == nil { + return (*KubernetesStatusSpec_NodeStaticPods)(nil) + } + r := new(KubernetesStatusSpec_NodeStaticPods) + r.Nodename = m.Nodename + if rhs := m.StaticPods; rhs != nil { + tmpContainer := make([]*KubernetesStatusSpec_StaticPodStatus, len(rhs)) + for k, v := range rhs { + tmpContainer[k] = v.CloneVT() + } + r.StaticPods = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *KubernetesStatusSpec_NodeStaticPods) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *KubernetesStatusSpec) CloneVT() *KubernetesStatusSpec { + if m == nil { + return (*KubernetesStatusSpec)(nil) + } + r := new(KubernetesStatusSpec) + if rhs := m.Nodes; rhs != nil { + tmpContainer := make([]*KubernetesStatusSpec_NodeStatus, len(rhs)) + for k, v := range rhs { + tmpContainer[k] = v.CloneVT() + } + r.Nodes = tmpContainer + } + if rhs := m.StaticPods; rhs != nil { + tmpContainer := make([]*KubernetesStatusSpec_NodeStaticPods, len(rhs)) + for k, v := range rhs { + tmpContainer[k] = v.CloneVT() + } + r.StaticPods = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *KubernetesStatusSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *KubernetesUpgradeStatusSpec) CloneVT() *KubernetesUpgradeStatusSpec { + if m == nil { + return (*KubernetesUpgradeStatusSpec)(nil) + } + r := new(KubernetesUpgradeStatusSpec) + r.Phase = m.Phase + r.Error = m.Error + r.Step = m.Step + r.Status = m.Status + r.LastUpgradeVersion = m.LastUpgradeVersion + r.CurrentUpgradeVersion = m.CurrentUpgradeVersion + if rhs := m.UpgradeVersions; rhs != nil { + tmpContainer := make([]string, len(rhs)) + copy(tmpContainer, rhs) + r.UpgradeVersions = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *KubernetesUpgradeStatusSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *KubernetesUpgradeManifestStatusSpec) CloneVT() *KubernetesUpgradeManifestStatusSpec { + if m == nil { + return (*KubernetesUpgradeManifestStatusSpec)(nil) + } + r := new(KubernetesUpgradeManifestStatusSpec) + r.OutOfSync = m.OutOfSync + r.LastFatalError = m.LastFatalError + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *KubernetesUpgradeManifestStatusSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *DestroyStatusSpec) CloneVT() *DestroyStatusSpec { + if m == nil { + return (*DestroyStatusSpec)(nil) + } + r := new(DestroyStatusSpec) + r.Phase = m.Phase + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *DestroyStatusSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *OngoingTaskSpec) CloneVT() *OngoingTaskSpec { + if m == nil { + return (*OngoingTaskSpec)(nil) + } + r := new(OngoingTaskSpec) + r.Title = m.Title + if m.Details != nil { + r.Details = m.Details.(interface { + CloneVT() isOngoingTaskSpec_Details + }).CloneVT() + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *OngoingTaskSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *OngoingTaskSpec_TalosUpgrade) CloneVT() isOngoingTaskSpec_Details { + if m == nil { + return (*OngoingTaskSpec_TalosUpgrade)(nil) + } + r := new(OngoingTaskSpec_TalosUpgrade) + r.TalosUpgrade = m.TalosUpgrade.CloneVT() + return r +} + +func (m *OngoingTaskSpec_KubernetesUpgrade) CloneVT() isOngoingTaskSpec_Details { + if m == nil { + return (*OngoingTaskSpec_KubernetesUpgrade)(nil) + } + r := new(OngoingTaskSpec_KubernetesUpgrade) + r.KubernetesUpgrade = m.KubernetesUpgrade.CloneVT() + return r +} + +func (m *OngoingTaskSpec_Destroy) CloneVT() isOngoingTaskSpec_Details { + if m == nil { + return (*OngoingTaskSpec_Destroy)(nil) + } + r := new(OngoingTaskSpec_Destroy) + r.Destroy = m.Destroy.CloneVT() + return r +} + +func (m *ClusterMachineEncryptionKeySpec) CloneVT() *ClusterMachineEncryptionKeySpec { + if m == nil { + return (*ClusterMachineEncryptionKeySpec)(nil) + } + r := new(ClusterMachineEncryptionKeySpec) + if rhs := m.Data; rhs != nil { + tmpBytes := make([]byte, len(rhs)) + copy(tmpBytes, rhs) + r.Data = tmpBytes + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *ClusterMachineEncryptionKeySpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *ExposedServiceSpec) CloneVT() *ExposedServiceSpec { + if m == nil { + return (*ExposedServiceSpec)(nil) + } + r := new(ExposedServiceSpec) + r.Port = m.Port + r.Label = m.Label + r.IconBase64 = m.IconBase64 + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *ExposedServiceSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *FeaturesConfigSpec) CloneVT() *FeaturesConfigSpec { + if m == nil { + return (*FeaturesConfigSpec)(nil) + } + r := new(FeaturesConfigSpec) + r.EnableWorkloadProxying = m.EnableWorkloadProxying + r.EtcdBackupSettings = m.EtcdBackupSettings.CloneVT() + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *FeaturesConfigSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *EtcdBackupSettings) CloneVT() *EtcdBackupSettings { + if m == nil { + return (*EtcdBackupSettings)(nil) + } + r := new(EtcdBackupSettings) + r.TickInterval = (*durationpb.Duration)((*durationpb1.Duration)(m.TickInterval).CloneVT()) + r.MinInterval = (*durationpb.Duration)((*durationpb1.Duration)(m.MinInterval).CloneVT()) + r.MaxInterval = (*durationpb.Duration)((*durationpb1.Duration)(m.MaxInterval).CloneVT()) + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *EtcdBackupSettings) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *MachineClassSpec) CloneVT() *MachineClassSpec { + if m == nil { + return (*MachineClassSpec)(nil) + } + r := new(MachineClassSpec) + if rhs := m.MatchLabels; rhs != nil { + tmpContainer := make([]string, len(rhs)) + copy(tmpContainer, rhs) + r.MatchLabels = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *MachineClassSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *MachineConfigGenOptionsSpec) CloneVT() *MachineConfigGenOptionsSpec { + if m == nil { + return (*MachineConfigGenOptionsSpec)(nil) + } + r := new(MachineConfigGenOptionsSpec) + r.InstallDisk = m.InstallDisk + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *MachineConfigGenOptionsSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *EtcdAuditResultSpec) CloneVT() *EtcdAuditResultSpec { + if m == nil { + return (*EtcdAuditResultSpec)(nil) + } + r := new(EtcdAuditResultSpec) + if rhs := m.EtcdMemberIds; rhs != nil { + tmpContainer := make([]uint64, len(rhs)) + copy(tmpContainer, rhs) + r.EtcdMemberIds = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *EtcdAuditResultSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *KubeconfigSpec) CloneVT() *KubeconfigSpec { + if m == nil { + return (*KubeconfigSpec)(nil) + } + r := new(KubeconfigSpec) + if rhs := m.Data; rhs != nil { + tmpBytes := make([]byte, len(rhs)) + copy(tmpBytes, rhs) + r.Data = tmpBytes + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *KubeconfigSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *KubernetesUsageSpec_Quantity) CloneVT() *KubernetesUsageSpec_Quantity { + if m == nil { + return (*KubernetesUsageSpec_Quantity)(nil) + } + r := new(KubernetesUsageSpec_Quantity) + r.Requests = m.Requests + r.Limits = m.Limits + r.Capacity = m.Capacity + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *KubernetesUsageSpec_Quantity) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *KubernetesUsageSpec_Pod) CloneVT() *KubernetesUsageSpec_Pod { + if m == nil { + return (*KubernetesUsageSpec_Pod)(nil) + } + r := new(KubernetesUsageSpec_Pod) + r.Count = m.Count + r.Capacity = m.Capacity + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *KubernetesUsageSpec_Pod) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *KubernetesUsageSpec) CloneVT() *KubernetesUsageSpec { + if m == nil { + return (*KubernetesUsageSpec)(nil) + } + r := new(KubernetesUsageSpec) + r.Cpu = m.Cpu.CloneVT() + r.Mem = m.Mem.CloneVT() + r.Storage = m.Storage.CloneVT() + r.Pods = m.Pods.CloneVT() + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *KubernetesUsageSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *ImagePullRequestSpec_NodeImageList) CloneVT() *ImagePullRequestSpec_NodeImageList { + if m == nil { + return (*ImagePullRequestSpec_NodeImageList)(nil) + } + r := new(ImagePullRequestSpec_NodeImageList) + r.Node = m.Node + if rhs := m.Images; rhs != nil { + tmpContainer := make([]string, len(rhs)) + copy(tmpContainer, rhs) + r.Images = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *ImagePullRequestSpec_NodeImageList) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *ImagePullRequestSpec) CloneVT() *ImagePullRequestSpec { + if m == nil { + return (*ImagePullRequestSpec)(nil) + } + r := new(ImagePullRequestSpec) + if rhs := m.NodeImageList; rhs != nil { + tmpContainer := make([]*ImagePullRequestSpec_NodeImageList, len(rhs)) + for k, v := range rhs { + tmpContainer[k] = v.CloneVT() + } + r.NodeImageList = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *ImagePullRequestSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *ImagePullStatusSpec) CloneVT() *ImagePullStatusSpec { + if m == nil { + return (*ImagePullStatusSpec)(nil) + } + r := new(ImagePullStatusSpec) + r.LastProcessedNode = m.LastProcessedNode + r.LastProcessedImage = m.LastProcessedImage + r.LastProcessedError = m.LastProcessedError + r.ProcessedCount = m.ProcessedCount + r.TotalCount = m.TotalCount + r.RequestVersion = m.RequestVersion + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *ImagePullStatusSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *SchematicSpec) CloneVT() *SchematicSpec { + if m == nil { + return (*SchematicSpec)(nil) + } + r := new(SchematicSpec) + if rhs := m.Extensions; rhs != nil { + tmpContainer := make([]string, len(rhs)) + copy(tmpContainer, rhs) + r.Extensions = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *SchematicSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *TalosExtensionsSpec_Info) CloneVT() *TalosExtensionsSpec_Info { + if m == nil { + return (*TalosExtensionsSpec_Info)(nil) + } + r := new(TalosExtensionsSpec_Info) + r.Name = m.Name + r.Author = m.Author + r.Version = m.Version + r.Description = m.Description + r.Ref = m.Ref + r.Digest = m.Digest + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *TalosExtensionsSpec_Info) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *TalosExtensionsSpec) CloneVT() *TalosExtensionsSpec { + if m == nil { + return (*TalosExtensionsSpec)(nil) + } + r := new(TalosExtensionsSpec) + if rhs := m.Items; rhs != nil { + tmpContainer := make([]*TalosExtensionsSpec_Info, len(rhs)) + for k, v := range rhs { + tmpContainer[k] = v.CloneVT() + } + r.Items = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *TalosExtensionsSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *SchematicConfigurationSpec) CloneVT() *SchematicConfigurationSpec { + if m == nil { + return (*SchematicConfigurationSpec)(nil) + } + r := new(SchematicConfigurationSpec) + r.SchematicId = m.SchematicId + r.Target = m.Target + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *SchematicConfigurationSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (this *MachineSpec) EqualVT(that *MachineSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.ManagementAddress != that.ManagementAddress { + return false + } + if this.Connected != that.Connected { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *MachineSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*MachineSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *MachineStatusSpec_HardwareStatus_Processor) EqualVT(that *MachineStatusSpec_HardwareStatus_Processor) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.CoreCount != that.CoreCount { + return false + } + if this.ThreadCount != that.ThreadCount { + return false + } + if this.Frequency != that.Frequency { + return false + } + if this.Description != that.Description { + return false + } + if this.Manufacturer != that.Manufacturer { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *MachineStatusSpec_HardwareStatus_Processor) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*MachineStatusSpec_HardwareStatus_Processor) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *MachineStatusSpec_HardwareStatus_MemoryModule) EqualVT(that *MachineStatusSpec_HardwareStatus_MemoryModule) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.SizeMb != that.SizeMb { + return false + } + if this.Description != that.Description { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *MachineStatusSpec_HardwareStatus_MemoryModule) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*MachineStatusSpec_HardwareStatus_MemoryModule) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *MachineStatusSpec_HardwareStatus_BlockDevice) EqualVT(that *MachineStatusSpec_HardwareStatus_BlockDevice) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Size != that.Size { + return false + } + if this.Model != that.Model { + return false + } + if this.LinuxName != that.LinuxName { + return false + } + if this.Name != that.Name { + return false + } + if this.Serial != that.Serial { + return false + } + if this.Uuid != that.Uuid { + return false + } + if this.Wwid != that.Wwid { + return false + } + if this.Type != that.Type { + return false + } + if this.BusPath != that.BusPath { + return false + } + if this.SystemDisk != that.SystemDisk { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *MachineStatusSpec_HardwareStatus_BlockDevice) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*MachineStatusSpec_HardwareStatus_BlockDevice) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *MachineStatusSpec_HardwareStatus) EqualVT(that *MachineStatusSpec_HardwareStatus) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if len(this.Processors) != len(that.Processors) { + return false + } + for i, vx := range this.Processors { + vy := that.Processors[i] + if p, q := vx, vy; p != q { + if p == nil { + p = &MachineStatusSpec_HardwareStatus_Processor{} + } + if q == nil { + q = &MachineStatusSpec_HardwareStatus_Processor{} + } + if !p.EqualVT(q) { + return false + } + } + } + if len(this.MemoryModules) != len(that.MemoryModules) { + return false + } + for i, vx := range this.MemoryModules { + vy := that.MemoryModules[i] + if p, q := vx, vy; p != q { + if p == nil { + p = &MachineStatusSpec_HardwareStatus_MemoryModule{} + } + if q == nil { + q = &MachineStatusSpec_HardwareStatus_MemoryModule{} + } + if !p.EqualVT(q) { + return false + } + } + } + if len(this.Blockdevices) != len(that.Blockdevices) { + return false + } + for i, vx := range this.Blockdevices { + vy := that.Blockdevices[i] + if p, q := vx, vy; p != q { + if p == nil { + p = &MachineStatusSpec_HardwareStatus_BlockDevice{} + } + if q == nil { + q = &MachineStatusSpec_HardwareStatus_BlockDevice{} + } + if !p.EqualVT(q) { + return false + } + } + } + if this.Arch != that.Arch { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *MachineStatusSpec_HardwareStatus) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*MachineStatusSpec_HardwareStatus) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *MachineStatusSpec_NetworkStatus_NetworkLinkStatus) EqualVT(that *MachineStatusSpec_NetworkStatus_NetworkLinkStatus) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.LinuxName != that.LinuxName { + return false + } + if this.HardwareAddress != that.HardwareAddress { + return false + } + if this.SpeedMbps != that.SpeedMbps { + return false + } + if this.LinkUp != that.LinkUp { + return false + } + if this.Description != that.Description { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *MachineStatusSpec_NetworkStatus_NetworkLinkStatus) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*MachineStatusSpec_NetworkStatus_NetworkLinkStatus) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *MachineStatusSpec_NetworkStatus) EqualVT(that *MachineStatusSpec_NetworkStatus) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Hostname != that.Hostname { + return false + } + if this.Domainname != that.Domainname { + return false + } + if len(this.Addresses) != len(that.Addresses) { + return false + } + for i, vx := range this.Addresses { + vy := that.Addresses[i] + if vx != vy { + return false + } + } + if len(this.DefaultGateways) != len(that.DefaultGateways) { + return false + } + for i, vx := range this.DefaultGateways { + vy := that.DefaultGateways[i] + if vx != vy { + return false + } + } + if len(this.NetworkLinks) != len(that.NetworkLinks) { + return false + } + for i, vx := range this.NetworkLinks { + vy := that.NetworkLinks[i] + if p, q := vx, vy; p != q { + if p == nil { + p = &MachineStatusSpec_NetworkStatus_NetworkLinkStatus{} + } + if q == nil { + q = &MachineStatusSpec_NetworkStatus_NetworkLinkStatus{} + } + if !p.EqualVT(q) { + return false + } + } + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *MachineStatusSpec_NetworkStatus) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*MachineStatusSpec_NetworkStatus) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *MachineStatusSpec_PlatformMetadata) EqualVT(that *MachineStatusSpec_PlatformMetadata) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Platform != that.Platform { + return false + } + if this.Hostname != that.Hostname { + return false + } + if this.Region != that.Region { + return false + } + if this.Zone != that.Zone { + return false + } + if this.InstanceType != that.InstanceType { + return false + } + if this.InstanceId != that.InstanceId { + return false + } + if this.ProviderId != that.ProviderId { + return false + } + if this.Spot != that.Spot { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *MachineStatusSpec_PlatformMetadata) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*MachineStatusSpec_PlatformMetadata) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *MachineStatusSpec_Schematic) EqualVT(that *MachineStatusSpec_Schematic) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Id != that.Id { + return false + } + if this.Invalid != that.Invalid { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *MachineStatusSpec_Schematic) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*MachineStatusSpec_Schematic) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *MachineStatusSpec) EqualVT(that *MachineStatusSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.TalosVersion != that.TalosVersion { + return false + } + if !this.Hardware.EqualVT(that.Hardware) { + return false + } + if !this.Network.EqualVT(that.Network) { + return false + } + if this.LastError != that.LastError { + return false + } + if this.ManagementAddress != that.ManagementAddress { + return false + } + if this.Connected != that.Connected { + return false + } + if this.Maintenance != that.Maintenance { + return false + } + if this.Cluster != that.Cluster { + return false + } + if this.Role != that.Role { + return false + } + if !this.PlatformMetadata.EqualVT(that.PlatformMetadata) { + return false + } + if len(this.ImageLabels) != len(that.ImageLabels) { + return false + } + for i, vx := range this.ImageLabels { + vy, ok := that.ImageLabels[i] + if !ok { + return false + } + if vx != vy { + return false + } + } + if !this.Schematic.EqualVT(that.Schematic) { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *MachineStatusSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*MachineStatusSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *TalosConfigSpec) EqualVT(that *TalosConfigSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Ca != that.Ca { + return false + } + if this.Crt != that.Crt { + return false + } + if this.Key != that.Key { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *TalosConfigSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*TalosConfigSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *ClusterSpec_Features) EqualVT(that *ClusterSpec_Features) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.EnableWorkloadProxy != that.EnableWorkloadProxy { + return false + } + if this.DiskEncryption != that.DiskEncryption { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *ClusterSpec_Features) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*ClusterSpec_Features) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *ClusterSpec) EqualVT(that *ClusterSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.InstallImage != that.InstallImage { + return false + } + if this.KubernetesVersion != that.KubernetesVersion { + return false + } + if this.TalosVersion != that.TalosVersion { + return false + } + if !this.Features.EqualVT(that.Features) { + return false + } + if !this.BackupConfiguration.EqualVT(that.BackupConfiguration) { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *ClusterSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*ClusterSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *EtcdBackupConf) EqualVT(that *EtcdBackupConf) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if !(*durationpb1.Duration)(this.Interval).EqualVT((*durationpb1.Duration)(that.Interval)) { + return false + } + if this.Enabled != that.Enabled { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *EtcdBackupConf) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*EtcdBackupConf) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *EtcdBackupEncryptionSpec) EqualVT(that *EtcdBackupEncryptionSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if string(this.EncryptionKey) != string(that.EncryptionKey) { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *EtcdBackupEncryptionSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*EtcdBackupEncryptionSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *EtcdBackupHeader) EqualVT(that *EtcdBackupHeader) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Version != that.Version { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *EtcdBackupHeader) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*EtcdBackupHeader) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *EtcdBackupSpec) EqualVT(that *EtcdBackupSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if !(*timestamppb1.Timestamp)(this.CreatedAt).EqualVT((*timestamppb1.Timestamp)(that.CreatedAt)) { + return false + } + if this.Snapshot != that.Snapshot { + return false + } + if this.Size != that.Size { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *EtcdBackupSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*EtcdBackupSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *BackupDataSpec) EqualVT(that *BackupDataSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if !(*durationpb1.Duration)(this.Interval).EqualVT((*durationpb1.Duration)(that.Interval)) { + return false + } + if this.ClusterUuid != that.ClusterUuid { + return false + } + if string(this.EncryptionKey) != string(that.EncryptionKey) { + return false + } + if this.AesCbcEncryptionSecret != that.AesCbcEncryptionSecret { + return false + } + if this.SecretboxEncryptionSecret != that.SecretboxEncryptionSecret { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *BackupDataSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*BackupDataSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *EtcdBackupS3ConfSpec) EqualVT(that *EtcdBackupS3ConfSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Bucket != that.Bucket { + return false + } + if this.Region != that.Region { + return false + } + if this.Endpoint != that.Endpoint { + return false + } + if this.AccessKeyId != that.AccessKeyId { + return false + } + if this.SecretAccessKey != that.SecretAccessKey { + return false + } + if this.SessionToken != that.SessionToken { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *EtcdBackupS3ConfSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*EtcdBackupS3ConfSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *EtcdBackupStatusSpec) EqualVT(that *EtcdBackupStatusSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Status != that.Status { + return false + } + if this.Error != that.Error { + return false + } + if !(*timestamppb1.Timestamp)(this.LastBackupTime).EqualVT((*timestamppb1.Timestamp)(that.LastBackupTime)) { + return false + } + if !(*timestamppb1.Timestamp)(this.LastBackupAttempt).EqualVT((*timestamppb1.Timestamp)(that.LastBackupAttempt)) { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *EtcdBackupStatusSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*EtcdBackupStatusSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *EtcdManualBackupSpec) EqualVT(that *EtcdManualBackupSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if !(*timestamppb1.Timestamp)(this.BackupAt).EqualVT((*timestamppb1.Timestamp)(that.BackupAt)) { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *EtcdManualBackupSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*EtcdManualBackupSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *EtcdBackupStoreStatusSpec) EqualVT(that *EtcdBackupStoreStatusSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.ConfigurationName != that.ConfigurationName { + return false + } + if this.ConfigurationError != that.ConfigurationError { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *EtcdBackupStoreStatusSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*EtcdBackupStoreStatusSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *EtcdBackupOverallStatusSpec) EqualVT(that *EtcdBackupOverallStatusSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.ConfigurationName != that.ConfigurationName { + return false + } + if this.ConfigurationError != that.ConfigurationError { + return false + } + if !this.LastBackupStatus.EqualVT(that.LastBackupStatus) { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *EtcdBackupOverallStatusSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*EtcdBackupOverallStatusSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *ClusterMachineSpec) EqualVT(that *ClusterMachineSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.KubernetesVersion != that.KubernetesVersion { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *ClusterMachineSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*ClusterMachineSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *ClusterMachineConfigPatchesSpec) EqualVT(that *ClusterMachineConfigPatchesSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if len(this.Patches) != len(that.Patches) { + return false + } + for i, vx := range this.Patches { + vy := that.Patches[i] + if vx != vy { + return false + } + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *ClusterMachineConfigPatchesSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*ClusterMachineConfigPatchesSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *ClusterMachineTalosVersionSpec) EqualVT(that *ClusterMachineTalosVersionSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.TalosVersion != that.TalosVersion { + return false + } + if this.SchematicId != that.SchematicId { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *ClusterMachineTalosVersionSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*ClusterMachineTalosVersionSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *ClusterMachineConfigSpec) EqualVT(that *ClusterMachineConfigSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if string(this.Data) != string(that.Data) { + return false + } + if this.ClusterMachineVersion != that.ClusterMachineVersion { + return false + } + if this.GenerationError != that.GenerationError { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *ClusterMachineConfigSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*ClusterMachineConfigSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *RedactedClusterMachineConfigSpec) EqualVT(that *RedactedClusterMachineConfigSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Data != that.Data { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *RedactedClusterMachineConfigSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*RedactedClusterMachineConfigSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *ClusterMachineIdentitySpec) EqualVT(that *ClusterMachineIdentitySpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.NodeIdentity != that.NodeIdentity { + return false + } + if this.EtcdMemberId != that.EtcdMemberId { + return false + } + if this.Nodename != that.Nodename { + return false + } + if len(this.NodeIps) != len(that.NodeIps) { + return false + } + for i, vx := range this.NodeIps { + vy := that.NodeIps[i] + if vx != vy { + return false + } + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *ClusterMachineIdentitySpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*ClusterMachineIdentitySpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *ClusterMachineTemplateSpec) EqualVT(that *ClusterMachineTemplateSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.InstallImage != that.InstallImage { + return false + } + if this.KubernetesVersion != that.KubernetesVersion { + return false + } + if this.InstallDisk != that.InstallDisk { + return false + } + if this.Patch != that.Patch { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *ClusterMachineTemplateSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*ClusterMachineTemplateSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *ClusterMachineStatusSpec) EqualVT(that *ClusterMachineStatusSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Ready != that.Ready { + return false + } + if this.Stage != that.Stage { + return false + } + if this.ApidAvailable != that.ApidAvailable { + return false + } + if this.ConfigUpToDate != that.ConfigUpToDate { + return false + } + if this.LastConfigError != that.LastConfigError { + return false + } + if this.ManagementAddress != that.ManagementAddress { + return false + } + if this.ConfigApplyStatus != that.ConfigApplyStatus { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *ClusterMachineStatusSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*ClusterMachineStatusSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *Machines) EqualVT(that *Machines) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Total != that.Total { + return false + } + if this.Healthy != that.Healthy { + return false + } + if this.Connected != that.Connected { + return false + } + if this.Requested != that.Requested { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *Machines) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*Machines) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *ClusterStatusSpec) EqualVT(that *ClusterStatusSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Available != that.Available { + return false + } + if !this.Machines.EqualVT(that.Machines) { + return false + } + if this.Phase != that.Phase { + return false + } + if this.Ready != that.Ready { + return false + } + if this.KubernetesAPIReady != that.KubernetesAPIReady { + return false + } + if this.ControlplaneReady != that.ControlplaneReady { + return false + } + if this.HasConnectedControlPlanes != that.HasConnectedControlPlanes { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *ClusterStatusSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*ClusterStatusSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *ClusterUUID) EqualVT(that *ClusterUUID) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Uuid != that.Uuid { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *ClusterUUID) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*ClusterUUID) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *ClusterConfigVersionSpec) EqualVT(that *ClusterConfigVersionSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Version != that.Version { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *ClusterConfigVersionSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*ClusterConfigVersionSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *ClusterMachineConfigStatusSpec) EqualVT(that *ClusterMachineConfigStatusSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.ClusterMachineConfigVersion != that.ClusterMachineConfigVersion { + return false + } + if this.ClusterMachineVersion != that.ClusterMachineVersion { + return false + } + if this.ClusterMachineConfigSha256 != that.ClusterMachineConfigSha256 { + return false + } + if this.LastConfigError != that.LastConfigError { + return false + } + if this.TalosVersion != that.TalosVersion { + return false + } + if this.SchematicId != that.SchematicId { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *ClusterMachineConfigStatusSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*ClusterMachineConfigStatusSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *ClusterBootstrapStatusSpec) EqualVT(that *ClusterBootstrapStatusSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Bootstrapped != that.Bootstrapped { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *ClusterBootstrapStatusSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*ClusterBootstrapStatusSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *ClusterSecretsSpec) EqualVT(that *ClusterSecretsSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if string(this.Data) != string(that.Data) { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *ClusterSecretsSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*ClusterSecretsSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *LoadBalancerConfigSpec) EqualVT(that *LoadBalancerConfigSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.BindPort != that.BindPort { + return false + } + if len(this.Endpoints) != len(that.Endpoints) { + return false + } + for i, vx := range this.Endpoints { + vy := that.Endpoints[i] + if vx != vy { + return false + } + } + if this.SiderolinkEndpoint != that.SiderolinkEndpoint { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *LoadBalancerConfigSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*LoadBalancerConfigSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *LoadBalancerStatusSpec) EqualVT(that *LoadBalancerStatusSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Healthy != that.Healthy { + return false + } + if this.Stopped != that.Stopped { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *LoadBalancerStatusSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*LoadBalancerStatusSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *KubernetesVersionSpec) EqualVT(that *KubernetesVersionSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Version != that.Version { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *KubernetesVersionSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*KubernetesVersionSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *TalosVersionSpec) EqualVT(that *TalosVersionSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Version != that.Version { + return false + } + if len(this.CompatibleKubernetesVersions) != len(that.CompatibleKubernetesVersions) { + return false + } + for i, vx := range this.CompatibleKubernetesVersions { + vy := that.CompatibleKubernetesVersions[i] + if vx != vy { + return false + } + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *TalosVersionSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*TalosVersionSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *InstallationMediaSpec) EqualVT(that *InstallationMediaSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Name != that.Name { + return false + } + if this.Architecture != that.Architecture { + return false + } + if this.Profile != that.Profile { + return false + } + if this.ContentType != that.ContentType { + return false + } + if this.SrcFilePrefix != that.SrcFilePrefix { + return false + } + if this.DestFilePrefix != that.DestFilePrefix { + return false + } + if this.Extension != that.Extension { + return false + } + if this.NoSecureBoot != that.NoSecureBoot { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *InstallationMediaSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*InstallationMediaSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *ConfigPatchSpec) EqualVT(that *ConfigPatchSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Data != that.Data { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *ConfigPatchSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*ConfigPatchSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *MachineSetSpec_MachineClass) EqualVT(that *MachineSetSpec_MachineClass) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Name != that.Name { + return false + } + if this.MachineCount != that.MachineCount { + return false + } + if this.AllocationType != that.AllocationType { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *MachineSetSpec_MachineClass) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*MachineSetSpec_MachineClass) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *MachineSetSpec_BootstrapSpec) EqualVT(that *MachineSetSpec_BootstrapSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.ClusterUuid != that.ClusterUuid { + return false + } + if this.Snapshot != that.Snapshot { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *MachineSetSpec_BootstrapSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*MachineSetSpec_BootstrapSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *MachineSetSpec_RollingUpdateStrategyConfig) EqualVT(that *MachineSetSpec_RollingUpdateStrategyConfig) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.MaxParallelism != that.MaxParallelism { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *MachineSetSpec_RollingUpdateStrategyConfig) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*MachineSetSpec_RollingUpdateStrategyConfig) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *MachineSetSpec_UpdateStrategyConfig) EqualVT(that *MachineSetSpec_UpdateStrategyConfig) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if !this.Rolling.EqualVT(that.Rolling) { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *MachineSetSpec_UpdateStrategyConfig) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*MachineSetSpec_UpdateStrategyConfig) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *MachineSetSpec) EqualVT(that *MachineSetSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.UpdateStrategy != that.UpdateStrategy { + return false + } + if !this.MachineClass.EqualVT(that.MachineClass) { + return false + } + if !this.BootstrapSpec.EqualVT(that.BootstrapSpec) { + return false + } + if this.DeleteStrategy != that.DeleteStrategy { + return false + } + if !this.UpdateStrategyConfig.EqualVT(that.UpdateStrategyConfig) { + return false + } + if !this.DeleteStrategyConfig.EqualVT(that.DeleteStrategyConfig) { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *MachineSetSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*MachineSetSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *TalosUpgradeStatusSpec) EqualVT(that *TalosUpgradeStatusSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Phase != that.Phase { + return false + } + if this.Error != that.Error { + return false + } + if this.Step != that.Step { + return false + } + if this.Status != that.Status { + return false + } + if this.LastUpgradeVersion != that.LastUpgradeVersion { + return false + } + if this.CurrentUpgradeVersion != that.CurrentUpgradeVersion { + return false + } + if len(this.UpgradeVersions) != len(that.UpgradeVersions) { + return false + } + for i, vx := range this.UpgradeVersions { + vy := that.UpgradeVersions[i] + if vx != vy { + return false + } + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *TalosUpgradeStatusSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*TalosUpgradeStatusSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *MachineSetStatusSpec) EqualVT(that *MachineSetStatusSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Phase != that.Phase { + return false + } + if this.Ready != that.Ready { + return false + } + if this.Error != that.Error { + return false + } + if !this.Machines.EqualVT(that.Machines) { + return false + } + if this.ConfigHash != that.ConfigHash { + return false + } + if !this.MachineClass.EqualVT(that.MachineClass) { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *MachineSetStatusSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*MachineSetStatusSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *MachineSetNodeSpec) EqualVT(that *MachineSetNodeSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *MachineSetNodeSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*MachineSetNodeSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *MachineLabelsSpec) EqualVT(that *MachineLabelsSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *MachineLabelsSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*MachineLabelsSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *MachineStatusSnapshotSpec) EqualVT(that *MachineStatusSnapshotSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if equal, ok := interface{}(this.MachineStatus).(interface { + EqualVT(*machine.MachineStatusEvent) bool + }); ok { + if !equal.EqualVT(that.MachineStatus) { + return false + } + } else if !proto.Equal(this.MachineStatus, that.MachineStatus) { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *MachineStatusSnapshotSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*MachineStatusSnapshotSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *ControlPlaneStatusSpec_Condition) EqualVT(that *ControlPlaneStatusSpec_Condition) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Type != that.Type { + return false + } + if this.Reason != that.Reason { + return false + } + if this.Status != that.Status { + return false + } + if this.Severity != that.Severity { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *ControlPlaneStatusSpec_Condition) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*ControlPlaneStatusSpec_Condition) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *ControlPlaneStatusSpec) EqualVT(that *ControlPlaneStatusSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if len(this.Conditions) != len(that.Conditions) { + return false + } + for i, vx := range this.Conditions { + vy := that.Conditions[i] + if p, q := vx, vy; p != q { + if p == nil { + p = &ControlPlaneStatusSpec_Condition{} + } + if q == nil { + q = &ControlPlaneStatusSpec_Condition{} + } + if !p.EqualVT(q) { + return false + } + } + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *ControlPlaneStatusSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*ControlPlaneStatusSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *ClusterEndpointSpec) EqualVT(that *ClusterEndpointSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if len(this.ManagementAddresses) != len(that.ManagementAddresses) { + return false + } + for i, vx := range this.ManagementAddresses { + vy := that.ManagementAddresses[i] + if vx != vy { + return false + } + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *ClusterEndpointSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*ClusterEndpointSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *KubernetesStatusSpec_NodeStatus) EqualVT(that *KubernetesStatusSpec_NodeStatus) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Nodename != that.Nodename { + return false + } + if this.KubeletVersion != that.KubeletVersion { + return false + } + if this.Ready != that.Ready { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *KubernetesStatusSpec_NodeStatus) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*KubernetesStatusSpec_NodeStatus) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *KubernetesStatusSpec_StaticPodStatus) EqualVT(that *KubernetesStatusSpec_StaticPodStatus) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.App != that.App { + return false + } + if this.Version != that.Version { + return false + } + if this.Ready != that.Ready { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *KubernetesStatusSpec_StaticPodStatus) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*KubernetesStatusSpec_StaticPodStatus) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *KubernetesStatusSpec_NodeStaticPods) EqualVT(that *KubernetesStatusSpec_NodeStaticPods) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Nodename != that.Nodename { + return false + } + if len(this.StaticPods) != len(that.StaticPods) { + return false + } + for i, vx := range this.StaticPods { + vy := that.StaticPods[i] + if p, q := vx, vy; p != q { + if p == nil { + p = &KubernetesStatusSpec_StaticPodStatus{} + } + if q == nil { + q = &KubernetesStatusSpec_StaticPodStatus{} + } + if !p.EqualVT(q) { + return false + } + } + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *KubernetesStatusSpec_NodeStaticPods) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*KubernetesStatusSpec_NodeStaticPods) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *KubernetesStatusSpec) EqualVT(that *KubernetesStatusSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if len(this.Nodes) != len(that.Nodes) { + return false + } + for i, vx := range this.Nodes { + vy := that.Nodes[i] + if p, q := vx, vy; p != q { + if p == nil { + p = &KubernetesStatusSpec_NodeStatus{} + } + if q == nil { + q = &KubernetesStatusSpec_NodeStatus{} + } + if !p.EqualVT(q) { + return false + } + } + } + if len(this.StaticPods) != len(that.StaticPods) { + return false + } + for i, vx := range this.StaticPods { + vy := that.StaticPods[i] + if p, q := vx, vy; p != q { + if p == nil { + p = &KubernetesStatusSpec_NodeStaticPods{} + } + if q == nil { + q = &KubernetesStatusSpec_NodeStaticPods{} + } + if !p.EqualVT(q) { + return false + } + } + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *KubernetesStatusSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*KubernetesStatusSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *KubernetesUpgradeStatusSpec) EqualVT(that *KubernetesUpgradeStatusSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Phase != that.Phase { + return false + } + if this.Error != that.Error { + return false + } + if this.Step != that.Step { + return false + } + if this.Status != that.Status { + return false + } + if this.LastUpgradeVersion != that.LastUpgradeVersion { + return false + } + if len(this.UpgradeVersions) != len(that.UpgradeVersions) { + return false + } + for i, vx := range this.UpgradeVersions { + vy := that.UpgradeVersions[i] + if vx != vy { + return false + } + } + if this.CurrentUpgradeVersion != that.CurrentUpgradeVersion { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *KubernetesUpgradeStatusSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*KubernetesUpgradeStatusSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *KubernetesUpgradeManifestStatusSpec) EqualVT(that *KubernetesUpgradeManifestStatusSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.OutOfSync != that.OutOfSync { + return false + } + if this.LastFatalError != that.LastFatalError { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *KubernetesUpgradeManifestStatusSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*KubernetesUpgradeManifestStatusSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *DestroyStatusSpec) EqualVT(that *DestroyStatusSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Phase != that.Phase { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *DestroyStatusSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*DestroyStatusSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *OngoingTaskSpec) EqualVT(that *OngoingTaskSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Details == nil && that.Details != nil { + return false + } else if this.Details != nil { + if that.Details == nil { + return false + } + if !this.Details.(interface { + EqualVT(isOngoingTaskSpec_Details) bool + }).EqualVT(that.Details) { + return false + } + } + if this.Title != that.Title { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *OngoingTaskSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*OngoingTaskSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *OngoingTaskSpec_TalosUpgrade) EqualVT(thatIface isOngoingTaskSpec_Details) bool { + that, ok := thatIface.(*OngoingTaskSpec_TalosUpgrade) + if !ok { + return false + } + if this == that { + return true + } + if this == nil && that != nil || this != nil && that == nil { + return false + } + if p, q := this.TalosUpgrade, that.TalosUpgrade; p != q { + if p == nil { + p = &TalosUpgradeStatusSpec{} + } + if q == nil { + q = &TalosUpgradeStatusSpec{} + } + if !p.EqualVT(q) { + return false + } + } + return true +} + +func (this *OngoingTaskSpec_KubernetesUpgrade) EqualVT(thatIface isOngoingTaskSpec_Details) bool { + that, ok := thatIface.(*OngoingTaskSpec_KubernetesUpgrade) + if !ok { + return false + } + if this == that { + return true + } + if this == nil && that != nil || this != nil && that == nil { + return false + } + if p, q := this.KubernetesUpgrade, that.KubernetesUpgrade; p != q { + if p == nil { + p = &KubernetesUpgradeStatusSpec{} + } + if q == nil { + q = &KubernetesUpgradeStatusSpec{} + } + if !p.EqualVT(q) { + return false + } + } + return true +} + +func (this *OngoingTaskSpec_Destroy) EqualVT(thatIface isOngoingTaskSpec_Details) bool { + that, ok := thatIface.(*OngoingTaskSpec_Destroy) + if !ok { + return false + } + if this == that { + return true + } + if this == nil && that != nil || this != nil && that == nil { + return false + } + if p, q := this.Destroy, that.Destroy; p != q { + if p == nil { + p = &DestroyStatusSpec{} + } + if q == nil { + q = &DestroyStatusSpec{} + } + if !p.EqualVT(q) { + return false + } + } + return true +} + +func (this *ClusterMachineEncryptionKeySpec) EqualVT(that *ClusterMachineEncryptionKeySpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if string(this.Data) != string(that.Data) { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *ClusterMachineEncryptionKeySpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*ClusterMachineEncryptionKeySpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *ExposedServiceSpec) EqualVT(that *ExposedServiceSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Port != that.Port { + return false + } + if this.Label != that.Label { + return false + } + if this.IconBase64 != that.IconBase64 { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *ExposedServiceSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*ExposedServiceSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *FeaturesConfigSpec) EqualVT(that *FeaturesConfigSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.EnableWorkloadProxying != that.EnableWorkloadProxying { + return false + } + if !this.EtcdBackupSettings.EqualVT(that.EtcdBackupSettings) { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *FeaturesConfigSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*FeaturesConfigSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *EtcdBackupSettings) EqualVT(that *EtcdBackupSettings) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if !(*durationpb1.Duration)(this.TickInterval).EqualVT((*durationpb1.Duration)(that.TickInterval)) { + return false + } + if !(*durationpb1.Duration)(this.MinInterval).EqualVT((*durationpb1.Duration)(that.MinInterval)) { + return false + } + if !(*durationpb1.Duration)(this.MaxInterval).EqualVT((*durationpb1.Duration)(that.MaxInterval)) { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *EtcdBackupSettings) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*EtcdBackupSettings) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *MachineClassSpec) EqualVT(that *MachineClassSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if len(this.MatchLabels) != len(that.MatchLabels) { + return false + } + for i, vx := range this.MatchLabels { + vy := that.MatchLabels[i] + if vx != vy { + return false + } + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *MachineClassSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*MachineClassSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *MachineConfigGenOptionsSpec) EqualVT(that *MachineConfigGenOptionsSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.InstallDisk != that.InstallDisk { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *MachineConfigGenOptionsSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*MachineConfigGenOptionsSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *EtcdAuditResultSpec) EqualVT(that *EtcdAuditResultSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if len(this.EtcdMemberIds) != len(that.EtcdMemberIds) { + return false + } + for i, vx := range this.EtcdMemberIds { + vy := that.EtcdMemberIds[i] + if vx != vy { + return false + } + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *EtcdAuditResultSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*EtcdAuditResultSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *KubeconfigSpec) EqualVT(that *KubeconfigSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if string(this.Data) != string(that.Data) { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *KubeconfigSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*KubeconfigSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *KubernetesUsageSpec_Quantity) EqualVT(that *KubernetesUsageSpec_Quantity) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Requests != that.Requests { + return false + } + if this.Limits != that.Limits { + return false + } + if this.Capacity != that.Capacity { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *KubernetesUsageSpec_Quantity) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*KubernetesUsageSpec_Quantity) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *KubernetesUsageSpec_Pod) EqualVT(that *KubernetesUsageSpec_Pod) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Count != that.Count { + return false + } + if this.Capacity != that.Capacity { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *KubernetesUsageSpec_Pod) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*KubernetesUsageSpec_Pod) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *KubernetesUsageSpec) EqualVT(that *KubernetesUsageSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if !this.Cpu.EqualVT(that.Cpu) { + return false + } + if !this.Mem.EqualVT(that.Mem) { + return false + } + if !this.Storage.EqualVT(that.Storage) { + return false + } + if !this.Pods.EqualVT(that.Pods) { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *KubernetesUsageSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*KubernetesUsageSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *ImagePullRequestSpec_NodeImageList) EqualVT(that *ImagePullRequestSpec_NodeImageList) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Node != that.Node { + return false + } + if len(this.Images) != len(that.Images) { + return false + } + for i, vx := range this.Images { + vy := that.Images[i] + if vx != vy { + return false + } + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *ImagePullRequestSpec_NodeImageList) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*ImagePullRequestSpec_NodeImageList) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *ImagePullRequestSpec) EqualVT(that *ImagePullRequestSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if len(this.NodeImageList) != len(that.NodeImageList) { + return false + } + for i, vx := range this.NodeImageList { + vy := that.NodeImageList[i] + if p, q := vx, vy; p != q { + if p == nil { + p = &ImagePullRequestSpec_NodeImageList{} + } + if q == nil { + q = &ImagePullRequestSpec_NodeImageList{} + } + if !p.EqualVT(q) { + return false + } + } + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *ImagePullRequestSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*ImagePullRequestSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *ImagePullStatusSpec) EqualVT(that *ImagePullStatusSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.LastProcessedNode != that.LastProcessedNode { + return false + } + if this.LastProcessedImage != that.LastProcessedImage { + return false + } + if this.LastProcessedError != that.LastProcessedError { + return false + } + if this.ProcessedCount != that.ProcessedCount { + return false + } + if this.TotalCount != that.TotalCount { + return false + } + if this.RequestVersion != that.RequestVersion { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *ImagePullStatusSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*ImagePullStatusSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *SchematicSpec) EqualVT(that *SchematicSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if len(this.Extensions) != len(that.Extensions) { + return false + } + for i, vx := range this.Extensions { + vy := that.Extensions[i] + if vx != vy { + return false + } + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *SchematicSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*SchematicSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *TalosExtensionsSpec_Info) EqualVT(that *TalosExtensionsSpec_Info) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Name != that.Name { + return false + } + if this.Author != that.Author { + return false + } + if this.Version != that.Version { + return false + } + if this.Description != that.Description { + return false + } + if this.Ref != that.Ref { + return false + } + if this.Digest != that.Digest { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *TalosExtensionsSpec_Info) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*TalosExtensionsSpec_Info) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *TalosExtensionsSpec) EqualVT(that *TalosExtensionsSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if len(this.Items) != len(that.Items) { + return false + } + for i, vx := range this.Items { + vy := that.Items[i] + if p, q := vx, vy; p != q { + if p == nil { + p = &TalosExtensionsSpec_Info{} + } + if q == nil { + q = &TalosExtensionsSpec_Info{} + } + if !p.EqualVT(q) { + return false + } + } + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *TalosExtensionsSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*TalosExtensionsSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *SchematicConfigurationSpec) EqualVT(that *SchematicConfigurationSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.SchematicId != that.SchematicId { + return false + } + if this.Target != that.Target { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *SchematicConfigurationSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*SchematicConfigurationSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (m *MachineSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MachineSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *MachineSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.Connected { + i-- + if m.Connected { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x10 + } + if len(m.ManagementAddress) > 0 { + i -= len(m.ManagementAddress) + copy(dAtA[i:], m.ManagementAddress) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ManagementAddress))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MachineStatusSpec_HardwareStatus_Processor) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MachineStatusSpec_HardwareStatus_Processor) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *MachineStatusSpec_HardwareStatus_Processor) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Manufacturer) > 0 { + i -= len(m.Manufacturer) + copy(dAtA[i:], m.Manufacturer) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Manufacturer))) + i-- + dAtA[i] = 0x2a + } + if len(m.Description) > 0 { + i -= len(m.Description) + copy(dAtA[i:], m.Description) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Description))) + i-- + dAtA[i] = 0x22 + } + if m.Frequency != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Frequency)) + i-- + dAtA[i] = 0x18 + } + if m.ThreadCount != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.ThreadCount)) + i-- + dAtA[i] = 0x10 + } + if m.CoreCount != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.CoreCount)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *MachineStatusSpec_HardwareStatus_MemoryModule) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MachineStatusSpec_HardwareStatus_MemoryModule) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *MachineStatusSpec_HardwareStatus_MemoryModule) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Description) > 0 { + i -= len(m.Description) + copy(dAtA[i:], m.Description) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Description))) + i-- + dAtA[i] = 0x12 + } + if m.SizeMb != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.SizeMb)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *MachineStatusSpec_HardwareStatus_BlockDevice) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MachineStatusSpec_HardwareStatus_BlockDevice) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *MachineStatusSpec_HardwareStatus_BlockDevice) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.SystemDisk { + i-- + if m.SystemDisk { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x58 + } + if len(m.BusPath) > 0 { + i -= len(m.BusPath) + copy(dAtA[i:], m.BusPath) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.BusPath))) + i-- + dAtA[i] = 0x52 + } + if len(m.Type) > 0 { + i -= len(m.Type) + copy(dAtA[i:], m.Type) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Type))) + i-- + dAtA[i] = 0x4a + } + if len(m.Wwid) > 0 { + i -= len(m.Wwid) + copy(dAtA[i:], m.Wwid) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Wwid))) + i-- + dAtA[i] = 0x42 + } + if len(m.Uuid) > 0 { + i -= len(m.Uuid) + copy(dAtA[i:], m.Uuid) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Uuid))) + i-- + dAtA[i] = 0x3a + } + if len(m.Serial) > 0 { + i -= len(m.Serial) + copy(dAtA[i:], m.Serial) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Serial))) + i-- + dAtA[i] = 0x2a + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0x22 + } + if len(m.LinuxName) > 0 { + i -= len(m.LinuxName) + copy(dAtA[i:], m.LinuxName) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.LinuxName))) + i-- + dAtA[i] = 0x1a + } + if len(m.Model) > 0 { + i -= len(m.Model) + copy(dAtA[i:], m.Model) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Model))) + i-- + dAtA[i] = 0x12 + } + if m.Size != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Size)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *MachineStatusSpec_HardwareStatus) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MachineStatusSpec_HardwareStatus) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *MachineStatusSpec_HardwareStatus) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Arch) > 0 { + i -= len(m.Arch) + copy(dAtA[i:], m.Arch) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Arch))) + i-- + dAtA[i] = 0x22 + } + if len(m.Blockdevices) > 0 { + for iNdEx := len(m.Blockdevices) - 1; iNdEx >= 0; iNdEx-- { + size, err := m.Blockdevices[iNdEx].MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x1a + } + } + if len(m.MemoryModules) > 0 { + for iNdEx := len(m.MemoryModules) - 1; iNdEx >= 0; iNdEx-- { + size, err := m.MemoryModules[iNdEx].MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x12 + } + } + if len(m.Processors) > 0 { + for iNdEx := len(m.Processors) - 1; iNdEx >= 0; iNdEx-- { + size, err := m.Processors[iNdEx].MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *MachineStatusSpec_NetworkStatus_NetworkLinkStatus) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MachineStatusSpec_NetworkStatus_NetworkLinkStatus) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *MachineStatusSpec_NetworkStatus_NetworkLinkStatus) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Description) > 0 { + i -= len(m.Description) + copy(dAtA[i:], m.Description) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Description))) + i-- + dAtA[i] = 0x2a + } + if m.LinkUp { + i-- + if m.LinkUp { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x20 + } + if m.SpeedMbps != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.SpeedMbps)) + i-- + dAtA[i] = 0x18 + } + if len(m.HardwareAddress) > 0 { + i -= len(m.HardwareAddress) + copy(dAtA[i:], m.HardwareAddress) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.HardwareAddress))) + i-- + dAtA[i] = 0x12 + } + if len(m.LinuxName) > 0 { + i -= len(m.LinuxName) + copy(dAtA[i:], m.LinuxName) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.LinuxName))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MachineStatusSpec_NetworkStatus) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MachineStatusSpec_NetworkStatus) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *MachineStatusSpec_NetworkStatus) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.NetworkLinks) > 0 { + for iNdEx := len(m.NetworkLinks) - 1; iNdEx >= 0; iNdEx-- { + size, err := m.NetworkLinks[iNdEx].MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x2a + } + } + if len(m.DefaultGateways) > 0 { + for iNdEx := len(m.DefaultGateways) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.DefaultGateways[iNdEx]) + copy(dAtA[i:], m.DefaultGateways[iNdEx]) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.DefaultGateways[iNdEx]))) + i-- + dAtA[i] = 0x22 + } + } + if len(m.Addresses) > 0 { + for iNdEx := len(m.Addresses) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Addresses[iNdEx]) + copy(dAtA[i:], m.Addresses[iNdEx]) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Addresses[iNdEx]))) + i-- + dAtA[i] = 0x1a + } + } + if len(m.Domainname) > 0 { + i -= len(m.Domainname) + copy(dAtA[i:], m.Domainname) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Domainname))) + i-- + dAtA[i] = 0x12 + } + if len(m.Hostname) > 0 { + i -= len(m.Hostname) + copy(dAtA[i:], m.Hostname) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Hostname))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MachineStatusSpec_PlatformMetadata) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MachineStatusSpec_PlatformMetadata) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *MachineStatusSpec_PlatformMetadata) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.Spot { + i-- + if m.Spot { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x40 + } + if len(m.ProviderId) > 0 { + i -= len(m.ProviderId) + copy(dAtA[i:], m.ProviderId) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ProviderId))) + i-- + dAtA[i] = 0x3a + } + if len(m.InstanceId) > 0 { + i -= len(m.InstanceId) + copy(dAtA[i:], m.InstanceId) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.InstanceId))) + i-- + dAtA[i] = 0x32 + } + if len(m.InstanceType) > 0 { + i -= len(m.InstanceType) + copy(dAtA[i:], m.InstanceType) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.InstanceType))) + i-- + dAtA[i] = 0x2a + } + if len(m.Zone) > 0 { + i -= len(m.Zone) + copy(dAtA[i:], m.Zone) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Zone))) + i-- + dAtA[i] = 0x22 + } + if len(m.Region) > 0 { + i -= len(m.Region) + copy(dAtA[i:], m.Region) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Region))) + i-- + dAtA[i] = 0x1a + } + if len(m.Hostname) > 0 { + i -= len(m.Hostname) + copy(dAtA[i:], m.Hostname) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Hostname))) + i-- + dAtA[i] = 0x12 + } + if len(m.Platform) > 0 { + i -= len(m.Platform) + copy(dAtA[i:], m.Platform) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Platform))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MachineStatusSpec_Schematic) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MachineStatusSpec_Schematic) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *MachineStatusSpec_Schematic) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.Invalid { + i-- + if m.Invalid { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x10 + } + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MachineStatusSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MachineStatusSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *MachineStatusSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.Schematic != nil { + size, err := m.Schematic.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x72 + } + if len(m.ImageLabels) > 0 { + for k := range m.ImageLabels { + v := m.ImageLabels[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x6a + } + } + if m.PlatformMetadata != nil { + size, err := m.PlatformMetadata.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x5a + } + if m.Role != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Role)) + i-- + dAtA[i] = 0x50 + } + if len(m.Cluster) > 0 { + i -= len(m.Cluster) + copy(dAtA[i:], m.Cluster) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Cluster))) + i-- + dAtA[i] = 0x4a + } + if m.Maintenance { + i-- + if m.Maintenance { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x38 + } + if m.Connected { + i-- + if m.Connected { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x30 + } + if len(m.ManagementAddress) > 0 { + i -= len(m.ManagementAddress) + copy(dAtA[i:], m.ManagementAddress) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ManagementAddress))) + i-- + dAtA[i] = 0x2a + } + if len(m.LastError) > 0 { + i -= len(m.LastError) + copy(dAtA[i:], m.LastError) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.LastError))) + i-- + dAtA[i] = 0x22 + } + if m.Network != nil { + size, err := m.Network.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x1a + } + if m.Hardware != nil { + size, err := m.Hardware.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x12 + } + if len(m.TalosVersion) > 0 { + i -= len(m.TalosVersion) + copy(dAtA[i:], m.TalosVersion) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.TalosVersion))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *TalosConfigSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TalosConfigSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *TalosConfigSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Key) > 0 { + i -= len(m.Key) + copy(dAtA[i:], m.Key) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Key))) + i-- + dAtA[i] = 0x1a + } + if len(m.Crt) > 0 { + i -= len(m.Crt) + copy(dAtA[i:], m.Crt) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Crt))) + i-- + dAtA[i] = 0x12 + } + if len(m.Ca) > 0 { + i -= len(m.Ca) + copy(dAtA[i:], m.Ca) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Ca))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ClusterSpec_Features) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ClusterSpec_Features) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *ClusterSpec_Features) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.DiskEncryption { + i-- + if m.DiskEncryption { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x10 + } + if m.EnableWorkloadProxy { + i-- + if m.EnableWorkloadProxy { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *ClusterSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ClusterSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *ClusterSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.BackupConfiguration != nil { + size, err := m.BackupConfiguration.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x2a + } + if m.Features != nil { + size, err := m.Features.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x22 + } + if len(m.TalosVersion) > 0 { + i -= len(m.TalosVersion) + copy(dAtA[i:], m.TalosVersion) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.TalosVersion))) + i-- + dAtA[i] = 0x1a + } + if len(m.KubernetesVersion) > 0 { + i -= len(m.KubernetesVersion) + copy(dAtA[i:], m.KubernetesVersion) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.KubernetesVersion))) + i-- + dAtA[i] = 0x12 + } + if len(m.InstallImage) > 0 { + i -= len(m.InstallImage) + copy(dAtA[i:], m.InstallImage) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.InstallImage))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *EtcdBackupConf) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *EtcdBackupConf) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *EtcdBackupConf) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.Enabled { + i-- + if m.Enabled { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x10 + } + if m.Interval != nil { + size, err := (*durationpb1.Duration)(m.Interval).MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *EtcdBackupEncryptionSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *EtcdBackupEncryptionSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *EtcdBackupEncryptionSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.EncryptionKey) > 0 { + i -= len(m.EncryptionKey) + copy(dAtA[i:], m.EncryptionKey) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.EncryptionKey))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *EtcdBackupHeader) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *EtcdBackupHeader) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *EtcdBackupHeader) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.Version != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Version)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *EtcdBackupSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *EtcdBackupSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *EtcdBackupSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.Size != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Size)) + i-- + dAtA[i] = 0x18 + } + if len(m.Snapshot) > 0 { + i -= len(m.Snapshot) + copy(dAtA[i:], m.Snapshot) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Snapshot))) + i-- + dAtA[i] = 0x12 + } + if m.CreatedAt != nil { + size, err := (*timestamppb1.Timestamp)(m.CreatedAt).MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *BackupDataSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *BackupDataSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *BackupDataSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.SecretboxEncryptionSecret) > 0 { + i -= len(m.SecretboxEncryptionSecret) + copy(dAtA[i:], m.SecretboxEncryptionSecret) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.SecretboxEncryptionSecret))) + i-- + dAtA[i] = 0x2a + } + if len(m.AesCbcEncryptionSecret) > 0 { + i -= len(m.AesCbcEncryptionSecret) + copy(dAtA[i:], m.AesCbcEncryptionSecret) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.AesCbcEncryptionSecret))) + i-- + dAtA[i] = 0x22 + } + if len(m.EncryptionKey) > 0 { + i -= len(m.EncryptionKey) + copy(dAtA[i:], m.EncryptionKey) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.EncryptionKey))) + i-- + dAtA[i] = 0x1a + } + if len(m.ClusterUuid) > 0 { + i -= len(m.ClusterUuid) + copy(dAtA[i:], m.ClusterUuid) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterUuid))) + i-- + dAtA[i] = 0x12 + } + if m.Interval != nil { + size, err := (*durationpb1.Duration)(m.Interval).MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *EtcdBackupS3ConfSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *EtcdBackupS3ConfSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *EtcdBackupS3ConfSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.SessionToken) > 0 { + i -= len(m.SessionToken) + copy(dAtA[i:], m.SessionToken) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.SessionToken))) + i-- + dAtA[i] = 0x32 + } + if len(m.SecretAccessKey) > 0 { + i -= len(m.SecretAccessKey) + copy(dAtA[i:], m.SecretAccessKey) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.SecretAccessKey))) + i-- + dAtA[i] = 0x2a + } + if len(m.AccessKeyId) > 0 { + i -= len(m.AccessKeyId) + copy(dAtA[i:], m.AccessKeyId) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.AccessKeyId))) + i-- + dAtA[i] = 0x22 + } + if len(m.Endpoint) > 0 { + i -= len(m.Endpoint) + copy(dAtA[i:], m.Endpoint) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Endpoint))) + i-- + dAtA[i] = 0x1a + } + if len(m.Region) > 0 { + i -= len(m.Region) + copy(dAtA[i:], m.Region) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Region))) + i-- + dAtA[i] = 0x12 + } + if len(m.Bucket) > 0 { + i -= len(m.Bucket) + copy(dAtA[i:], m.Bucket) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Bucket))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *EtcdBackupStatusSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *EtcdBackupStatusSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *EtcdBackupStatusSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.LastBackupAttempt != nil { + size, err := (*timestamppb1.Timestamp)(m.LastBackupAttempt).MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x22 + } + if m.LastBackupTime != nil { + size, err := (*timestamppb1.Timestamp)(m.LastBackupTime).MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x1a + } + if len(m.Error) > 0 { + i -= len(m.Error) + copy(dAtA[i:], m.Error) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Error))) + i-- + dAtA[i] = 0x12 + } + if m.Status != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Status)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *EtcdManualBackupSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *EtcdManualBackupSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *EtcdManualBackupSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.BackupAt != nil { + size, err := (*timestamppb1.Timestamp)(m.BackupAt).MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *EtcdBackupStoreStatusSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *EtcdBackupStoreStatusSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *EtcdBackupStoreStatusSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.ConfigurationError) > 0 { + i -= len(m.ConfigurationError) + copy(dAtA[i:], m.ConfigurationError) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ConfigurationError))) + i-- + dAtA[i] = 0x12 + } + if len(m.ConfigurationName) > 0 { + i -= len(m.ConfigurationName) + copy(dAtA[i:], m.ConfigurationName) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ConfigurationName))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *EtcdBackupOverallStatusSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *EtcdBackupOverallStatusSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *EtcdBackupOverallStatusSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.LastBackupStatus != nil { + size, err := m.LastBackupStatus.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x1a + } + if len(m.ConfigurationError) > 0 { + i -= len(m.ConfigurationError) + copy(dAtA[i:], m.ConfigurationError) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ConfigurationError))) + i-- + dAtA[i] = 0x12 + } + if len(m.ConfigurationName) > 0 { + i -= len(m.ConfigurationName) + copy(dAtA[i:], m.ConfigurationName) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ConfigurationName))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ClusterMachineSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ClusterMachineSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *ClusterMachineSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.KubernetesVersion) > 0 { + i -= len(m.KubernetesVersion) + copy(dAtA[i:], m.KubernetesVersion) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.KubernetesVersion))) + i-- + dAtA[i] = 0x12 + } + return len(dAtA) - i, nil +} + +func (m *ClusterMachineConfigPatchesSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ClusterMachineConfigPatchesSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *ClusterMachineConfigPatchesSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Patches) > 0 { + for iNdEx := len(m.Patches) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Patches[iNdEx]) + copy(dAtA[i:], m.Patches[iNdEx]) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Patches[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *ClusterMachineTalosVersionSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ClusterMachineTalosVersionSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *ClusterMachineTalosVersionSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.SchematicId) > 0 { + i -= len(m.SchematicId) + copy(dAtA[i:], m.SchematicId) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.SchematicId))) + i-- + dAtA[i] = 0x12 + } + if len(m.TalosVersion) > 0 { + i -= len(m.TalosVersion) + copy(dAtA[i:], m.TalosVersion) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.TalosVersion))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ClusterMachineConfigSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ClusterMachineConfigSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *ClusterMachineConfigSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.GenerationError) > 0 { + i -= len(m.GenerationError) + copy(dAtA[i:], m.GenerationError) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.GenerationError))) + i-- + dAtA[i] = 0x1a + } + if len(m.ClusterMachineVersion) > 0 { + i -= len(m.ClusterMachineVersion) + copy(dAtA[i:], m.ClusterMachineVersion) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterMachineVersion))) + i-- + dAtA[i] = 0x12 + } + if len(m.Data) > 0 { + i -= len(m.Data) + copy(dAtA[i:], m.Data) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Data))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *RedactedClusterMachineConfigSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RedactedClusterMachineConfigSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *RedactedClusterMachineConfigSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Data) > 0 { + i -= len(m.Data) + copy(dAtA[i:], m.Data) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Data))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ClusterMachineIdentitySpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ClusterMachineIdentitySpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *ClusterMachineIdentitySpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.NodeIps) > 0 { + for iNdEx := len(m.NodeIps) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.NodeIps[iNdEx]) + copy(dAtA[i:], m.NodeIps[iNdEx]) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.NodeIps[iNdEx]))) + i-- + dAtA[i] = 0x42 + } + } + if len(m.Nodename) > 0 { + i -= len(m.Nodename) + copy(dAtA[i:], m.Nodename) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Nodename))) + i-- + dAtA[i] = 0x1a + } + if m.EtcdMemberId != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.EtcdMemberId)) + i-- + dAtA[i] = 0x10 + } + if len(m.NodeIdentity) > 0 { + i -= len(m.NodeIdentity) + copy(dAtA[i:], m.NodeIdentity) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.NodeIdentity))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ClusterMachineTemplateSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ClusterMachineTemplateSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *ClusterMachineTemplateSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Patch) > 0 { + i -= len(m.Patch) + copy(dAtA[i:], m.Patch) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Patch))) + i-- + dAtA[i] = 0x2a + } + if len(m.InstallDisk) > 0 { + i -= len(m.InstallDisk) + copy(dAtA[i:], m.InstallDisk) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.InstallDisk))) + i-- + dAtA[i] = 0x1a + } + if len(m.KubernetesVersion) > 0 { + i -= len(m.KubernetesVersion) + copy(dAtA[i:], m.KubernetesVersion) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.KubernetesVersion))) + i-- + dAtA[i] = 0x12 + } + if len(m.InstallImage) > 0 { + i -= len(m.InstallImage) + copy(dAtA[i:], m.InstallImage) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.InstallImage))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ClusterMachineStatusSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ClusterMachineStatusSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *ClusterMachineStatusSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.ConfigApplyStatus != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.ConfigApplyStatus)) + i-- + dAtA[i] = 0x38 + } + if len(m.ManagementAddress) > 0 { + i -= len(m.ManagementAddress) + copy(dAtA[i:], m.ManagementAddress) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ManagementAddress))) + i-- + dAtA[i] = 0x32 + } + if len(m.LastConfigError) > 0 { + i -= len(m.LastConfigError) + copy(dAtA[i:], m.LastConfigError) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.LastConfigError))) + i-- + dAtA[i] = 0x2a + } + if m.ConfigUpToDate { + i-- + if m.ConfigUpToDate { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x20 + } + if m.ApidAvailable { + i-- + if m.ApidAvailable { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x18 + } + if m.Stage != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Stage)) + i-- + dAtA[i] = 0x10 + } + if m.Ready { + i-- + if m.Ready { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *Machines) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Machines) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *Machines) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.Requested != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Requested)) + i-- + dAtA[i] = 0x20 + } + if m.Connected != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Connected)) + i-- + dAtA[i] = 0x18 + } + if m.Healthy != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Healthy)) + i-- + dAtA[i] = 0x10 + } + if m.Total != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Total)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *ClusterStatusSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ClusterStatusSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *ClusterStatusSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.HasConnectedControlPlanes { + i-- + if m.HasConnectedControlPlanes { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x38 + } + if m.ControlplaneReady { + i-- + if m.ControlplaneReady { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x30 + } + if m.KubernetesAPIReady { + i-- + if m.KubernetesAPIReady { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x28 + } + if m.Ready { + i-- + if m.Ready { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x20 + } + if m.Phase != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Phase)) + i-- + dAtA[i] = 0x18 + } + if m.Machines != nil { + size, err := m.Machines.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x12 + } + if m.Available { + i-- + if m.Available { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *ClusterUUID) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ClusterUUID) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *ClusterUUID) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Uuid) > 0 { + i -= len(m.Uuid) + copy(dAtA[i:], m.Uuid) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Uuid))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ClusterConfigVersionSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ClusterConfigVersionSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *ClusterConfigVersionSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Version) > 0 { + i -= len(m.Version) + copy(dAtA[i:], m.Version) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Version))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ClusterMachineConfigStatusSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ClusterMachineConfigStatusSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *ClusterMachineConfigStatusSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.SchematicId) > 0 { + i -= len(m.SchematicId) + copy(dAtA[i:], m.SchematicId) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.SchematicId))) + i-- + dAtA[i] = 0x42 + } + if len(m.TalosVersion) > 0 { + i -= len(m.TalosVersion) + copy(dAtA[i:], m.TalosVersion) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.TalosVersion))) + i-- + dAtA[i] = 0x3a + } + if len(m.LastConfigError) > 0 { + i -= len(m.LastConfigError) + copy(dAtA[i:], m.LastConfigError) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.LastConfigError))) + i-- + dAtA[i] = 0x32 + } + if len(m.ClusterMachineConfigSha256) > 0 { + i -= len(m.ClusterMachineConfigSha256) + copy(dAtA[i:], m.ClusterMachineConfigSha256) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterMachineConfigSha256))) + i-- + dAtA[i] = 0x2a + } + if len(m.ClusterMachineVersion) > 0 { + i -= len(m.ClusterMachineVersion) + copy(dAtA[i:], m.ClusterMachineVersion) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterMachineVersion))) + i-- + dAtA[i] = 0x22 + } + if len(m.ClusterMachineConfigVersion) > 0 { + i -= len(m.ClusterMachineConfigVersion) + copy(dAtA[i:], m.ClusterMachineConfigVersion) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterMachineConfigVersion))) + i-- + dAtA[i] = 0x1a + } + return len(dAtA) - i, nil +} + +func (m *ClusterBootstrapStatusSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ClusterBootstrapStatusSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *ClusterBootstrapStatusSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.Bootstrapped { + i-- + if m.Bootstrapped { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *ClusterSecretsSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ClusterSecretsSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *ClusterSecretsSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Data) > 0 { + i -= len(m.Data) + copy(dAtA[i:], m.Data) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Data))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *LoadBalancerConfigSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *LoadBalancerConfigSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *LoadBalancerConfigSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.SiderolinkEndpoint) > 0 { + i -= len(m.SiderolinkEndpoint) + copy(dAtA[i:], m.SiderolinkEndpoint) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.SiderolinkEndpoint))) + i-- + dAtA[i] = 0x22 + } + if len(m.Endpoints) > 0 { + for iNdEx := len(m.Endpoints) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Endpoints[iNdEx]) + copy(dAtA[i:], m.Endpoints[iNdEx]) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Endpoints[iNdEx]))) + i-- + dAtA[i] = 0x1a + } + } + if len(m.BindPort) > 0 { + i -= len(m.BindPort) + copy(dAtA[i:], m.BindPort) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.BindPort))) + i-- + dAtA[i] = 0x12 + } + return len(dAtA) - i, nil +} + +func (m *LoadBalancerStatusSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *LoadBalancerStatusSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *LoadBalancerStatusSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.Stopped { + i-- + if m.Stopped { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x20 + } + if m.Healthy { + i-- + if m.Healthy { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x18 + } + return len(dAtA) - i, nil +} + +func (m *KubernetesVersionSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *KubernetesVersionSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *KubernetesVersionSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Version) > 0 { + i -= len(m.Version) + copy(dAtA[i:], m.Version) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Version))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *TalosVersionSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TalosVersionSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *TalosVersionSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.CompatibleKubernetesVersions) > 0 { + for iNdEx := len(m.CompatibleKubernetesVersions) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.CompatibleKubernetesVersions[iNdEx]) + copy(dAtA[i:], m.CompatibleKubernetesVersions[iNdEx]) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.CompatibleKubernetesVersions[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + if len(m.Version) > 0 { + i -= len(m.Version) + copy(dAtA[i:], m.Version) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Version))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *InstallationMediaSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *InstallationMediaSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *InstallationMediaSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.NoSecureBoot { + i-- + if m.NoSecureBoot { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x58 + } + if len(m.Extension) > 0 { + i -= len(m.Extension) + copy(dAtA[i:], m.Extension) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Extension))) + i-- + dAtA[i] = 0x4a + } + if len(m.DestFilePrefix) > 0 { + i -= len(m.DestFilePrefix) + copy(dAtA[i:], m.DestFilePrefix) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.DestFilePrefix))) + i-- + dAtA[i] = 0x42 + } + if len(m.SrcFilePrefix) > 0 { + i -= len(m.SrcFilePrefix) + copy(dAtA[i:], m.SrcFilePrefix) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.SrcFilePrefix))) + i-- + dAtA[i] = 0x3a + } + if len(m.ContentType) > 0 { + i -= len(m.ContentType) + copy(dAtA[i:], m.ContentType) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ContentType))) + i-- + dAtA[i] = 0x32 + } + if len(m.Profile) > 0 { + i -= len(m.Profile) + copy(dAtA[i:], m.Profile) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Profile))) + i-- + dAtA[i] = 0x1a + } + if len(m.Architecture) > 0 { + i -= len(m.Architecture) + copy(dAtA[i:], m.Architecture) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Architecture))) + i-- + dAtA[i] = 0x12 + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ConfigPatchSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ConfigPatchSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *ConfigPatchSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Data) > 0 { + i -= len(m.Data) + copy(dAtA[i:], m.Data) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Data))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MachineSetSpec_MachineClass) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MachineSetSpec_MachineClass) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *MachineSetSpec_MachineClass) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.AllocationType != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.AllocationType)) + i-- + dAtA[i] = 0x18 + } + if m.MachineCount != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.MachineCount)) + i-- + dAtA[i] = 0x10 + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MachineSetSpec_BootstrapSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MachineSetSpec_BootstrapSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *MachineSetSpec_BootstrapSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Snapshot) > 0 { + i -= len(m.Snapshot) + copy(dAtA[i:], m.Snapshot) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Snapshot))) + i-- + dAtA[i] = 0x12 + } + if len(m.ClusterUuid) > 0 { + i -= len(m.ClusterUuid) + copy(dAtA[i:], m.ClusterUuid) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterUuid))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MachineSetSpec_RollingUpdateStrategyConfig) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MachineSetSpec_RollingUpdateStrategyConfig) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *MachineSetSpec_RollingUpdateStrategyConfig) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.MaxParallelism != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.MaxParallelism)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *MachineSetSpec_UpdateStrategyConfig) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MachineSetSpec_UpdateStrategyConfig) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *MachineSetSpec_UpdateStrategyConfig) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.Rolling != nil { + size, err := m.Rolling.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MachineSetSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MachineSetSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *MachineSetSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.DeleteStrategyConfig != nil { + size, err := m.DeleteStrategyConfig.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x32 + } + if m.UpdateStrategyConfig != nil { + size, err := m.UpdateStrategyConfig.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x2a + } + if m.DeleteStrategy != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.DeleteStrategy)) + i-- + dAtA[i] = 0x20 + } + if m.BootstrapSpec != nil { + size, err := m.BootstrapSpec.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x1a + } + if m.MachineClass != nil { + size, err := m.MachineClass.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x12 + } + if m.UpdateStrategy != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.UpdateStrategy)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *TalosUpgradeStatusSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TalosUpgradeStatusSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *TalosUpgradeStatusSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.UpgradeVersions) > 0 { + for iNdEx := len(m.UpgradeVersions) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.UpgradeVersions[iNdEx]) + copy(dAtA[i:], m.UpgradeVersions[iNdEx]) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.UpgradeVersions[iNdEx]))) + i-- + dAtA[i] = 0x3a + } + } + if len(m.CurrentUpgradeVersion) > 0 { + i -= len(m.CurrentUpgradeVersion) + copy(dAtA[i:], m.CurrentUpgradeVersion) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.CurrentUpgradeVersion))) + i-- + dAtA[i] = 0x32 + } + if len(m.LastUpgradeVersion) > 0 { + i -= len(m.LastUpgradeVersion) + copy(dAtA[i:], m.LastUpgradeVersion) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.LastUpgradeVersion))) + i-- + dAtA[i] = 0x2a + } + if len(m.Status) > 0 { + i -= len(m.Status) + copy(dAtA[i:], m.Status) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Status))) + i-- + dAtA[i] = 0x22 + } + if len(m.Step) > 0 { + i -= len(m.Step) + copy(dAtA[i:], m.Step) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Step))) + i-- + dAtA[i] = 0x1a + } + if len(m.Error) > 0 { + i -= len(m.Error) + copy(dAtA[i:], m.Error) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Error))) + i-- + dAtA[i] = 0x12 + } + if m.Phase != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Phase)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *MachineSetStatusSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MachineSetStatusSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *MachineSetStatusSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.MachineClass != nil { + size, err := m.MachineClass.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x32 + } + if len(m.ConfigHash) > 0 { + i -= len(m.ConfigHash) + copy(dAtA[i:], m.ConfigHash) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ConfigHash))) + i-- + dAtA[i] = 0x2a + } + if m.Machines != nil { + size, err := m.Machines.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x22 + } + if len(m.Error) > 0 { + i -= len(m.Error) + copy(dAtA[i:], m.Error) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Error))) + i-- + dAtA[i] = 0x1a + } + if m.Ready { + i-- + if m.Ready { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x10 + } + if m.Phase != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Phase)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *MachineSetNodeSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MachineSetNodeSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *MachineSetNodeSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + return len(dAtA) - i, nil +} + +func (m *MachineLabelsSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MachineLabelsSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *MachineLabelsSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + return len(dAtA) - i, nil +} + +func (m *MachineStatusSnapshotSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MachineStatusSnapshotSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *MachineStatusSnapshotSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.MachineStatus != nil { + if vtmsg, ok := interface{}(m.MachineStatus).(interface { + MarshalToSizedBufferVT([]byte) (int, error) + }); ok { + size, err := vtmsg.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + } else { + encoded, err := proto.Marshal(m.MachineStatus) + if err != nil { + return 0, err + } + i -= len(encoded) + copy(dAtA[i:], encoded) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(encoded))) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ControlPlaneStatusSpec_Condition) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ControlPlaneStatusSpec_Condition) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *ControlPlaneStatusSpec_Condition) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.Severity != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Severity)) + i-- + dAtA[i] = 0x20 + } + if m.Status != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Status)) + i-- + dAtA[i] = 0x18 + } + if len(m.Reason) > 0 { + i -= len(m.Reason) + copy(dAtA[i:], m.Reason) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Reason))) + i-- + dAtA[i] = 0x12 + } + if m.Type != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Type)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *ControlPlaneStatusSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ControlPlaneStatusSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *ControlPlaneStatusSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Conditions) > 0 { + for iNdEx := len(m.Conditions) - 1; iNdEx >= 0; iNdEx-- { + size, err := m.Conditions[iNdEx].MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *ClusterEndpointSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ClusterEndpointSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *ClusterEndpointSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.ManagementAddresses) > 0 { + for iNdEx := len(m.ManagementAddresses) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.ManagementAddresses[iNdEx]) + copy(dAtA[i:], m.ManagementAddresses[iNdEx]) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ManagementAddresses[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *KubernetesStatusSpec_NodeStatus) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *KubernetesStatusSpec_NodeStatus) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *KubernetesStatusSpec_NodeStatus) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.Ready { + i-- + if m.Ready { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x18 + } + if len(m.KubeletVersion) > 0 { + i -= len(m.KubeletVersion) + copy(dAtA[i:], m.KubeletVersion) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.KubeletVersion))) + i-- + dAtA[i] = 0x12 + } + if len(m.Nodename) > 0 { + i -= len(m.Nodename) + copy(dAtA[i:], m.Nodename) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Nodename))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *KubernetesStatusSpec_StaticPodStatus) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *KubernetesStatusSpec_StaticPodStatus) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *KubernetesStatusSpec_StaticPodStatus) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.Ready { + i-- + if m.Ready { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x18 + } + if len(m.Version) > 0 { + i -= len(m.Version) + copy(dAtA[i:], m.Version) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Version))) + i-- + dAtA[i] = 0x12 + } + if len(m.App) > 0 { + i -= len(m.App) + copy(dAtA[i:], m.App) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.App))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *KubernetesStatusSpec_NodeStaticPods) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *KubernetesStatusSpec_NodeStaticPods) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *KubernetesStatusSpec_NodeStaticPods) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.StaticPods) > 0 { + for iNdEx := len(m.StaticPods) - 1; iNdEx >= 0; iNdEx-- { + size, err := m.StaticPods[iNdEx].MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x12 + } + } + if len(m.Nodename) > 0 { + i -= len(m.Nodename) + copy(dAtA[i:], m.Nodename) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Nodename))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *KubernetesStatusSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *KubernetesStatusSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *KubernetesStatusSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.StaticPods) > 0 { + for iNdEx := len(m.StaticPods) - 1; iNdEx >= 0; iNdEx-- { + size, err := m.StaticPods[iNdEx].MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x12 + } + } + if len(m.Nodes) > 0 { + for iNdEx := len(m.Nodes) - 1; iNdEx >= 0; iNdEx-- { + size, err := m.Nodes[iNdEx].MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *KubernetesUpgradeStatusSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *KubernetesUpgradeStatusSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *KubernetesUpgradeStatusSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.CurrentUpgradeVersion) > 0 { + i -= len(m.CurrentUpgradeVersion) + copy(dAtA[i:], m.CurrentUpgradeVersion) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.CurrentUpgradeVersion))) + i-- + dAtA[i] = 0x3a + } + if len(m.UpgradeVersions) > 0 { + for iNdEx := len(m.UpgradeVersions) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.UpgradeVersions[iNdEx]) + copy(dAtA[i:], m.UpgradeVersions[iNdEx]) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.UpgradeVersions[iNdEx]))) + i-- + dAtA[i] = 0x32 + } + } + if len(m.LastUpgradeVersion) > 0 { + i -= len(m.LastUpgradeVersion) + copy(dAtA[i:], m.LastUpgradeVersion) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.LastUpgradeVersion))) + i-- + dAtA[i] = 0x2a + } + if len(m.Status) > 0 { + i -= len(m.Status) + copy(dAtA[i:], m.Status) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Status))) + i-- + dAtA[i] = 0x22 + } + if len(m.Step) > 0 { + i -= len(m.Step) + copy(dAtA[i:], m.Step) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Step))) + i-- + dAtA[i] = 0x1a + } + if len(m.Error) > 0 { + i -= len(m.Error) + copy(dAtA[i:], m.Error) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Error))) + i-- + dAtA[i] = 0x12 + } + if m.Phase != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Phase)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *KubernetesUpgradeManifestStatusSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *KubernetesUpgradeManifestStatusSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *KubernetesUpgradeManifestStatusSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.LastFatalError) > 0 { + i -= len(m.LastFatalError) + copy(dAtA[i:], m.LastFatalError) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.LastFatalError))) + i-- + dAtA[i] = 0x12 + } + if m.OutOfSync != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.OutOfSync)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *DestroyStatusSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DestroyStatusSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *DestroyStatusSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Phase) > 0 { + i -= len(m.Phase) + copy(dAtA[i:], m.Phase) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Phase))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *OngoingTaskSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *OngoingTaskSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *OngoingTaskSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if vtmsg, ok := m.Details.(interface { + MarshalToSizedBufferVT([]byte) (int, error) + }); ok { + size, err := vtmsg.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + } + if len(m.Title) > 0 { + i -= len(m.Title) + copy(dAtA[i:], m.Title) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Title))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *OngoingTaskSpec_TalosUpgrade) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *OngoingTaskSpec_TalosUpgrade) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + i := len(dAtA) + if m.TalosUpgrade != nil { + size, err := m.TalosUpgrade.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x12 + } + return len(dAtA) - i, nil +} +func (m *OngoingTaskSpec_KubernetesUpgrade) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *OngoingTaskSpec_KubernetesUpgrade) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + i := len(dAtA) + if m.KubernetesUpgrade != nil { + size, err := m.KubernetesUpgrade.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x1a + } + return len(dAtA) - i, nil +} +func (m *OngoingTaskSpec_Destroy) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *OngoingTaskSpec_Destroy) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + i := len(dAtA) + if m.Destroy != nil { + size, err := m.Destroy.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x22 + } + return len(dAtA) - i, nil +} +func (m *ClusterMachineEncryptionKeySpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ClusterMachineEncryptionKeySpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *ClusterMachineEncryptionKeySpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Data) > 0 { + i -= len(m.Data) + copy(dAtA[i:], m.Data) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Data))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ExposedServiceSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ExposedServiceSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *ExposedServiceSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.IconBase64) > 0 { + i -= len(m.IconBase64) + copy(dAtA[i:], m.IconBase64) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.IconBase64))) + i-- + dAtA[i] = 0x1a + } + if len(m.Label) > 0 { + i -= len(m.Label) + copy(dAtA[i:], m.Label) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Label))) + i-- + dAtA[i] = 0x12 + } + if m.Port != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Port)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *FeaturesConfigSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *FeaturesConfigSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *FeaturesConfigSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.EtcdBackupSettings != nil { + size, err := m.EtcdBackupSettings.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x12 + } + if m.EnableWorkloadProxying { + i-- + if m.EnableWorkloadProxying { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *EtcdBackupSettings) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *EtcdBackupSettings) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *EtcdBackupSettings) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.MaxInterval != nil { + size, err := (*durationpb1.Duration)(m.MaxInterval).MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x1a + } + if m.MinInterval != nil { + size, err := (*durationpb1.Duration)(m.MinInterval).MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x12 + } + if m.TickInterval != nil { + size, err := (*durationpb1.Duration)(m.TickInterval).MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MachineClassSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MachineClassSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *MachineClassSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.MatchLabels) > 0 { + for iNdEx := len(m.MatchLabels) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.MatchLabels[iNdEx]) + copy(dAtA[i:], m.MatchLabels[iNdEx]) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.MatchLabels[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *MachineConfigGenOptionsSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MachineConfigGenOptionsSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *MachineConfigGenOptionsSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.InstallDisk) > 0 { + i -= len(m.InstallDisk) + copy(dAtA[i:], m.InstallDisk) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.InstallDisk))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *EtcdAuditResultSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *EtcdAuditResultSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *EtcdAuditResultSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.EtcdMemberIds) > 0 { + var pksize2 int + for _, num := range m.EtcdMemberIds { + pksize2 += protohelpers.SizeOfVarint(uint64(num)) + } + i -= pksize2 + j1 := i + for _, num := range m.EtcdMemberIds { + for num >= 1<<7 { + dAtA[j1] = uint8(uint64(num)&0x7f | 0x80) + num >>= 7 + j1++ + } + dAtA[j1] = uint8(num) + j1++ + } + i = protohelpers.EncodeVarint(dAtA, i, uint64(pksize2)) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *KubeconfigSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *KubeconfigSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *KubeconfigSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Data) > 0 { + i -= len(m.Data) + copy(dAtA[i:], m.Data) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Data))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *KubernetesUsageSpec_Quantity) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *KubernetesUsageSpec_Quantity) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *KubernetesUsageSpec_Quantity) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.Capacity != 0 { + i -= 8 + binary.LittleEndian.PutUint64(dAtA[i:], uint64(math.Float64bits(float64(m.Capacity)))) + i-- + dAtA[i] = 0x19 + } + if m.Limits != 0 { + i -= 8 + binary.LittleEndian.PutUint64(dAtA[i:], uint64(math.Float64bits(float64(m.Limits)))) + i-- + dAtA[i] = 0x11 + } + if m.Requests != 0 { + i -= 8 + binary.LittleEndian.PutUint64(dAtA[i:], uint64(math.Float64bits(float64(m.Requests)))) + i-- + dAtA[i] = 0x9 + } + return len(dAtA) - i, nil +} + +func (m *KubernetesUsageSpec_Pod) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *KubernetesUsageSpec_Pod) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *KubernetesUsageSpec_Pod) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.Capacity != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Capacity)) + i-- + dAtA[i] = 0x18 + } + if m.Count != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Count)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *KubernetesUsageSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *KubernetesUsageSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *KubernetesUsageSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.Pods != nil { + size, err := m.Pods.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x22 + } + if m.Storage != nil { + size, err := m.Storage.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x1a + } + if m.Mem != nil { + size, err := m.Mem.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x12 + } + if m.Cpu != nil { + size, err := m.Cpu.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ImagePullRequestSpec_NodeImageList) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ImagePullRequestSpec_NodeImageList) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *ImagePullRequestSpec_NodeImageList) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Images) > 0 { + for iNdEx := len(m.Images) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Images[iNdEx]) + copy(dAtA[i:], m.Images[iNdEx]) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Images[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + if len(m.Node) > 0 { + i -= len(m.Node) + copy(dAtA[i:], m.Node) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Node))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ImagePullRequestSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ImagePullRequestSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *ImagePullRequestSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.NodeImageList) > 0 { + for iNdEx := len(m.NodeImageList) - 1; iNdEx >= 0; iNdEx-- { + size, err := m.NodeImageList[iNdEx].MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *ImagePullStatusSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ImagePullStatusSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *ImagePullStatusSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.RequestVersion) > 0 { + i -= len(m.RequestVersion) + copy(dAtA[i:], m.RequestVersion) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.RequestVersion))) + i-- + dAtA[i] = 0x32 + } + if m.TotalCount != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.TotalCount)) + i-- + dAtA[i] = 0x28 + } + if m.ProcessedCount != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.ProcessedCount)) + i-- + dAtA[i] = 0x20 + } + if len(m.LastProcessedError) > 0 { + i -= len(m.LastProcessedError) + copy(dAtA[i:], m.LastProcessedError) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.LastProcessedError))) + i-- + dAtA[i] = 0x1a + } + if len(m.LastProcessedImage) > 0 { + i -= len(m.LastProcessedImage) + copy(dAtA[i:], m.LastProcessedImage) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.LastProcessedImage))) + i-- + dAtA[i] = 0x12 + } + if len(m.LastProcessedNode) > 0 { + i -= len(m.LastProcessedNode) + copy(dAtA[i:], m.LastProcessedNode) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.LastProcessedNode))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *SchematicSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SchematicSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *SchematicSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Extensions) > 0 { + for iNdEx := len(m.Extensions) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Extensions[iNdEx]) + copy(dAtA[i:], m.Extensions[iNdEx]) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Extensions[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *TalosExtensionsSpec_Info) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TalosExtensionsSpec_Info) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *TalosExtensionsSpec_Info) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Digest) > 0 { + i -= len(m.Digest) + copy(dAtA[i:], m.Digest) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Digest))) + i-- + dAtA[i] = 0x32 + } + if len(m.Ref) > 0 { + i -= len(m.Ref) + copy(dAtA[i:], m.Ref) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Ref))) + i-- + dAtA[i] = 0x2a + } + if len(m.Description) > 0 { + i -= len(m.Description) + copy(dAtA[i:], m.Description) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Description))) + i-- + dAtA[i] = 0x22 + } + if len(m.Version) > 0 { + i -= len(m.Version) + copy(dAtA[i:], m.Version) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Version))) + i-- + dAtA[i] = 0x1a + } + if len(m.Author) > 0 { + i -= len(m.Author) + copy(dAtA[i:], m.Author) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Author))) + i-- + dAtA[i] = 0x12 + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *TalosExtensionsSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TalosExtensionsSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *TalosExtensionsSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Items) > 0 { + for iNdEx := len(m.Items) - 1; iNdEx >= 0; iNdEx-- { + size, err := m.Items[iNdEx].MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *SchematicConfigurationSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SchematicConfigurationSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *SchematicConfigurationSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.Target != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Target)) + i-- + dAtA[i] = 0x10 + } + if len(m.SchematicId) > 0 { + i -= len(m.SchematicId) + copy(dAtA[i:], m.SchematicId) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.SchematicId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MachineSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ManagementAddress) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.Connected { + n += 2 + } + n += len(m.unknownFields) + return n +} + +func (m *MachineStatusSpec_HardwareStatus_Processor) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.CoreCount != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.CoreCount)) + } + if m.ThreadCount != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.ThreadCount)) + } + if m.Frequency != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.Frequency)) + } + l = len(m.Description) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Manufacturer) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *MachineStatusSpec_HardwareStatus_MemoryModule) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.SizeMb != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.SizeMb)) + } + l = len(m.Description) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *MachineStatusSpec_HardwareStatus_BlockDevice) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Size != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.Size)) + } + l = len(m.Model) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.LinuxName) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Name) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Serial) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Uuid) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Wwid) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Type) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.BusPath) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.SystemDisk { + n += 2 + } + n += len(m.unknownFields) + return n +} + +func (m *MachineStatusSpec_HardwareStatus) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Processors) > 0 { + for _, e := range m.Processors { + l = e.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + if len(m.MemoryModules) > 0 { + for _, e := range m.MemoryModules { + l = e.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + if len(m.Blockdevices) > 0 { + for _, e := range m.Blockdevices { + l = e.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + l = len(m.Arch) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *MachineStatusSpec_NetworkStatus_NetworkLinkStatus) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.LinuxName) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.HardwareAddress) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.SpeedMbps != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.SpeedMbps)) + } + if m.LinkUp { + n += 2 + } + l = len(m.Description) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *MachineStatusSpec_NetworkStatus) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Hostname) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Domainname) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if len(m.Addresses) > 0 { + for _, s := range m.Addresses { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + if len(m.DefaultGateways) > 0 { + for _, s := range m.DefaultGateways { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + if len(m.NetworkLinks) > 0 { + for _, e := range m.NetworkLinks { + l = e.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + n += len(m.unknownFields) + return n +} + +func (m *MachineStatusSpec_PlatformMetadata) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Platform) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Hostname) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Region) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Zone) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.InstanceType) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.InstanceId) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.ProviderId) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.Spot { + n += 2 + } + n += len(m.unknownFields) + return n +} + +func (m *MachineStatusSpec_Schematic) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Id) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.Invalid { + n += 2 + } + n += len(m.unknownFields) + return n +} + +func (m *MachineStatusSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.TalosVersion) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.Hardware != nil { + l = m.Hardware.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.Network != nil { + l = m.Network.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.LastError) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.ManagementAddress) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.Connected { + n += 2 + } + if m.Maintenance { + n += 2 + } + l = len(m.Cluster) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.Role != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.Role)) + } + if m.PlatformMetadata != nil { + l = m.PlatformMetadata.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if len(m.ImageLabels) > 0 { + for k, v := range m.ImageLabels { + _ = k + _ = v + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + 1 + len(v) + protohelpers.SizeOfVarint(uint64(len(v))) + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) + } + } + if m.Schematic != nil { + l = m.Schematic.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *TalosConfigSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Ca) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Crt) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Key) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *ClusterSpec_Features) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.EnableWorkloadProxy { + n += 2 + } + if m.DiskEncryption { + n += 2 + } + n += len(m.unknownFields) + return n +} + +func (m *ClusterSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.InstallImage) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.KubernetesVersion) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.TalosVersion) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.Features != nil { + l = m.Features.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.BackupConfiguration != nil { + l = m.BackupConfiguration.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *EtcdBackupConf) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Interval != nil { + l = (*durationpb1.Duration)(m.Interval).SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.Enabled { + n += 2 + } + n += len(m.unknownFields) + return n +} + +func (m *EtcdBackupEncryptionSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.EncryptionKey) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *EtcdBackupHeader) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Version != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.Version)) + } + n += len(m.unknownFields) + return n +} + +func (m *EtcdBackupSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.CreatedAt != nil { + l = (*timestamppb1.Timestamp)(m.CreatedAt).SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Snapshot) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.Size != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.Size)) + } + n += len(m.unknownFields) + return n +} + +func (m *BackupDataSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Interval != nil { + l = (*durationpb1.Duration)(m.Interval).SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.ClusterUuid) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.EncryptionKey) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.AesCbcEncryptionSecret) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.SecretboxEncryptionSecret) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *EtcdBackupS3ConfSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Bucket) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Region) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Endpoint) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.AccessKeyId) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.SecretAccessKey) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.SessionToken) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *EtcdBackupStatusSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Status != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.Status)) + } + l = len(m.Error) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.LastBackupTime != nil { + l = (*timestamppb1.Timestamp)(m.LastBackupTime).SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.LastBackupAttempt != nil { + l = (*timestamppb1.Timestamp)(m.LastBackupAttempt).SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *EtcdManualBackupSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.BackupAt != nil { + l = (*timestamppb1.Timestamp)(m.BackupAt).SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *EtcdBackupStoreStatusSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ConfigurationName) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.ConfigurationError) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *EtcdBackupOverallStatusSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ConfigurationName) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.ConfigurationError) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.LastBackupStatus != nil { + l = m.LastBackupStatus.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *ClusterMachineSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.KubernetesVersion) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *ClusterMachineConfigPatchesSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Patches) > 0 { + for _, s := range m.Patches { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + n += len(m.unknownFields) + return n +} + +func (m *ClusterMachineTalosVersionSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.TalosVersion) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.SchematicId) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *ClusterMachineConfigSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Data) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.ClusterMachineVersion) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.GenerationError) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *RedactedClusterMachineConfigSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Data) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *ClusterMachineIdentitySpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.NodeIdentity) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.EtcdMemberId != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.EtcdMemberId)) + } + l = len(m.Nodename) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if len(m.NodeIps) > 0 { + for _, s := range m.NodeIps { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + n += len(m.unknownFields) + return n +} + +func (m *ClusterMachineTemplateSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.InstallImage) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.KubernetesVersion) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.InstallDisk) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Patch) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *ClusterMachineStatusSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Ready { + n += 2 + } + if m.Stage != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.Stage)) + } + if m.ApidAvailable { + n += 2 + } + if m.ConfigUpToDate { + n += 2 + } + l = len(m.LastConfigError) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.ManagementAddress) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.ConfigApplyStatus != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.ConfigApplyStatus)) + } + n += len(m.unknownFields) + return n +} + +func (m *Machines) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Total != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.Total)) + } + if m.Healthy != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.Healthy)) + } + if m.Connected != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.Connected)) + } + if m.Requested != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.Requested)) + } + n += len(m.unknownFields) + return n +} + +func (m *ClusterStatusSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Available { + n += 2 + } + if m.Machines != nil { + l = m.Machines.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.Phase != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.Phase)) + } + if m.Ready { + n += 2 + } + if m.KubernetesAPIReady { + n += 2 + } + if m.ControlplaneReady { + n += 2 + } + if m.HasConnectedControlPlanes { + n += 2 + } + n += len(m.unknownFields) + return n +} + +func (m *ClusterUUID) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Uuid) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *ClusterConfigVersionSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Version) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *ClusterMachineConfigStatusSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ClusterMachineConfigVersion) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.ClusterMachineVersion) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.ClusterMachineConfigSha256) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.LastConfigError) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.TalosVersion) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.SchematicId) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *ClusterBootstrapStatusSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Bootstrapped { + n += 2 + } + n += len(m.unknownFields) + return n +} + +func (m *ClusterSecretsSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Data) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *LoadBalancerConfigSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.BindPort) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if len(m.Endpoints) > 0 { + for _, s := range m.Endpoints { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + l = len(m.SiderolinkEndpoint) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *LoadBalancerStatusSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Healthy { + n += 2 + } + if m.Stopped { + n += 2 + } + n += len(m.unknownFields) + return n +} + +func (m *KubernetesVersionSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Version) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *TalosVersionSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Version) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if len(m.CompatibleKubernetesVersions) > 0 { + for _, s := range m.CompatibleKubernetesVersions { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + n += len(m.unknownFields) + return n +} + +func (m *InstallationMediaSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Architecture) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Profile) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.ContentType) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.SrcFilePrefix) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.DestFilePrefix) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Extension) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.NoSecureBoot { + n += 2 + } + n += len(m.unknownFields) + return n +} + +func (m *ConfigPatchSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Data) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *MachineSetSpec_MachineClass) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.MachineCount != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.MachineCount)) + } + if m.AllocationType != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.AllocationType)) + } + n += len(m.unknownFields) + return n +} + +func (m *MachineSetSpec_BootstrapSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ClusterUuid) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Snapshot) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *MachineSetSpec_RollingUpdateStrategyConfig) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.MaxParallelism != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.MaxParallelism)) + } + n += len(m.unknownFields) + return n +} + +func (m *MachineSetSpec_UpdateStrategyConfig) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Rolling != nil { + l = m.Rolling.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *MachineSetSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.UpdateStrategy != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.UpdateStrategy)) + } + if m.MachineClass != nil { + l = m.MachineClass.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.BootstrapSpec != nil { + l = m.BootstrapSpec.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.DeleteStrategy != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.DeleteStrategy)) + } + if m.UpdateStrategyConfig != nil { + l = m.UpdateStrategyConfig.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.DeleteStrategyConfig != nil { + l = m.DeleteStrategyConfig.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *TalosUpgradeStatusSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Phase != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.Phase)) + } + l = len(m.Error) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Step) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Status) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.LastUpgradeVersion) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.CurrentUpgradeVersion) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if len(m.UpgradeVersions) > 0 { + for _, s := range m.UpgradeVersions { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + n += len(m.unknownFields) + return n +} + +func (m *MachineSetStatusSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Phase != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.Phase)) + } + if m.Ready { + n += 2 + } + l = len(m.Error) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.Machines != nil { + l = m.Machines.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.ConfigHash) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.MachineClass != nil { + l = m.MachineClass.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *MachineSetNodeSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + n += len(m.unknownFields) + return n +} + +func (m *MachineLabelsSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + n += len(m.unknownFields) + return n +} + +func (m *MachineStatusSnapshotSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.MachineStatus != nil { + if size, ok := interface{}(m.MachineStatus).(interface { + SizeVT() int + }); ok { + l = size.SizeVT() + } else { + l = proto.Size(m.MachineStatus) + } + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *ControlPlaneStatusSpec_Condition) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Type != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.Type)) + } + l = len(m.Reason) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.Status != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.Status)) + } + if m.Severity != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.Severity)) + } + n += len(m.unknownFields) + return n +} + +func (m *ControlPlaneStatusSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Conditions) > 0 { + for _, e := range m.Conditions { + l = e.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + n += len(m.unknownFields) + return n +} + +func (m *ClusterEndpointSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.ManagementAddresses) > 0 { + for _, s := range m.ManagementAddresses { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + n += len(m.unknownFields) + return n +} + +func (m *KubernetesStatusSpec_NodeStatus) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Nodename) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.KubeletVersion) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.Ready { + n += 2 + } + n += len(m.unknownFields) + return n +} + +func (m *KubernetesStatusSpec_StaticPodStatus) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.App) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Version) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.Ready { + n += 2 + } + n += len(m.unknownFields) + return n +} + +func (m *KubernetesStatusSpec_NodeStaticPods) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Nodename) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if len(m.StaticPods) > 0 { + for _, e := range m.StaticPods { + l = e.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + n += len(m.unknownFields) + return n +} + +func (m *KubernetesStatusSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Nodes) > 0 { + for _, e := range m.Nodes { + l = e.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + if len(m.StaticPods) > 0 { + for _, e := range m.StaticPods { + l = e.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + n += len(m.unknownFields) + return n +} + +func (m *KubernetesUpgradeStatusSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Phase != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.Phase)) + } + l = len(m.Error) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Step) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Status) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.LastUpgradeVersion) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if len(m.UpgradeVersions) > 0 { + for _, s := range m.UpgradeVersions { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + l = len(m.CurrentUpgradeVersion) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *KubernetesUpgradeManifestStatusSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.OutOfSync != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.OutOfSync)) + } + l = len(m.LastFatalError) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *DestroyStatusSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Phase) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *OngoingTaskSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Title) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if vtmsg, ok := m.Details.(interface{ SizeVT() int }); ok { + n += vtmsg.SizeVT() + } + n += len(m.unknownFields) + return n +} + +func (m *OngoingTaskSpec_TalosUpgrade) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.TalosUpgrade != nil { + l = m.TalosUpgrade.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + return n +} +func (m *OngoingTaskSpec_KubernetesUpgrade) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.KubernetesUpgrade != nil { + l = m.KubernetesUpgrade.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + return n +} +func (m *OngoingTaskSpec_Destroy) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Destroy != nil { + l = m.Destroy.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + return n +} +func (m *ClusterMachineEncryptionKeySpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Data) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *ExposedServiceSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Port != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.Port)) + } + l = len(m.Label) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.IconBase64) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *FeaturesConfigSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.EnableWorkloadProxying { + n += 2 + } + if m.EtcdBackupSettings != nil { + l = m.EtcdBackupSettings.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *EtcdBackupSettings) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.TickInterval != nil { + l = (*durationpb1.Duration)(m.TickInterval).SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.MinInterval != nil { + l = (*durationpb1.Duration)(m.MinInterval).SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.MaxInterval != nil { + l = (*durationpb1.Duration)(m.MaxInterval).SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *MachineClassSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.MatchLabels) > 0 { + for _, s := range m.MatchLabels { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + n += len(m.unknownFields) + return n +} + +func (m *MachineConfigGenOptionsSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.InstallDisk) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *EtcdAuditResultSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.EtcdMemberIds) > 0 { + l = 0 + for _, e := range m.EtcdMemberIds { + l += protohelpers.SizeOfVarint(uint64(e)) + } + n += 1 + protohelpers.SizeOfVarint(uint64(l)) + l + } + n += len(m.unknownFields) + return n +} + +func (m *KubeconfigSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Data) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *KubernetesUsageSpec_Quantity) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Requests != 0 { + n += 9 + } + if m.Limits != 0 { + n += 9 + } + if m.Capacity != 0 { + n += 9 + } + n += len(m.unknownFields) + return n +} + +func (m *KubernetesUsageSpec_Pod) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Count != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.Count)) + } + if m.Capacity != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.Capacity)) + } + n += len(m.unknownFields) + return n +} + +func (m *KubernetesUsageSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Cpu != nil { + l = m.Cpu.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.Mem != nil { + l = m.Mem.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.Storage != nil { + l = m.Storage.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.Pods != nil { + l = m.Pods.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *ImagePullRequestSpec_NodeImageList) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Node) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if len(m.Images) > 0 { + for _, s := range m.Images { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + n += len(m.unknownFields) + return n +} + +func (m *ImagePullRequestSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.NodeImageList) > 0 { + for _, e := range m.NodeImageList { + l = e.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + n += len(m.unknownFields) + return n +} + +func (m *ImagePullStatusSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.LastProcessedNode) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.LastProcessedImage) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.LastProcessedError) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.ProcessedCount != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.ProcessedCount)) + } + if m.TotalCount != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.TotalCount)) + } + l = len(m.RequestVersion) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *SchematicSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Extensions) > 0 { + for _, s := range m.Extensions { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + n += len(m.unknownFields) + return n +} + +func (m *TalosExtensionsSpec_Info) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Author) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Version) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Description) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Ref) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Digest) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *TalosExtensionsSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Items) > 0 { + for _, e := range m.Items { + l = e.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + n += len(m.unknownFields) + return n +} + +func (m *SchematicConfigurationSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.SchematicId) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.Target != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.Target)) + } + n += len(m.unknownFields) + return n +} + +func (m *MachineSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MachineSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MachineSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ManagementAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ManagementAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Connected", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Connected = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MachineStatusSpec_HardwareStatus_Processor) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MachineStatusSpec_HardwareStatus_Processor: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MachineStatusSpec_HardwareStatus_Processor: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CoreCount", wireType) + } + m.CoreCount = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.CoreCount |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ThreadCount", wireType) + } + m.ThreadCount = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ThreadCount |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Frequency", wireType) + } + m.Frequency = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Frequency |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Description = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Manufacturer", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Manufacturer = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MachineStatusSpec_HardwareStatus_MemoryModule) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MachineStatusSpec_HardwareStatus_MemoryModule: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MachineStatusSpec_HardwareStatus_MemoryModule: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SizeMb", wireType) + } + m.SizeMb = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.SizeMb |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Description = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MachineStatusSpec_HardwareStatus_BlockDevice) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MachineStatusSpec_HardwareStatus_BlockDevice: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MachineStatusSpec_HardwareStatus_BlockDevice: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Size", wireType) + } + m.Size = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Size |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Model", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Model = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LinuxName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.LinuxName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Serial", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Serial = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Uuid", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Uuid = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Wwid", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Wwid = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Type = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BusPath", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.BusPath = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 11: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SystemDisk", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.SystemDisk = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MachineStatusSpec_HardwareStatus) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MachineStatusSpec_HardwareStatus: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MachineStatusSpec_HardwareStatus: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Processors", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Processors = append(m.Processors, &MachineStatusSpec_HardwareStatus_Processor{}) + if err := m.Processors[len(m.Processors)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MemoryModules", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.MemoryModules = append(m.MemoryModules, &MachineStatusSpec_HardwareStatus_MemoryModule{}) + if err := m.MemoryModules[len(m.MemoryModules)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Blockdevices", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Blockdevices = append(m.Blockdevices, &MachineStatusSpec_HardwareStatus_BlockDevice{}) + if err := m.Blockdevices[len(m.Blockdevices)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Arch", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Arch = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MachineStatusSpec_NetworkStatus_NetworkLinkStatus) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MachineStatusSpec_NetworkStatus_NetworkLinkStatus: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MachineStatusSpec_NetworkStatus_NetworkLinkStatus: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LinuxName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.LinuxName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field HardwareAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.HardwareAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SpeedMbps", wireType) + } + m.SpeedMbps = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.SpeedMbps |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field LinkUp", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.LinkUp = bool(v != 0) + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Description = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MachineStatusSpec_NetworkStatus) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MachineStatusSpec_NetworkStatus: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MachineStatusSpec_NetworkStatus: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Hostname", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Hostname = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Domainname", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Domainname = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Addresses", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Addresses = append(m.Addresses, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DefaultGateways", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DefaultGateways = append(m.DefaultGateways, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NetworkLinks", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.NetworkLinks = append(m.NetworkLinks, &MachineStatusSpec_NetworkStatus_NetworkLinkStatus{}) + if err := m.NetworkLinks[len(m.NetworkLinks)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MachineStatusSpec_PlatformMetadata) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MachineStatusSpec_PlatformMetadata: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MachineStatusSpec_PlatformMetadata: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Platform", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Platform = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Hostname", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Hostname = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Region", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Region = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Zone", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Zone = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field InstanceType", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.InstanceType = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field InstanceId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.InstanceId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ProviderId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ProviderId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Spot", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Spot = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MachineStatusSpec_Schematic) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MachineStatusSpec_Schematic: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MachineStatusSpec_Schematic: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Id = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Invalid", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Invalid = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MachineStatusSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MachineStatusSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MachineStatusSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TalosVersion", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TalosVersion = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Hardware", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Hardware == nil { + m.Hardware = &MachineStatusSpec_HardwareStatus{} + } + if err := m.Hardware.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Network", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Network == nil { + m.Network = &MachineStatusSpec_NetworkStatus{} + } + if err := m.Network.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LastError", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.LastError = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ManagementAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ManagementAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Connected", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Connected = bool(v != 0) + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Maintenance", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Maintenance = bool(v != 0) + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Cluster", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Cluster = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 10: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Role", wireType) + } + m.Role = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Role |= MachineStatusSpec_Role(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 11: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PlatformMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.PlatformMetadata == nil { + m.PlatformMetadata = &MachineStatusSpec_PlatformMetadata{} + } + if err := m.PlatformMetadata.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 13: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ImageLabels", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ImageLabels == nil { + m.ImageLabels = make(map[string]string) + } + var mapkey string + var mapvalue string + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return protohelpers.ErrInvalidLength + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return protohelpers.ErrInvalidLength + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var stringLenmapvalue uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapvalue |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapvalue := int(stringLenmapvalue) + if intStringLenmapvalue < 0 { + return protohelpers.ErrInvalidLength + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue < 0 { + return protohelpers.ErrInvalidLength + } + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.ImageLabels[mapkey] = mapvalue + iNdEx = postIndex + case 14: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Schematic", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Schematic == nil { + m.Schematic = &MachineStatusSpec_Schematic{} + } + if err := m.Schematic.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TalosConfigSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TalosConfigSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TalosConfigSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Ca", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Ca = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Crt", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Crt = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Key = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ClusterSpec_Features) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ClusterSpec_Features: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ClusterSpec_Features: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field EnableWorkloadProxy", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.EnableWorkloadProxy = bool(v != 0) + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DiskEncryption", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.DiskEncryption = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ClusterSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ClusterSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ClusterSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field InstallImage", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.InstallImage = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field KubernetesVersion", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.KubernetesVersion = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TalosVersion", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TalosVersion = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Features", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Features == nil { + m.Features = &ClusterSpec_Features{} + } + if err := m.Features.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BackupConfiguration", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.BackupConfiguration == nil { + m.BackupConfiguration = &EtcdBackupConf{} + } + if err := m.BackupConfiguration.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *EtcdBackupConf) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: EtcdBackupConf: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: EtcdBackupConf: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Interval", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Interval == nil { + m.Interval = &durationpb.Duration{} + } + if err := (*durationpb1.Duration)(m.Interval).UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Enabled", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Enabled = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *EtcdBackupEncryptionSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: EtcdBackupEncryptionSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: EtcdBackupEncryptionSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EncryptionKey", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.EncryptionKey = append(m.EncryptionKey[:0], dAtA[iNdEx:postIndex]...) + if m.EncryptionKey == nil { + m.EncryptionKey = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *EtcdBackupHeader) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: EtcdBackupHeader: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: EtcdBackupHeader: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) + } + m.Version = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Version |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *EtcdBackupSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: EtcdBackupSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: EtcdBackupSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CreatedAt", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.CreatedAt == nil { + m.CreatedAt = ×tamppb.Timestamp{} + } + if err := (*timestamppb1.Timestamp)(m.CreatedAt).UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Snapshot", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Snapshot = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Size", wireType) + } + m.Size = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Size |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *BackupDataSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: BackupDataSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: BackupDataSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Interval", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Interval == nil { + m.Interval = &durationpb.Duration{} + } + if err := (*durationpb1.Duration)(m.Interval).UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClusterUuid", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ClusterUuid = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EncryptionKey", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.EncryptionKey = append(m.EncryptionKey[:0], dAtA[iNdEx:postIndex]...) + if m.EncryptionKey == nil { + m.EncryptionKey = []byte{} + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AesCbcEncryptionSecret", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AesCbcEncryptionSecret = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SecretboxEncryptionSecret", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SecretboxEncryptionSecret = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *EtcdBackupS3ConfSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: EtcdBackupS3ConfSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: EtcdBackupS3ConfSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Bucket", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Bucket = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Region", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Region = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Endpoint", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Endpoint = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AccessKeyId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AccessKeyId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SecretAccessKey", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SecretAccessKey = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SessionToken", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SessionToken = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *EtcdBackupStatusSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: EtcdBackupStatusSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: EtcdBackupStatusSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + m.Status = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Status |= EtcdBackupStatusSpec_Status(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Error = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LastBackupTime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.LastBackupTime == nil { + m.LastBackupTime = ×tamppb.Timestamp{} + } + if err := (*timestamppb1.Timestamp)(m.LastBackupTime).UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LastBackupAttempt", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.LastBackupAttempt == nil { + m.LastBackupAttempt = ×tamppb.Timestamp{} + } + if err := (*timestamppb1.Timestamp)(m.LastBackupAttempt).UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *EtcdManualBackupSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: EtcdManualBackupSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: EtcdManualBackupSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BackupAt", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.BackupAt == nil { + m.BackupAt = ×tamppb.Timestamp{} + } + if err := (*timestamppb1.Timestamp)(m.BackupAt).UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *EtcdBackupStoreStatusSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: EtcdBackupStoreStatusSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: EtcdBackupStoreStatusSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConfigurationName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ConfigurationName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConfigurationError", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ConfigurationError = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *EtcdBackupOverallStatusSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: EtcdBackupOverallStatusSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: EtcdBackupOverallStatusSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConfigurationName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ConfigurationName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConfigurationError", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ConfigurationError = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LastBackupStatus", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.LastBackupStatus == nil { + m.LastBackupStatus = &EtcdBackupStatusSpec{} + } + if err := m.LastBackupStatus.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ClusterMachineSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ClusterMachineSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ClusterMachineSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field KubernetesVersion", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.KubernetesVersion = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ClusterMachineConfigPatchesSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ClusterMachineConfigPatchesSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ClusterMachineConfigPatchesSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Patches", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Patches = append(m.Patches, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ClusterMachineTalosVersionSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ClusterMachineTalosVersionSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ClusterMachineTalosVersionSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TalosVersion", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TalosVersion = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SchematicId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SchematicId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ClusterMachineConfigSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ClusterMachineConfigSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ClusterMachineConfigSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Data = append(m.Data[:0], dAtA[iNdEx:postIndex]...) + if m.Data == nil { + m.Data = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClusterMachineVersion", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ClusterMachineVersion = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GenerationError", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.GenerationError = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RedactedClusterMachineConfigSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RedactedClusterMachineConfigSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RedactedClusterMachineConfigSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Data = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ClusterMachineIdentitySpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ClusterMachineIdentitySpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ClusterMachineIdentitySpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NodeIdentity", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.NodeIdentity = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field EtcdMemberId", wireType) + } + m.EtcdMemberId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.EtcdMemberId |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Nodename", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Nodename = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NodeIps", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.NodeIps = append(m.NodeIps, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ClusterMachineTemplateSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ClusterMachineTemplateSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ClusterMachineTemplateSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field InstallImage", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.InstallImage = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field KubernetesVersion", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.KubernetesVersion = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field InstallDisk", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.InstallDisk = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Patch", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Patch = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ClusterMachineStatusSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ClusterMachineStatusSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ClusterMachineStatusSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Ready", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Ready = bool(v != 0) + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Stage", wireType) + } + m.Stage = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Stage |= ClusterMachineStatusSpec_Stage(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ApidAvailable", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.ApidAvailable = bool(v != 0) + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ConfigUpToDate", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.ConfigUpToDate = bool(v != 0) + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LastConfigError", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.LastConfigError = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ManagementAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ManagementAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ConfigApplyStatus", wireType) + } + m.ConfigApplyStatus = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ConfigApplyStatus |= ConfigApplyStatus(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Machines) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Machines: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Machines: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Total", wireType) + } + m.Total = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Total |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Healthy", wireType) + } + m.Healthy = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Healthy |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Connected", wireType) + } + m.Connected = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Connected |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Requested", wireType) + } + m.Requested = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Requested |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ClusterStatusSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ClusterStatusSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ClusterStatusSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Available", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Available = bool(v != 0) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Machines", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Machines == nil { + m.Machines = &Machines{} + } + if err := m.Machines.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Phase", wireType) + } + m.Phase = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Phase |= ClusterStatusSpec_Phase(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Ready", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Ready = bool(v != 0) + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field KubernetesAPIReady", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.KubernetesAPIReady = bool(v != 0) + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ControlplaneReady", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.ControlplaneReady = bool(v != 0) + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field HasConnectedControlPlanes", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.HasConnectedControlPlanes = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ClusterUUID) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ClusterUUID: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ClusterUUID: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Uuid", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Uuid = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ClusterConfigVersionSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ClusterConfigVersionSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ClusterConfigVersionSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Version = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ClusterMachineConfigStatusSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ClusterMachineConfigStatusSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ClusterMachineConfigStatusSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClusterMachineConfigVersion", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ClusterMachineConfigVersion = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClusterMachineVersion", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ClusterMachineVersion = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClusterMachineConfigSha256", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ClusterMachineConfigSha256 = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LastConfigError", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.LastConfigError = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TalosVersion", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TalosVersion = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SchematicId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SchematicId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ClusterBootstrapStatusSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ClusterBootstrapStatusSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ClusterBootstrapStatusSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Bootstrapped", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Bootstrapped = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ClusterSecretsSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ClusterSecretsSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ClusterSecretsSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Data = append(m.Data[:0], dAtA[iNdEx:postIndex]...) + if m.Data == nil { + m.Data = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *LoadBalancerConfigSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: LoadBalancerConfigSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: LoadBalancerConfigSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BindPort", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.BindPort = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Endpoints", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Endpoints = append(m.Endpoints, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SiderolinkEndpoint", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SiderolinkEndpoint = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *LoadBalancerStatusSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: LoadBalancerStatusSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: LoadBalancerStatusSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Healthy", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Healthy = bool(v != 0) + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Stopped", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Stopped = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *KubernetesVersionSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: KubernetesVersionSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: KubernetesVersionSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Version = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TalosVersionSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TalosVersionSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TalosVersionSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Version = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CompatibleKubernetesVersions", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.CompatibleKubernetesVersions = append(m.CompatibleKubernetesVersions, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *InstallationMediaSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: InstallationMediaSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: InstallationMediaSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Architecture", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Architecture = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Profile", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Profile = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ContentType", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ContentType = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SrcFilePrefix", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SrcFilePrefix = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DestFilePrefix", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DestFilePrefix = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Extension", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Extension = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 11: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field NoSecureBoot", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.NoSecureBoot = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ConfigPatchSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ConfigPatchSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ConfigPatchSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Data = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MachineSetSpec_MachineClass) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MachineSetSpec_MachineClass: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MachineSetSpec_MachineClass: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MachineCount", wireType) + } + m.MachineCount = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.MachineCount |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AllocationType", wireType) + } + m.AllocationType = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.AllocationType |= MachineSetSpec_MachineClass_AllocationType(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MachineSetSpec_BootstrapSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MachineSetSpec_BootstrapSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MachineSetSpec_BootstrapSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClusterUuid", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ClusterUuid = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Snapshot", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Snapshot = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MachineSetSpec_RollingUpdateStrategyConfig) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MachineSetSpec_RollingUpdateStrategyConfig: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MachineSetSpec_RollingUpdateStrategyConfig: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MaxParallelism", wireType) + } + m.MaxParallelism = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.MaxParallelism |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MachineSetSpec_UpdateStrategyConfig) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MachineSetSpec_UpdateStrategyConfig: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MachineSetSpec_UpdateStrategyConfig: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Rolling", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Rolling == nil { + m.Rolling = &MachineSetSpec_RollingUpdateStrategyConfig{} + } + if err := m.Rolling.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MachineSetSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MachineSetSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MachineSetSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field UpdateStrategy", wireType) + } + m.UpdateStrategy = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.UpdateStrategy |= MachineSetSpec_UpdateStrategy(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MachineClass", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.MachineClass == nil { + m.MachineClass = &MachineSetSpec_MachineClass{} + } + if err := m.MachineClass.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BootstrapSpec", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.BootstrapSpec == nil { + m.BootstrapSpec = &MachineSetSpec_BootstrapSpec{} + } + if err := m.BootstrapSpec.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DeleteStrategy", wireType) + } + m.DeleteStrategy = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.DeleteStrategy |= MachineSetSpec_UpdateStrategy(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UpdateStrategyConfig", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.UpdateStrategyConfig == nil { + m.UpdateStrategyConfig = &MachineSetSpec_UpdateStrategyConfig{} + } + if err := m.UpdateStrategyConfig.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DeleteStrategyConfig", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.DeleteStrategyConfig == nil { + m.DeleteStrategyConfig = &MachineSetSpec_UpdateStrategyConfig{} + } + if err := m.DeleteStrategyConfig.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TalosUpgradeStatusSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TalosUpgradeStatusSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TalosUpgradeStatusSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Phase", wireType) + } + m.Phase = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Phase |= TalosUpgradeStatusSpec_Phase(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Error = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Step", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Step = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Status = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LastUpgradeVersion", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.LastUpgradeVersion = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CurrentUpgradeVersion", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.CurrentUpgradeVersion = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UpgradeVersions", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.UpgradeVersions = append(m.UpgradeVersions, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MachineSetStatusSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MachineSetStatusSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MachineSetStatusSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Phase", wireType) + } + m.Phase = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Phase |= MachineSetPhase(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Ready", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Ready = bool(v != 0) + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Error = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Machines", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Machines == nil { + m.Machines = &Machines{} + } + if err := m.Machines.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConfigHash", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ConfigHash = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MachineClass", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.MachineClass == nil { + m.MachineClass = &MachineSetSpec_MachineClass{} + } + if err := m.MachineClass.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MachineSetNodeSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MachineSetNodeSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MachineSetNodeSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MachineLabelsSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MachineLabelsSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MachineLabelsSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MachineStatusSnapshotSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MachineStatusSnapshotSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MachineStatusSnapshotSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MachineStatus", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.MachineStatus == nil { + m.MachineStatus = &machine.MachineStatusEvent{} + } + if unmarshal, ok := interface{}(m.MachineStatus).(interface { + UnmarshalVT([]byte) error + }); ok { + if err := unmarshal.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + } else { + if err := proto.Unmarshal(dAtA[iNdEx:postIndex], m.MachineStatus); err != nil { + return err + } + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ControlPlaneStatusSpec_Condition) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ControlPlaneStatusSpec_Condition: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ControlPlaneStatusSpec_Condition: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + m.Type = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Type |= ConditionType(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Reason", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Reason = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + m.Status = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Status |= ControlPlaneStatusSpec_Condition_Status(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Severity", wireType) + } + m.Severity = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Severity |= ControlPlaneStatusSpec_Condition_Severity(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ControlPlaneStatusSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ControlPlaneStatusSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ControlPlaneStatusSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Conditions", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Conditions = append(m.Conditions, &ControlPlaneStatusSpec_Condition{}) + if err := m.Conditions[len(m.Conditions)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ClusterEndpointSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ClusterEndpointSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ClusterEndpointSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ManagementAddresses", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ManagementAddresses = append(m.ManagementAddresses, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *KubernetesStatusSpec_NodeStatus) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: KubernetesStatusSpec_NodeStatus: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: KubernetesStatusSpec_NodeStatus: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Nodename", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Nodename = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field KubeletVersion", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.KubeletVersion = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Ready", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Ready = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *KubernetesStatusSpec_StaticPodStatus) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: KubernetesStatusSpec_StaticPodStatus: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: KubernetesStatusSpec_StaticPodStatus: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field App", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.App = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Version = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Ready", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Ready = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *KubernetesStatusSpec_NodeStaticPods) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: KubernetesStatusSpec_NodeStaticPods: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: KubernetesStatusSpec_NodeStaticPods: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Nodename", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Nodename = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StaticPods", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.StaticPods = append(m.StaticPods, &KubernetesStatusSpec_StaticPodStatus{}) + if err := m.StaticPods[len(m.StaticPods)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *KubernetesStatusSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: KubernetesStatusSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: KubernetesStatusSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Nodes", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Nodes = append(m.Nodes, &KubernetesStatusSpec_NodeStatus{}) + if err := m.Nodes[len(m.Nodes)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StaticPods", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.StaticPods = append(m.StaticPods, &KubernetesStatusSpec_NodeStaticPods{}) + if err := m.StaticPods[len(m.StaticPods)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *KubernetesUpgradeStatusSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: KubernetesUpgradeStatusSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: KubernetesUpgradeStatusSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Phase", wireType) + } + m.Phase = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Phase |= KubernetesUpgradeStatusSpec_Phase(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Error = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Step", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Step = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Status = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LastUpgradeVersion", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.LastUpgradeVersion = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UpgradeVersions", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.UpgradeVersions = append(m.UpgradeVersions, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CurrentUpgradeVersion", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.CurrentUpgradeVersion = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *KubernetesUpgradeManifestStatusSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: KubernetesUpgradeManifestStatusSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: KubernetesUpgradeManifestStatusSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field OutOfSync", wireType) + } + m.OutOfSync = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.OutOfSync |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LastFatalError", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.LastFatalError = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DestroyStatusSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DestroyStatusSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DestroyStatusSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Phase", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Phase = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *OngoingTaskSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: OngoingTaskSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: OngoingTaskSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Title", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Title = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TalosUpgrade", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if oneof, ok := m.Details.(*OngoingTaskSpec_TalosUpgrade); ok { + if err := oneof.TalosUpgrade.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + } else { + v := &TalosUpgradeStatusSpec{} + if err := v.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Details = &OngoingTaskSpec_TalosUpgrade{TalosUpgrade: v} + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field KubernetesUpgrade", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if oneof, ok := m.Details.(*OngoingTaskSpec_KubernetesUpgrade); ok { + if err := oneof.KubernetesUpgrade.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + } else { + v := &KubernetesUpgradeStatusSpec{} + if err := v.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Details = &OngoingTaskSpec_KubernetesUpgrade{KubernetesUpgrade: v} + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Destroy", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if oneof, ok := m.Details.(*OngoingTaskSpec_Destroy); ok { + if err := oneof.Destroy.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + } else { + v := &DestroyStatusSpec{} + if err := v.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Details = &OngoingTaskSpec_Destroy{Destroy: v} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ClusterMachineEncryptionKeySpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ClusterMachineEncryptionKeySpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ClusterMachineEncryptionKeySpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Data = append(m.Data[:0], dAtA[iNdEx:postIndex]...) + if m.Data == nil { + m.Data = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ExposedServiceSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ExposedServiceSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ExposedServiceSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Port", wireType) + } + m.Port = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Port |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Label", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Label = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IconBase64", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.IconBase64 = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *FeaturesConfigSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: FeaturesConfigSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: FeaturesConfigSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field EnableWorkloadProxying", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.EnableWorkloadProxying = bool(v != 0) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EtcdBackupSettings", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.EtcdBackupSettings == nil { + m.EtcdBackupSettings = &EtcdBackupSettings{} + } + if err := m.EtcdBackupSettings.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *EtcdBackupSettings) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: EtcdBackupSettings: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: EtcdBackupSettings: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TickInterval", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.TickInterval == nil { + m.TickInterval = &durationpb.Duration{} + } + if err := (*durationpb1.Duration)(m.TickInterval).UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MinInterval", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.MinInterval == nil { + m.MinInterval = &durationpb.Duration{} + } + if err := (*durationpb1.Duration)(m.MinInterval).UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MaxInterval", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.MaxInterval == nil { + m.MaxInterval = &durationpb.Duration{} + } + if err := (*durationpb1.Duration)(m.MaxInterval).UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MachineClassSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MachineClassSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MachineClassSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MatchLabels", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.MatchLabels = append(m.MatchLabels, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MachineConfigGenOptionsSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MachineConfigGenOptionsSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MachineConfigGenOptionsSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field InstallDisk", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.InstallDisk = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *EtcdAuditResultSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: EtcdAuditResultSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: EtcdAuditResultSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType == 0 { + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.EtcdMemberIds = append(m.EtcdMemberIds, v) + } else if wireType == 2 { + var packedLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + packedLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if packedLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + packedLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var elementCount int + var count int + for _, integer := range dAtA[iNdEx:postIndex] { + if integer < 128 { + count++ + } + } + elementCount = count + if elementCount != 0 && len(m.EtcdMemberIds) == 0 { + m.EtcdMemberIds = make([]uint64, 0, elementCount) + } + for iNdEx < postIndex { + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.EtcdMemberIds = append(m.EtcdMemberIds, v) + } + } else { + return fmt.Errorf("proto: wrong wireType = %d for field EtcdMemberIds", wireType) + } + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *KubeconfigSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: KubeconfigSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: KubeconfigSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Data = append(m.Data[:0], dAtA[iNdEx:postIndex]...) + if m.Data == nil { + m.Data = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *KubernetesUsageSpec_Quantity) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: KubernetesUsageSpec_Quantity: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: KubernetesUsageSpec_Quantity: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 1 { + return fmt.Errorf("proto: wrong wireType = %d for field Requests", wireType) + } + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + v = uint64(binary.LittleEndian.Uint64(dAtA[iNdEx:])) + iNdEx += 8 + m.Requests = float64(math.Float64frombits(v)) + case 2: + if wireType != 1 { + return fmt.Errorf("proto: wrong wireType = %d for field Limits", wireType) + } + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + v = uint64(binary.LittleEndian.Uint64(dAtA[iNdEx:])) + iNdEx += 8 + m.Limits = float64(math.Float64frombits(v)) + case 3: + if wireType != 1 { + return fmt.Errorf("proto: wrong wireType = %d for field Capacity", wireType) + } + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + v = uint64(binary.LittleEndian.Uint64(dAtA[iNdEx:])) + iNdEx += 8 + m.Capacity = float64(math.Float64frombits(v)) + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *KubernetesUsageSpec_Pod) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: KubernetesUsageSpec_Pod: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: KubernetesUsageSpec_Pod: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Count", wireType) + } + m.Count = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Count |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Capacity", wireType) + } + m.Capacity = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Capacity |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *KubernetesUsageSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: KubernetesUsageSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: KubernetesUsageSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Cpu", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Cpu == nil { + m.Cpu = &KubernetesUsageSpec_Quantity{} + } + if err := m.Cpu.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Mem", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Mem == nil { + m.Mem = &KubernetesUsageSpec_Quantity{} + } + if err := m.Mem.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Storage", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Storage == nil { + m.Storage = &KubernetesUsageSpec_Quantity{} + } + if err := m.Storage.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Pods", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Pods == nil { + m.Pods = &KubernetesUsageSpec_Pod{} + } + if err := m.Pods.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ImagePullRequestSpec_NodeImageList) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ImagePullRequestSpec_NodeImageList: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ImagePullRequestSpec_NodeImageList: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Node", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Node = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Images", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Images = append(m.Images, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ImagePullRequestSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ImagePullRequestSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ImagePullRequestSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NodeImageList", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.NodeImageList = append(m.NodeImageList, &ImagePullRequestSpec_NodeImageList{}) + if err := m.NodeImageList[len(m.NodeImageList)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ImagePullStatusSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ImagePullStatusSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ImagePullStatusSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LastProcessedNode", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.LastProcessedNode = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LastProcessedImage", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.LastProcessedImage = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LastProcessedError", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.LastProcessedError = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ProcessedCount", wireType) + } + m.ProcessedCount = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ProcessedCount |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TotalCount", wireType) + } + m.TotalCount = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.TotalCount |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RequestVersion", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RequestVersion = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SchematicSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SchematicSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SchematicSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Extensions", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Extensions = append(m.Extensions, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TalosExtensionsSpec_Info) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TalosExtensionsSpec_Info: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TalosExtensionsSpec_Info: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Author", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Author = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Version = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Description = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Ref", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Ref = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Digest", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Digest = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TalosExtensionsSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TalosExtensionsSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TalosExtensionsSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Items = append(m.Items, &TalosExtensionsSpec_Info{}) + if err := m.Items[len(m.Items)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SchematicConfigurationSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SchematicConfigurationSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SchematicConfigurationSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SchematicId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SchematicId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Target", wireType) + } + m.Target = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Target |= SchematicConfigurationSpec_Target(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} diff --git a/client/api/omni/specs/omni_yaml.go b/client/api/omni/specs/omni_yaml.go new file mode 100644 index 00000000..95678672 --- /dev/null +++ b/client/api/omni/specs/omni_yaml.go @@ -0,0 +1,48 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package specs + +import ( + "github.com/siderolabs/gen/xslices" + "gopkg.in/yaml.v3" +) + +// MarshalYAML implements yaml.Marshaler interface. +func (c *ClusterMachineSpec) MarshalYAML() (any, error) { + return &yaml.Node{ + Kind: yaml.MappingNode, + Tag: "!!map", + Content: []*yaml.Node{ + {Kind: yaml.ScalarNode, Tag: "!!str", Value: "kubernetes_version"}, + {Kind: yaml.ScalarNode, Tag: "!!str", Value: c.KubernetesVersion}, + }, + }, nil +} + +// MarshalYAML implements yaml.Marshaler interface. +func (c *ClusterMachineConfigPatchesSpec) MarshalYAML() (any, error) { + contents := xslices.Map(c.Patches, func(patch string) *yaml.Node { + style := yaml.FlowStyle + if len(patch) > 0 && (patch[0] == '\n' || patch[0] == ' ') { + style = yaml.SingleQuotedStyle + } + + return &yaml.Node{ + Kind: yaml.ScalarNode, + Tag: "!!str", + Style: style, + Value: patch, + } + }) + + return &yaml.Node{ + Kind: yaml.MappingNode, + Tag: "!!map", + Content: []*yaml.Node{ + {Kind: yaml.ScalarNode, Tag: "!!str", Value: "patches"}, + {Kind: yaml.SequenceNode, Tag: "!!seq", Content: contents}, + }, + }, nil +} diff --git a/client/api/omni/specs/siderolink.pb.go b/client/api/omni/specs/siderolink.pb.go new file mode 100644 index 00000000..840ffc25 --- /dev/null +++ b/client/api/omni/specs/siderolink.pb.go @@ -0,0 +1,497 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.32.0 +// protoc v4.24.4 +// source: omni/specs/siderolink.proto + +package specs + +import ( + reflect "reflect" + sync "sync" + + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// SiderolinkConfigSpec describes siderolink wireguard server state to persist it across restarts. +type SiderolinkConfigSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + PrivateKey string `protobuf:"bytes,1,opt,name=private_key,json=privateKey,proto3" json:"private_key,omitempty"` + PublicKey string `protobuf:"bytes,2,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` + WireguardEndpoint string `protobuf:"bytes,3,opt,name=wireguard_endpoint,json=wireguardEndpoint,proto3" json:"wireguard_endpoint,omitempty"` + Subnet string `protobuf:"bytes,5,opt,name=subnet,proto3" json:"subnet,omitempty"` + ServerAddress string `protobuf:"bytes,6,opt,name=server_address,json=serverAddress,proto3" json:"server_address,omitempty"` + JoinToken string `protobuf:"bytes,7,opt,name=join_token,json=joinToken,proto3" json:"join_token,omitempty"` + AdvertisedEndpoint string `protobuf:"bytes,8,opt,name=advertised_endpoint,json=advertisedEndpoint,proto3" json:"advertised_endpoint,omitempty"` +} + +func (x *SiderolinkConfigSpec) Reset() { + *x = SiderolinkConfigSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_siderolink_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SiderolinkConfigSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SiderolinkConfigSpec) ProtoMessage() {} + +func (x *SiderolinkConfigSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_siderolink_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SiderolinkConfigSpec.ProtoReflect.Descriptor instead. +func (*SiderolinkConfigSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_siderolink_proto_rawDescGZIP(), []int{0} +} + +func (x *SiderolinkConfigSpec) GetPrivateKey() string { + if x != nil { + return x.PrivateKey + } + return "" +} + +func (x *SiderolinkConfigSpec) GetPublicKey() string { + if x != nil { + return x.PublicKey + } + return "" +} + +func (x *SiderolinkConfigSpec) GetWireguardEndpoint() string { + if x != nil { + return x.WireguardEndpoint + } + return "" +} + +func (x *SiderolinkConfigSpec) GetSubnet() string { + if x != nil { + return x.Subnet + } + return "" +} + +func (x *SiderolinkConfigSpec) GetServerAddress() string { + if x != nil { + return x.ServerAddress + } + return "" +} + +func (x *SiderolinkConfigSpec) GetJoinToken() string { + if x != nil { + return x.JoinToken + } + return "" +} + +func (x *SiderolinkConfigSpec) GetAdvertisedEndpoint() string { + if x != nil { + return x.AdvertisedEndpoint + } + return "" +} + +// SiderolinkConnectionSpec describes each node connection information. +type SiderolinkSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + NodeSubnet string `protobuf:"bytes,1,opt,name=node_subnet,json=nodeSubnet,proto3" json:"node_subnet,omitempty"` + NodePublicKey string `protobuf:"bytes,2,opt,name=node_public_key,json=nodePublicKey,proto3" json:"node_public_key,omitempty"` + LastEndpoint string `protobuf:"bytes,3,opt,name=last_endpoint,json=lastEndpoint,proto3" json:"last_endpoint,omitempty"` + Connected bool `protobuf:"varint,4,opt,name=connected,proto3" json:"connected,omitempty"` +} + +func (x *SiderolinkSpec) Reset() { + *x = SiderolinkSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_siderolink_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SiderolinkSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SiderolinkSpec) ProtoMessage() {} + +func (x *SiderolinkSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_siderolink_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SiderolinkSpec.ProtoReflect.Descriptor instead. +func (*SiderolinkSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_siderolink_proto_rawDescGZIP(), []int{1} +} + +func (x *SiderolinkSpec) GetNodeSubnet() string { + if x != nil { + return x.NodeSubnet + } + return "" +} + +func (x *SiderolinkSpec) GetNodePublicKey() string { + if x != nil { + return x.NodePublicKey + } + return "" +} + +func (x *SiderolinkSpec) GetLastEndpoint() string { + if x != nil { + return x.LastEndpoint + } + return "" +} + +func (x *SiderolinkSpec) GetConnected() bool { + if x != nil { + return x.Connected + } + return false +} + +// SiderolinkConnectionSpec describes each node connection information. +type SiderolinkCounterSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + BytesReceived int64 `protobuf:"varint,1,opt,name=bytes_received,json=bytesReceived,proto3" json:"bytes_received,omitempty"` + BytesSent int64 `protobuf:"varint,2,opt,name=bytes_sent,json=bytesSent,proto3" json:"bytes_sent,omitempty"` + LastAlive *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=last_alive,json=lastAlive,proto3" json:"last_alive,omitempty"` +} + +func (x *SiderolinkCounterSpec) Reset() { + *x = SiderolinkCounterSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_siderolink_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SiderolinkCounterSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SiderolinkCounterSpec) ProtoMessage() {} + +func (x *SiderolinkCounterSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_siderolink_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SiderolinkCounterSpec.ProtoReflect.Descriptor instead. +func (*SiderolinkCounterSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_siderolink_proto_rawDescGZIP(), []int{2} +} + +func (x *SiderolinkCounterSpec) GetBytesReceived() int64 { + if x != nil { + return x.BytesReceived + } + return 0 +} + +func (x *SiderolinkCounterSpec) GetBytesSent() int64 { + if x != nil { + return x.BytesSent + } + return 0 +} + +func (x *SiderolinkCounterSpec) GetLastAlive() *timestamppb.Timestamp { + if x != nil { + return x.LastAlive + } + return nil +} + +// ConnectionParamsSpec describes generated kernel parameters for connecting +// the Talos node to Omni. +type ConnectionParamsSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Args keeps the generated kernel arguments string. + Args string `protobuf:"bytes,1,opt,name=args,proto3" json:"args,omitempty"` + // ApiEndpoint is the service gRPC API endpoint (external domain/ip, schema and port). + ApiEndpoint string `protobuf:"bytes,2,opt,name=api_endpoint,json=apiEndpoint,proto3" json:"api_endpoint,omitempty"` + // WireguardEndpoint is the service IP visible from the internal SideroLink network. + WireguardEndpoint string `protobuf:"bytes,3,opt,name=wireguard_endpoint,json=wireguardEndpoint,proto3" json:"wireguard_endpoint,omitempty"` + // JoinToken is a join token required to connect to SideroLink. + JoinToken string `protobuf:"bytes,4,opt,name=join_token,json=joinToken,proto3" json:"join_token,omitempty"` +} + +func (x *ConnectionParamsSpec) Reset() { + *x = ConnectionParamsSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_siderolink_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ConnectionParamsSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ConnectionParamsSpec) ProtoMessage() {} + +func (x *ConnectionParamsSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_siderolink_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ConnectionParamsSpec.ProtoReflect.Descriptor instead. +func (*ConnectionParamsSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_siderolink_proto_rawDescGZIP(), []int{3} +} + +func (x *ConnectionParamsSpec) GetArgs() string { + if x != nil { + return x.Args + } + return "" +} + +func (x *ConnectionParamsSpec) GetApiEndpoint() string { + if x != nil { + return x.ApiEndpoint + } + return "" +} + +func (x *ConnectionParamsSpec) GetWireguardEndpoint() string { + if x != nil { + return x.WireguardEndpoint + } + return "" +} + +func (x *ConnectionParamsSpec) GetJoinToken() string { + if x != nil { + return x.JoinToken + } + return "" +} + +var File_omni_specs_siderolink_proto protoreflect.FileDescriptor + +var file_omni_specs_siderolink_proto_rawDesc = []byte{ + 0x0a, 0x1b, 0x6f, 0x6d, 0x6e, 0x69, 0x2f, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2f, 0x73, 0x69, 0x64, + 0x65, 0x72, 0x6f, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x73, + 0x70, 0x65, 0x63, 0x73, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x94, 0x02, 0x0a, 0x14, 0x53, 0x69, 0x64, 0x65, 0x72, 0x6f, + 0x6c, 0x69, 0x6e, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x12, 0x1f, + 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, + 0x1d, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x2d, + 0x0a, 0x12, 0x77, 0x69, 0x72, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x5f, 0x65, 0x6e, 0x64, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x77, 0x69, 0x72, 0x65, + 0x67, 0x75, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x16, 0x0a, + 0x06, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, + 0x75, 0x62, 0x6e, 0x65, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1d, 0x0a, 0x0a, + 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2f, 0x0a, 0x13, 0x61, + 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x64, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, + 0x69, 0x73, 0x65, 0x64, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x22, 0xa8, 0x01, 0x0a, + 0x0e, 0x53, 0x69, 0x64, 0x65, 0x72, 0x6f, 0x6c, 0x69, 0x6e, 0x6b, 0x53, 0x70, 0x65, 0x63, 0x12, + 0x1f, 0x0a, 0x0b, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, + 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, + 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x50, + 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x6c, 0x61, 0x73, 0x74, + 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x1c, 0x0a, + 0x09, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x4a, 0x04, 0x08, 0x05, 0x10, + 0x06, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, 0x98, 0x01, 0x0a, 0x15, 0x53, 0x69, 0x64, 0x65, + 0x72, 0x6f, 0x6c, 0x69, 0x6e, 0x6b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x53, 0x70, 0x65, + 0x63, 0x12, 0x25, 0x0a, 0x0e, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x72, 0x65, 0x63, 0x65, 0x69, + 0x76, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x62, 0x79, 0x74, 0x65, 0x73, + 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x79, 0x74, 0x65, + 0x73, 0x5f, 0x73, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x62, 0x79, + 0x74, 0x65, 0x73, 0x53, 0x65, 0x6e, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x5f, + 0x61, 0x6c, 0x69, 0x76, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x41, 0x6c, 0x69, + 0x76, 0x65, 0x22, 0x9b, 0x01, 0x0a, 0x14, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x61, + 0x72, 0x67, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x12, + 0x21, 0x0a, 0x0c, 0x61, 0x70, 0x69, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x70, 0x69, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x77, 0x69, 0x72, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x5f, + 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, + 0x77, 0x69, 0x72, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x42, 0x32, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x73, + 0x69, 0x64, 0x65, 0x72, 0x6f, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x6f, 0x6d, 0x6e, 0x69, 0x2f, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6f, 0x6d, 0x6e, 0x69, 0x2f, 0x73, + 0x70, 0x65, 0x63, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_omni_specs_siderolink_proto_rawDescOnce sync.Once + file_omni_specs_siderolink_proto_rawDescData = file_omni_specs_siderolink_proto_rawDesc +) + +func file_omni_specs_siderolink_proto_rawDescGZIP() []byte { + file_omni_specs_siderolink_proto_rawDescOnce.Do(func() { + file_omni_specs_siderolink_proto_rawDescData = protoimpl.X.CompressGZIP(file_omni_specs_siderolink_proto_rawDescData) + }) + return file_omni_specs_siderolink_proto_rawDescData +} + +var file_omni_specs_siderolink_proto_msgTypes = make([]protoimpl.MessageInfo, 4) +var file_omni_specs_siderolink_proto_goTypes = []interface{}{ + (*SiderolinkConfigSpec)(nil), // 0: specs.SiderolinkConfigSpec + (*SiderolinkSpec)(nil), // 1: specs.SiderolinkSpec + (*SiderolinkCounterSpec)(nil), // 2: specs.SiderolinkCounterSpec + (*ConnectionParamsSpec)(nil), // 3: specs.ConnectionParamsSpec + (*timestamppb.Timestamp)(nil), // 4: google.protobuf.Timestamp +} +var file_omni_specs_siderolink_proto_depIdxs = []int32{ + 4, // 0: specs.SiderolinkCounterSpec.last_alive:type_name -> google.protobuf.Timestamp + 1, // [1:1] is the sub-list for method output_type + 1, // [1:1] is the sub-list for method input_type + 1, // [1:1] is the sub-list for extension type_name + 1, // [1:1] is the sub-list for extension extendee + 0, // [0:1] is the sub-list for field type_name +} + +func init() { file_omni_specs_siderolink_proto_init() } +func file_omni_specs_siderolink_proto_init() { + if File_omni_specs_siderolink_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_omni_specs_siderolink_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SiderolinkConfigSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_siderolink_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SiderolinkSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_siderolink_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SiderolinkCounterSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_siderolink_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ConnectionParamsSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_omni_specs_siderolink_proto_rawDesc, + NumEnums: 0, + NumMessages: 4, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_omni_specs_siderolink_proto_goTypes, + DependencyIndexes: file_omni_specs_siderolink_proto_depIdxs, + MessageInfos: file_omni_specs_siderolink_proto_msgTypes, + }.Build() + File_omni_specs_siderolink_proto = out.File + file_omni_specs_siderolink_proto_rawDesc = nil + file_omni_specs_siderolink_proto_goTypes = nil + file_omni_specs_siderolink_proto_depIdxs = nil +} diff --git a/client/api/omni/specs/siderolink.proto b/client/api/omni/specs/siderolink.proto new file mode 100644 index 00000000..b88bdaeb --- /dev/null +++ b/client/api/omni/specs/siderolink.proto @@ -0,0 +1,47 @@ +syntax = "proto3"; +package specs; + +option go_package = "github.com/siderolabs/omni/client/api/omni/specs"; + +import "google/protobuf/timestamp.proto"; + +// SiderolinkConfigSpec describes siderolink wireguard server state to persist it across restarts. +message SiderolinkConfigSpec { + string private_key = 1; + string public_key = 2; + string wireguard_endpoint = 3; + string subnet = 5; + string server_address = 6; + string join_token = 7; + string advertised_endpoint = 8; +} + +// SiderolinkConnectionSpec describes each node connection information. +message SiderolinkSpec { + string node_subnet = 1; + string node_public_key = 2; + string last_endpoint = 3; + bool connected = 4; + reserved 5; + reserved 6; +} + +// SiderolinkConnectionSpec describes each node connection information. +message SiderolinkCounterSpec { + int64 bytes_received = 1; + int64 bytes_sent = 2; + google.protobuf.Timestamp last_alive = 3; +} + +// ConnectionParamsSpec describes generated kernel parameters for connecting +// the Talos node to Omni. +message ConnectionParamsSpec { + // Args keeps the generated kernel arguments string. + string args = 1; + // ApiEndpoint is the service gRPC API endpoint (external domain/ip, schema and port). + string api_endpoint = 2; + // WireguardEndpoint is the service IP visible from the internal SideroLink network. + string wireguard_endpoint = 3; + // JoinToken is a join token required to connect to SideroLink. + string join_token = 4; +} diff --git a/client/api/omni/specs/siderolink_vtproto.pb.go b/client/api/omni/specs/siderolink_vtproto.pb.go new file mode 100644 index 00000000..da8880a9 --- /dev/null +++ b/client/api/omni/specs/siderolink_vtproto.pb.go @@ -0,0 +1,1339 @@ +// Code generated by protoc-gen-go-vtproto. DO NOT EDIT. +// protoc-gen-go-vtproto version: v0.6.0 +// source: omni/specs/siderolink.proto + +package specs + +import ( + fmt "fmt" + io "io" + + protohelpers "github.com/planetscale/vtprotobuf/protohelpers" + timestamppb1 "github.com/planetscale/vtprotobuf/types/known/timestamppb" + proto "google.golang.org/protobuf/proto" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +func (m *SiderolinkConfigSpec) CloneVT() *SiderolinkConfigSpec { + if m == nil { + return (*SiderolinkConfigSpec)(nil) + } + r := new(SiderolinkConfigSpec) + r.PrivateKey = m.PrivateKey + r.PublicKey = m.PublicKey + r.WireguardEndpoint = m.WireguardEndpoint + r.Subnet = m.Subnet + r.ServerAddress = m.ServerAddress + r.JoinToken = m.JoinToken + r.AdvertisedEndpoint = m.AdvertisedEndpoint + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *SiderolinkConfigSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *SiderolinkSpec) CloneVT() *SiderolinkSpec { + if m == nil { + return (*SiderolinkSpec)(nil) + } + r := new(SiderolinkSpec) + r.NodeSubnet = m.NodeSubnet + r.NodePublicKey = m.NodePublicKey + r.LastEndpoint = m.LastEndpoint + r.Connected = m.Connected + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *SiderolinkSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *SiderolinkCounterSpec) CloneVT() *SiderolinkCounterSpec { + if m == nil { + return (*SiderolinkCounterSpec)(nil) + } + r := new(SiderolinkCounterSpec) + r.BytesReceived = m.BytesReceived + r.BytesSent = m.BytesSent + r.LastAlive = (*timestamppb.Timestamp)((*timestamppb1.Timestamp)(m.LastAlive).CloneVT()) + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *SiderolinkCounterSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *ConnectionParamsSpec) CloneVT() *ConnectionParamsSpec { + if m == nil { + return (*ConnectionParamsSpec)(nil) + } + r := new(ConnectionParamsSpec) + r.Args = m.Args + r.ApiEndpoint = m.ApiEndpoint + r.WireguardEndpoint = m.WireguardEndpoint + r.JoinToken = m.JoinToken + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *ConnectionParamsSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (this *SiderolinkConfigSpec) EqualVT(that *SiderolinkConfigSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.PrivateKey != that.PrivateKey { + return false + } + if this.PublicKey != that.PublicKey { + return false + } + if this.WireguardEndpoint != that.WireguardEndpoint { + return false + } + if this.Subnet != that.Subnet { + return false + } + if this.ServerAddress != that.ServerAddress { + return false + } + if this.JoinToken != that.JoinToken { + return false + } + if this.AdvertisedEndpoint != that.AdvertisedEndpoint { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *SiderolinkConfigSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*SiderolinkConfigSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *SiderolinkSpec) EqualVT(that *SiderolinkSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.NodeSubnet != that.NodeSubnet { + return false + } + if this.NodePublicKey != that.NodePublicKey { + return false + } + if this.LastEndpoint != that.LastEndpoint { + return false + } + if this.Connected != that.Connected { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *SiderolinkSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*SiderolinkSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *SiderolinkCounterSpec) EqualVT(that *SiderolinkCounterSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.BytesReceived != that.BytesReceived { + return false + } + if this.BytesSent != that.BytesSent { + return false + } + if !(*timestamppb1.Timestamp)(this.LastAlive).EqualVT((*timestamppb1.Timestamp)(that.LastAlive)) { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *SiderolinkCounterSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*SiderolinkCounterSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *ConnectionParamsSpec) EqualVT(that *ConnectionParamsSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Args != that.Args { + return false + } + if this.ApiEndpoint != that.ApiEndpoint { + return false + } + if this.WireguardEndpoint != that.WireguardEndpoint { + return false + } + if this.JoinToken != that.JoinToken { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *ConnectionParamsSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*ConnectionParamsSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (m *SiderolinkConfigSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SiderolinkConfigSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *SiderolinkConfigSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.AdvertisedEndpoint) > 0 { + i -= len(m.AdvertisedEndpoint) + copy(dAtA[i:], m.AdvertisedEndpoint) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.AdvertisedEndpoint))) + i-- + dAtA[i] = 0x42 + } + if len(m.JoinToken) > 0 { + i -= len(m.JoinToken) + copy(dAtA[i:], m.JoinToken) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.JoinToken))) + i-- + dAtA[i] = 0x3a + } + if len(m.ServerAddress) > 0 { + i -= len(m.ServerAddress) + copy(dAtA[i:], m.ServerAddress) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ServerAddress))) + i-- + dAtA[i] = 0x32 + } + if len(m.Subnet) > 0 { + i -= len(m.Subnet) + copy(dAtA[i:], m.Subnet) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Subnet))) + i-- + dAtA[i] = 0x2a + } + if len(m.WireguardEndpoint) > 0 { + i -= len(m.WireguardEndpoint) + copy(dAtA[i:], m.WireguardEndpoint) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.WireguardEndpoint))) + i-- + dAtA[i] = 0x1a + } + if len(m.PublicKey) > 0 { + i -= len(m.PublicKey) + copy(dAtA[i:], m.PublicKey) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.PublicKey))) + i-- + dAtA[i] = 0x12 + } + if len(m.PrivateKey) > 0 { + i -= len(m.PrivateKey) + copy(dAtA[i:], m.PrivateKey) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.PrivateKey))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *SiderolinkSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SiderolinkSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *SiderolinkSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.Connected { + i-- + if m.Connected { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x20 + } + if len(m.LastEndpoint) > 0 { + i -= len(m.LastEndpoint) + copy(dAtA[i:], m.LastEndpoint) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.LastEndpoint))) + i-- + dAtA[i] = 0x1a + } + if len(m.NodePublicKey) > 0 { + i -= len(m.NodePublicKey) + copy(dAtA[i:], m.NodePublicKey) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.NodePublicKey))) + i-- + dAtA[i] = 0x12 + } + if len(m.NodeSubnet) > 0 { + i -= len(m.NodeSubnet) + copy(dAtA[i:], m.NodeSubnet) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.NodeSubnet))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *SiderolinkCounterSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SiderolinkCounterSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *SiderolinkCounterSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.LastAlive != nil { + size, err := (*timestamppb1.Timestamp)(m.LastAlive).MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x1a + } + if m.BytesSent != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.BytesSent)) + i-- + dAtA[i] = 0x10 + } + if m.BytesReceived != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.BytesReceived)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *ConnectionParamsSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ConnectionParamsSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *ConnectionParamsSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.JoinToken) > 0 { + i -= len(m.JoinToken) + copy(dAtA[i:], m.JoinToken) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.JoinToken))) + i-- + dAtA[i] = 0x22 + } + if len(m.WireguardEndpoint) > 0 { + i -= len(m.WireguardEndpoint) + copy(dAtA[i:], m.WireguardEndpoint) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.WireguardEndpoint))) + i-- + dAtA[i] = 0x1a + } + if len(m.ApiEndpoint) > 0 { + i -= len(m.ApiEndpoint) + copy(dAtA[i:], m.ApiEndpoint) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ApiEndpoint))) + i-- + dAtA[i] = 0x12 + } + if len(m.Args) > 0 { + i -= len(m.Args) + copy(dAtA[i:], m.Args) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Args))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *SiderolinkConfigSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.PrivateKey) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.PublicKey) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.WireguardEndpoint) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Subnet) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.ServerAddress) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.JoinToken) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.AdvertisedEndpoint) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *SiderolinkSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.NodeSubnet) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.NodePublicKey) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.LastEndpoint) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.Connected { + n += 2 + } + n += len(m.unknownFields) + return n +} + +func (m *SiderolinkCounterSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.BytesReceived != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.BytesReceived)) + } + if m.BytesSent != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.BytesSent)) + } + if m.LastAlive != nil { + l = (*timestamppb1.Timestamp)(m.LastAlive).SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *ConnectionParamsSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Args) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.ApiEndpoint) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.WireguardEndpoint) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.JoinToken) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *SiderolinkConfigSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SiderolinkConfigSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SiderolinkConfigSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PrivateKey", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PrivateKey = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PublicKey", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PublicKey = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field WireguardEndpoint", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.WireguardEndpoint = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Subnet", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Subnet = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ServerAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ServerAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field JoinToken", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.JoinToken = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AdvertisedEndpoint", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AdvertisedEndpoint = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SiderolinkSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SiderolinkSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SiderolinkSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NodeSubnet", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.NodeSubnet = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NodePublicKey", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.NodePublicKey = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LastEndpoint", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.LastEndpoint = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Connected", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Connected = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SiderolinkCounterSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SiderolinkCounterSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SiderolinkCounterSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field BytesReceived", wireType) + } + m.BytesReceived = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.BytesReceived |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field BytesSent", wireType) + } + m.BytesSent = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.BytesSent |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LastAlive", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.LastAlive == nil { + m.LastAlive = ×tamppb.Timestamp{} + } + if err := (*timestamppb1.Timestamp)(m.LastAlive).UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ConnectionParamsSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ConnectionParamsSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ConnectionParamsSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Args", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Args = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ApiEndpoint", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ApiEndpoint = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field WireguardEndpoint", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.WireguardEndpoint = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field JoinToken", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.JoinToken = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} diff --git a/client/api/omni/specs/system.pb.go b/client/api/omni/specs/system.pb.go new file mode 100644 index 00000000..f853685a --- /dev/null +++ b/client/api/omni/specs/system.pb.go @@ -0,0 +1,286 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.32.0 +// protoc v4.24.4 +// source: omni/specs/system.proto + +package specs + +import ( + reflect "reflect" + sync "sync" + + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// DBVersionSpec keeps the current version of the COSI DB. +type DBVersionSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Version uint64 `protobuf:"varint,1,opt,name=version,proto3" json:"version,omitempty"` +} + +func (x *DBVersionSpec) Reset() { + *x = DBVersionSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_system_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DBVersionSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DBVersionSpec) ProtoMessage() {} + +func (x *DBVersionSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_system_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DBVersionSpec.ProtoReflect.Descriptor instead. +func (*DBVersionSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_system_proto_rawDescGZIP(), []int{0} +} + +func (x *DBVersionSpec) GetVersion() uint64 { + if x != nil { + return x.Version + } + return 0 +} + +// SysVersionSpec keeps the current version of Omni. +type SysVersionSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + BackendVersion string `protobuf:"bytes,1,opt,name=backend_version,json=backendVersion,proto3" json:"backend_version,omitempty"` + InstanceName string `protobuf:"bytes,2,opt,name=instance_name,json=instanceName,proto3" json:"instance_name,omitempty"` + BackendApiVersion uint32 `protobuf:"varint,3,opt,name=backend_api_version,json=backendApiVersion,proto3" json:"backend_api_version,omitempty"` +} + +func (x *SysVersionSpec) Reset() { + *x = SysVersionSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_system_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SysVersionSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SysVersionSpec) ProtoMessage() {} + +func (x *SysVersionSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_system_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SysVersionSpec.ProtoReflect.Descriptor instead. +func (*SysVersionSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_system_proto_rawDescGZIP(), []int{1} +} + +func (x *SysVersionSpec) GetBackendVersion() string { + if x != nil { + return x.BackendVersion + } + return "" +} + +func (x *SysVersionSpec) GetInstanceName() string { + if x != nil { + return x.InstanceName + } + return "" +} + +func (x *SysVersionSpec) GetBackendApiVersion() uint32 { + if x != nil { + return x.BackendApiVersion + } + return 0 +} + +// CertRefreshTickSpec is a certificate refresh tick. +type CertRefreshTickSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *CertRefreshTickSpec) Reset() { + *x = CertRefreshTickSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_system_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CertRefreshTickSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CertRefreshTickSpec) ProtoMessage() {} + +func (x *CertRefreshTickSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_system_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CertRefreshTickSpec.ProtoReflect.Descriptor instead. +func (*CertRefreshTickSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_system_proto_rawDescGZIP(), []int{2} +} + +var File_omni_specs_system_proto protoreflect.FileDescriptor + +var file_omni_specs_system_proto_rawDesc = []byte{ + 0x0a, 0x17, 0x6f, 0x6d, 0x6e, 0x69, 0x2f, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2f, 0x73, 0x79, 0x73, + 0x74, 0x65, 0x6d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x73, 0x70, 0x65, 0x63, 0x73, + 0x22, 0x29, 0x0a, 0x0d, 0x44, 0x42, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, + 0x63, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x8e, 0x01, 0x0a, 0x0e, + 0x53, 0x79, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x12, 0x27, + 0x0a, 0x0f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x13, + 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x5f, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x62, 0x61, 0x63, 0x6b, 0x65, + 0x6e, 0x64, 0x41, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x15, 0x0a, 0x13, + 0x43, 0x65, 0x72, 0x74, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x54, 0x69, 0x63, 0x6b, 0x53, + 0x70, 0x65, 0x63, 0x42, 0x32, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x73, 0x69, 0x64, 0x65, 0x72, 0x6f, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x6f, 0x6d, 0x6e, + 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6f, 0x6d, 0x6e, + 0x69, 0x2f, 0x73, 0x70, 0x65, 0x63, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_omni_specs_system_proto_rawDescOnce sync.Once + file_omni_specs_system_proto_rawDescData = file_omni_specs_system_proto_rawDesc +) + +func file_omni_specs_system_proto_rawDescGZIP() []byte { + file_omni_specs_system_proto_rawDescOnce.Do(func() { + file_omni_specs_system_proto_rawDescData = protoimpl.X.CompressGZIP(file_omni_specs_system_proto_rawDescData) + }) + return file_omni_specs_system_proto_rawDescData +} + +var file_omni_specs_system_proto_msgTypes = make([]protoimpl.MessageInfo, 3) +var file_omni_specs_system_proto_goTypes = []interface{}{ + (*DBVersionSpec)(nil), // 0: specs.DBVersionSpec + (*SysVersionSpec)(nil), // 1: specs.SysVersionSpec + (*CertRefreshTickSpec)(nil), // 2: specs.CertRefreshTickSpec +} +var file_omni_specs_system_proto_depIdxs = []int32{ + 0, // [0:0] is the sub-list for method output_type + 0, // [0:0] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_omni_specs_system_proto_init() } +func file_omni_specs_system_proto_init() { + if File_omni_specs_system_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_omni_specs_system_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DBVersionSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_system_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SysVersionSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_system_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CertRefreshTickSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_omni_specs_system_proto_rawDesc, + NumEnums: 0, + NumMessages: 3, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_omni_specs_system_proto_goTypes, + DependencyIndexes: file_omni_specs_system_proto_depIdxs, + MessageInfos: file_omni_specs_system_proto_msgTypes, + }.Build() + File_omni_specs_system_proto = out.File + file_omni_specs_system_proto_rawDesc = nil + file_omni_specs_system_proto_goTypes = nil + file_omni_specs_system_proto_depIdxs = nil +} diff --git a/client/api/omni/specs/system.proto b/client/api/omni/specs/system.proto new file mode 100644 index 00000000..3cf3c496 --- /dev/null +++ b/client/api/omni/specs/system.proto @@ -0,0 +1,20 @@ +syntax = "proto3"; +package specs; + +option go_package = "github.com/siderolabs/omni/client/api/omni/specs"; + +// DBVersionSpec keeps the current version of the COSI DB. +message DBVersionSpec { + uint64 version = 1; +} + +// SysVersionSpec keeps the current version of Omni. +message SysVersionSpec { + string backend_version = 1; + string instance_name = 2; + uint32 backend_api_version = 3; +} + +// CertRefreshTickSpec is a certificate refresh tick. +message CertRefreshTickSpec { +} diff --git a/client/api/omni/specs/system_vtproto.pb.go b/client/api/omni/specs/system_vtproto.pb.go new file mode 100644 index 00000000..3e3dfcf7 --- /dev/null +++ b/client/api/omni/specs/system_vtproto.pb.go @@ -0,0 +1,556 @@ +// Code generated by protoc-gen-go-vtproto. DO NOT EDIT. +// protoc-gen-go-vtproto version: v0.6.0 +// source: omni/specs/system.proto + +package specs + +import ( + fmt "fmt" + io "io" + + protohelpers "github.com/planetscale/vtprotobuf/protohelpers" + proto "google.golang.org/protobuf/proto" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +func (m *DBVersionSpec) CloneVT() *DBVersionSpec { + if m == nil { + return (*DBVersionSpec)(nil) + } + r := new(DBVersionSpec) + r.Version = m.Version + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *DBVersionSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *SysVersionSpec) CloneVT() *SysVersionSpec { + if m == nil { + return (*SysVersionSpec)(nil) + } + r := new(SysVersionSpec) + r.BackendVersion = m.BackendVersion + r.InstanceName = m.InstanceName + r.BackendApiVersion = m.BackendApiVersion + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *SysVersionSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *CertRefreshTickSpec) CloneVT() *CertRefreshTickSpec { + if m == nil { + return (*CertRefreshTickSpec)(nil) + } + r := new(CertRefreshTickSpec) + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *CertRefreshTickSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (this *DBVersionSpec) EqualVT(that *DBVersionSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Version != that.Version { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *DBVersionSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*DBVersionSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *SysVersionSpec) EqualVT(that *SysVersionSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.BackendVersion != that.BackendVersion { + return false + } + if this.InstanceName != that.InstanceName { + return false + } + if this.BackendApiVersion != that.BackendApiVersion { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *SysVersionSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*SysVersionSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *CertRefreshTickSpec) EqualVT(that *CertRefreshTickSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *CertRefreshTickSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*CertRefreshTickSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (m *DBVersionSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DBVersionSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *DBVersionSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.Version != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Version)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *SysVersionSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SysVersionSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *SysVersionSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.BackendApiVersion != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.BackendApiVersion)) + i-- + dAtA[i] = 0x18 + } + if len(m.InstanceName) > 0 { + i -= len(m.InstanceName) + copy(dAtA[i:], m.InstanceName) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.InstanceName))) + i-- + dAtA[i] = 0x12 + } + if len(m.BackendVersion) > 0 { + i -= len(m.BackendVersion) + copy(dAtA[i:], m.BackendVersion) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.BackendVersion))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *CertRefreshTickSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CertRefreshTickSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *CertRefreshTickSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + return len(dAtA) - i, nil +} + +func (m *DBVersionSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Version != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.Version)) + } + n += len(m.unknownFields) + return n +} + +func (m *SysVersionSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.BackendVersion) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.InstanceName) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.BackendApiVersion != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.BackendApiVersion)) + } + n += len(m.unknownFields) + return n +} + +func (m *CertRefreshTickSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + n += len(m.unknownFields) + return n +} + +func (m *DBVersionSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DBVersionSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DBVersionSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) + } + m.Version = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Version |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SysVersionSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SysVersionSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SysVersionSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BackendVersion", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.BackendVersion = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field InstanceName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.InstanceName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field BackendApiVersion", wireType) + } + m.BackendApiVersion = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.BackendApiVersion |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CertRefreshTickSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CertRefreshTickSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CertRefreshTickSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} diff --git a/client/api/omni/specs/virtual.pb.go b/client/api/omni/specs/virtual.pb.go new file mode 100644 index 00000000..13140efb --- /dev/null +++ b/client/api/omni/specs/virtual.pb.go @@ -0,0 +1,489 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.32.0 +// protoc v4.24.4 +// source: omni/specs/virtual.proto + +package specs + +import ( + reflect "reflect" + sync "sync" + + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type CurrentUserSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Identity string `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` + Role string `protobuf:"bytes,3,opt,name=role,proto3" json:"role,omitempty"` +} + +func (x *CurrentUserSpec) Reset() { + *x = CurrentUserSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_virtual_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CurrentUserSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CurrentUserSpec) ProtoMessage() {} + +func (x *CurrentUserSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_virtual_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CurrentUserSpec.ProtoReflect.Descriptor instead. +func (*CurrentUserSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_virtual_proto_rawDescGZIP(), []int{0} +} + +func (x *CurrentUserSpec) GetIdentity() string { + if x != nil { + return x.Identity + } + return "" +} + +func (x *CurrentUserSpec) GetRole() string { + if x != nil { + return x.Role + } + return "" +} + +type PermissionsSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + CanReadClusters bool `protobuf:"varint,1,opt,name=can_read_clusters,json=canReadClusters,proto3" json:"can_read_clusters,omitempty"` + CanCreateClusters bool `protobuf:"varint,2,opt,name=can_create_clusters,json=canCreateClusters,proto3" json:"can_create_clusters,omitempty"` + CanManageUsers bool `protobuf:"varint,3,opt,name=can_manage_users,json=canManageUsers,proto3" json:"can_manage_users,omitempty"` + CanReadMachines bool `protobuf:"varint,4,opt,name=can_read_machines,json=canReadMachines,proto3" json:"can_read_machines,omitempty"` + CanRemoveMachines bool `protobuf:"varint,5,opt,name=can_remove_machines,json=canRemoveMachines,proto3" json:"can_remove_machines,omitempty"` + CanReadMachineLogs bool `protobuf:"varint,6,opt,name=can_read_machine_logs,json=canReadMachineLogs,proto3" json:"can_read_machine_logs,omitempty"` + CanReadMachineConfigPatches bool `protobuf:"varint,9,opt,name=can_read_machine_config_patches,json=canReadMachineConfigPatches,proto3" json:"can_read_machine_config_patches,omitempty"` + CanManageMachineConfigPatches bool `protobuf:"varint,10,opt,name=can_manage_machine_config_patches,json=canManageMachineConfigPatches,proto3" json:"can_manage_machine_config_patches,omitempty"` + CanManageBackupStore bool `protobuf:"varint,11,opt,name=can_manage_backup_store,json=canManageBackupStore,proto3" json:"can_manage_backup_store,omitempty"` +} + +func (x *PermissionsSpec) Reset() { + *x = PermissionsSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_virtual_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PermissionsSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PermissionsSpec) ProtoMessage() {} + +func (x *PermissionsSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_virtual_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PermissionsSpec.ProtoReflect.Descriptor instead. +func (*PermissionsSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_virtual_proto_rawDescGZIP(), []int{1} +} + +func (x *PermissionsSpec) GetCanReadClusters() bool { + if x != nil { + return x.CanReadClusters + } + return false +} + +func (x *PermissionsSpec) GetCanCreateClusters() bool { + if x != nil { + return x.CanCreateClusters + } + return false +} + +func (x *PermissionsSpec) GetCanManageUsers() bool { + if x != nil { + return x.CanManageUsers + } + return false +} + +func (x *PermissionsSpec) GetCanReadMachines() bool { + if x != nil { + return x.CanReadMachines + } + return false +} + +func (x *PermissionsSpec) GetCanRemoveMachines() bool { + if x != nil { + return x.CanRemoveMachines + } + return false +} + +func (x *PermissionsSpec) GetCanReadMachineLogs() bool { + if x != nil { + return x.CanReadMachineLogs + } + return false +} + +func (x *PermissionsSpec) GetCanReadMachineConfigPatches() bool { + if x != nil { + return x.CanReadMachineConfigPatches + } + return false +} + +func (x *PermissionsSpec) GetCanManageMachineConfigPatches() bool { + if x != nil { + return x.CanManageMachineConfigPatches + } + return false +} + +func (x *PermissionsSpec) GetCanManageBackupStore() bool { + if x != nil { + return x.CanManageBackupStore + } + return false +} + +type ClusterPermissionsSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + CanAddMachines bool `protobuf:"varint,1,opt,name=can_add_machines,json=canAddMachines,proto3" json:"can_add_machines,omitempty"` + CanRemoveMachines bool `protobuf:"varint,2,opt,name=can_remove_machines,json=canRemoveMachines,proto3" json:"can_remove_machines,omitempty"` + CanRebootMachines bool `protobuf:"varint,3,opt,name=can_reboot_machines,json=canRebootMachines,proto3" json:"can_reboot_machines,omitempty"` + CanUpdateKubernetes bool `protobuf:"varint,4,opt,name=can_update_kubernetes,json=canUpdateKubernetes,proto3" json:"can_update_kubernetes,omitempty"` + CanDownloadKubeconfig bool `protobuf:"varint,5,opt,name=can_download_kubeconfig,json=canDownloadKubeconfig,proto3" json:"can_download_kubeconfig,omitempty"` + CanSyncKubernetesManifests bool `protobuf:"varint,6,opt,name=can_sync_kubernetes_manifests,json=canSyncKubernetesManifests,proto3" json:"can_sync_kubernetes_manifests,omitempty"` + CanUpdateTalos bool `protobuf:"varint,7,opt,name=can_update_talos,json=canUpdateTalos,proto3" json:"can_update_talos,omitempty"` + CanDownloadTalosconfig bool `protobuf:"varint,8,opt,name=can_download_talosconfig,json=canDownloadTalosconfig,proto3" json:"can_download_talosconfig,omitempty"` + CanReadConfigPatches bool `protobuf:"varint,9,opt,name=can_read_config_patches,json=canReadConfigPatches,proto3" json:"can_read_config_patches,omitempty"` + CanManageConfigPatches bool `protobuf:"varint,10,opt,name=can_manage_config_patches,json=canManageConfigPatches,proto3" json:"can_manage_config_patches,omitempty"` + CanManageClusterFeatures bool `protobuf:"varint,11,opt,name=can_manage_cluster_features,json=canManageClusterFeatures,proto3" json:"can_manage_cluster_features,omitempty"` +} + +func (x *ClusterPermissionsSpec) Reset() { + *x = ClusterPermissionsSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_omni_specs_virtual_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ClusterPermissionsSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClusterPermissionsSpec) ProtoMessage() {} + +func (x *ClusterPermissionsSpec) ProtoReflect() protoreflect.Message { + mi := &file_omni_specs_virtual_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ClusterPermissionsSpec.ProtoReflect.Descriptor instead. +func (*ClusterPermissionsSpec) Descriptor() ([]byte, []int) { + return file_omni_specs_virtual_proto_rawDescGZIP(), []int{2} +} + +func (x *ClusterPermissionsSpec) GetCanAddMachines() bool { + if x != nil { + return x.CanAddMachines + } + return false +} + +func (x *ClusterPermissionsSpec) GetCanRemoveMachines() bool { + if x != nil { + return x.CanRemoveMachines + } + return false +} + +func (x *ClusterPermissionsSpec) GetCanRebootMachines() bool { + if x != nil { + return x.CanRebootMachines + } + return false +} + +func (x *ClusterPermissionsSpec) GetCanUpdateKubernetes() bool { + if x != nil { + return x.CanUpdateKubernetes + } + return false +} + +func (x *ClusterPermissionsSpec) GetCanDownloadKubeconfig() bool { + if x != nil { + return x.CanDownloadKubeconfig + } + return false +} + +func (x *ClusterPermissionsSpec) GetCanSyncKubernetesManifests() bool { + if x != nil { + return x.CanSyncKubernetesManifests + } + return false +} + +func (x *ClusterPermissionsSpec) GetCanUpdateTalos() bool { + if x != nil { + return x.CanUpdateTalos + } + return false +} + +func (x *ClusterPermissionsSpec) GetCanDownloadTalosconfig() bool { + if x != nil { + return x.CanDownloadTalosconfig + } + return false +} + +func (x *ClusterPermissionsSpec) GetCanReadConfigPatches() bool { + if x != nil { + return x.CanReadConfigPatches + } + return false +} + +func (x *ClusterPermissionsSpec) GetCanManageConfigPatches() bool { + if x != nil { + return x.CanManageConfigPatches + } + return false +} + +func (x *ClusterPermissionsSpec) GetCanManageClusterFeatures() bool { + if x != nil { + return x.CanManageClusterFeatures + } + return false +} + +var File_omni_specs_virtual_proto protoreflect.FileDescriptor + +var file_omni_specs_virtual_proto_rawDesc = []byte{ + 0x0a, 0x18, 0x6f, 0x6d, 0x6e, 0x69, 0x2f, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2f, 0x76, 0x69, 0x72, + 0x74, 0x75, 0x61, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x73, 0x70, 0x65, 0x63, + 0x73, 0x22, 0x47, 0x0a, 0x0f, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x55, 0x73, 0x65, 0x72, + 0x53, 0x70, 0x65, 0x63, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x72, 0x6f, 0x6c, 0x65, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x22, 0xed, 0x03, 0x0a, 0x0f, 0x50, + 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x2a, + 0x0a, 0x11, 0x63, 0x61, 0x6e, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x63, 0x61, 0x6e, 0x52, 0x65, + 0x61, 0x64, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x61, + 0x6e, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x63, 0x61, 0x6e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x63, 0x61, + 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x63, 0x61, 0x6e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x55, + 0x73, 0x65, 0x72, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x63, 0x61, 0x6e, 0x5f, 0x72, 0x65, 0x61, 0x64, + 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0f, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x61, 0x64, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, + 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x61, 0x6e, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x5f, 0x6d, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x63, + 0x61, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, + 0x12, 0x31, 0x0a, 0x15, 0x63, 0x61, 0x6e, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x61, 0x63, + 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x12, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x61, 0x64, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4c, + 0x6f, 0x67, 0x73, 0x12, 0x44, 0x0a, 0x1f, 0x63, 0x61, 0x6e, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, + 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x70, + 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1b, 0x63, 0x61, + 0x6e, 0x52, 0x65, 0x61, 0x64, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x50, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x12, 0x48, 0x0a, 0x21, 0x63, 0x61, 0x6e, + 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x70, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x1d, 0x63, 0x61, 0x6e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x4d, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x50, 0x61, 0x74, 0x63, + 0x68, 0x65, 0x73, 0x12, 0x35, 0x0a, 0x17, 0x63, 0x61, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x63, 0x61, 0x6e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x42, + 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x22, 0xe6, 0x04, 0x0a, 0x16, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x28, 0x0a, 0x10, 0x63, 0x61, 0x6e, 0x5f, 0x61, 0x64, 0x64, + 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0e, 0x63, 0x61, 0x6e, 0x41, 0x64, 0x64, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x12, + 0x2e, 0x0a, 0x13, 0x63, 0x61, 0x6e, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x5f, 0x6d, 0x61, + 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x63, 0x61, + 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x12, + 0x2e, 0x0a, 0x13, 0x63, 0x61, 0x6e, 0x5f, 0x72, 0x65, 0x62, 0x6f, 0x6f, 0x74, 0x5f, 0x6d, 0x61, + 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x63, 0x61, + 0x6e, 0x52, 0x65, 0x62, 0x6f, 0x6f, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x12, + 0x32, 0x0a, 0x15, 0x63, 0x61, 0x6e, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x75, + 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, + 0x63, 0x61, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, + 0x74, 0x65, 0x73, 0x12, 0x36, 0x0a, 0x17, 0x63, 0x61, 0x6e, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, + 0x6f, 0x61, 0x64, 0x5f, 0x6b, 0x75, 0x62, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x63, 0x61, 0x6e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, + 0x64, 0x4b, 0x75, 0x62, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x41, 0x0a, 0x1d, 0x63, + 0x61, 0x6e, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, + 0x65, 0x73, 0x5f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x1a, 0x63, 0x61, 0x6e, 0x53, 0x79, 0x6e, 0x63, 0x4b, 0x75, 0x62, 0x65, 0x72, + 0x6e, 0x65, 0x74, 0x65, 0x73, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x73, 0x12, 0x28, + 0x0a, 0x10, 0x63, 0x61, 0x6e, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x61, 0x6c, + 0x6f, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x63, 0x61, 0x6e, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x54, 0x61, 0x6c, 0x6f, 0x73, 0x12, 0x38, 0x0a, 0x18, 0x63, 0x61, 0x6e, 0x5f, + 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x74, 0x61, 0x6c, 0x6f, 0x73, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x63, 0x61, 0x6e, 0x44, + 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x54, 0x61, 0x6c, 0x6f, 0x73, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x12, 0x35, 0x0a, 0x17, 0x63, 0x61, 0x6e, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x70, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x14, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x50, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x19, 0x63, 0x61, 0x6e, + 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x70, + 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x63, 0x61, + 0x6e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x50, 0x61, 0x74, + 0x63, 0x68, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x1b, 0x63, 0x61, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x63, 0x61, 0x6e, 0x4d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x46, 0x65, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x73, 0x42, 0x32, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x73, 0x69, 0x64, 0x65, 0x72, 0x6f, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x6f, 0x6d, 0x6e, + 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6f, 0x6d, 0x6e, + 0x69, 0x2f, 0x73, 0x70, 0x65, 0x63, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_omni_specs_virtual_proto_rawDescOnce sync.Once + file_omni_specs_virtual_proto_rawDescData = file_omni_specs_virtual_proto_rawDesc +) + +func file_omni_specs_virtual_proto_rawDescGZIP() []byte { + file_omni_specs_virtual_proto_rawDescOnce.Do(func() { + file_omni_specs_virtual_proto_rawDescData = protoimpl.X.CompressGZIP(file_omni_specs_virtual_proto_rawDescData) + }) + return file_omni_specs_virtual_proto_rawDescData +} + +var file_omni_specs_virtual_proto_msgTypes = make([]protoimpl.MessageInfo, 3) +var file_omni_specs_virtual_proto_goTypes = []interface{}{ + (*CurrentUserSpec)(nil), // 0: specs.CurrentUserSpec + (*PermissionsSpec)(nil), // 1: specs.PermissionsSpec + (*ClusterPermissionsSpec)(nil), // 2: specs.ClusterPermissionsSpec +} +var file_omni_specs_virtual_proto_depIdxs = []int32{ + 0, // [0:0] is the sub-list for method output_type + 0, // [0:0] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_omni_specs_virtual_proto_init() } +func file_omni_specs_virtual_proto_init() { + if File_omni_specs_virtual_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_omni_specs_virtual_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CurrentUserSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_virtual_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PermissionsSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_omni_specs_virtual_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ClusterPermissionsSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_omni_specs_virtual_proto_rawDesc, + NumEnums: 0, + NumMessages: 3, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_omni_specs_virtual_proto_goTypes, + DependencyIndexes: file_omni_specs_virtual_proto_depIdxs, + MessageInfos: file_omni_specs_virtual_proto_msgTypes, + }.Build() + File_omni_specs_virtual_proto = out.File + file_omni_specs_virtual_proto_rawDesc = nil + file_omni_specs_virtual_proto_goTypes = nil + file_omni_specs_virtual_proto_depIdxs = nil +} diff --git a/client/api/omni/specs/virtual.proto b/client/api/omni/specs/virtual.proto new file mode 100644 index 00000000..5fdaa908 --- /dev/null +++ b/client/api/omni/specs/virtual.proto @@ -0,0 +1,36 @@ +syntax = "proto3"; +package specs; + +option go_package = "github.com/siderolabs/omni/client/api/omni/specs"; + +message CurrentUserSpec { + string identity = 1; + reserved 2; + string role = 3; +} + +message PermissionsSpec { + bool can_read_clusters = 1; + bool can_create_clusters = 2; + bool can_manage_users = 3; + bool can_read_machines = 4; + bool can_remove_machines = 5; + bool can_read_machine_logs = 6; + bool can_read_machine_config_patches = 9; + bool can_manage_machine_config_patches = 10; + bool can_manage_backup_store = 11; +} + +message ClusterPermissionsSpec { + bool can_add_machines = 1; + bool can_remove_machines = 2; + bool can_reboot_machines = 3; + bool can_update_kubernetes = 4; + bool can_download_kubeconfig = 5; + bool can_sync_kubernetes_manifests = 6; + bool can_update_talos = 7; + bool can_download_talosconfig = 8; + bool can_read_config_patches = 9; + bool can_manage_config_patches = 10; + bool can_manage_cluster_features = 11; +} diff --git a/client/api/omni/specs/virtual_vtproto.pb.go b/client/api/omni/specs/virtual_vtproto.pb.go new file mode 100644 index 00000000..9e404056 --- /dev/null +++ b/client/api/omni/specs/virtual_vtproto.pb.go @@ -0,0 +1,1234 @@ +// Code generated by protoc-gen-go-vtproto. DO NOT EDIT. +// protoc-gen-go-vtproto version: v0.6.0 +// source: omni/specs/virtual.proto + +package specs + +import ( + fmt "fmt" + io "io" + + protohelpers "github.com/planetscale/vtprotobuf/protohelpers" + proto "google.golang.org/protobuf/proto" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +func (m *CurrentUserSpec) CloneVT() *CurrentUserSpec { + if m == nil { + return (*CurrentUserSpec)(nil) + } + r := new(CurrentUserSpec) + r.Identity = m.Identity + r.Role = m.Role + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *CurrentUserSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *PermissionsSpec) CloneVT() *PermissionsSpec { + if m == nil { + return (*PermissionsSpec)(nil) + } + r := new(PermissionsSpec) + r.CanReadClusters = m.CanReadClusters + r.CanCreateClusters = m.CanCreateClusters + r.CanManageUsers = m.CanManageUsers + r.CanReadMachines = m.CanReadMachines + r.CanRemoveMachines = m.CanRemoveMachines + r.CanReadMachineLogs = m.CanReadMachineLogs + r.CanReadMachineConfigPatches = m.CanReadMachineConfigPatches + r.CanManageMachineConfigPatches = m.CanManageMachineConfigPatches + r.CanManageBackupStore = m.CanManageBackupStore + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *PermissionsSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *ClusterPermissionsSpec) CloneVT() *ClusterPermissionsSpec { + if m == nil { + return (*ClusterPermissionsSpec)(nil) + } + r := new(ClusterPermissionsSpec) + r.CanAddMachines = m.CanAddMachines + r.CanRemoveMachines = m.CanRemoveMachines + r.CanRebootMachines = m.CanRebootMachines + r.CanUpdateKubernetes = m.CanUpdateKubernetes + r.CanDownloadKubeconfig = m.CanDownloadKubeconfig + r.CanSyncKubernetesManifests = m.CanSyncKubernetesManifests + r.CanUpdateTalos = m.CanUpdateTalos + r.CanDownloadTalosconfig = m.CanDownloadTalosconfig + r.CanReadConfigPatches = m.CanReadConfigPatches + r.CanManageConfigPatches = m.CanManageConfigPatches + r.CanManageClusterFeatures = m.CanManageClusterFeatures + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *ClusterPermissionsSpec) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (this *CurrentUserSpec) EqualVT(that *CurrentUserSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Identity != that.Identity { + return false + } + if this.Role != that.Role { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *CurrentUserSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*CurrentUserSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *PermissionsSpec) EqualVT(that *PermissionsSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.CanReadClusters != that.CanReadClusters { + return false + } + if this.CanCreateClusters != that.CanCreateClusters { + return false + } + if this.CanManageUsers != that.CanManageUsers { + return false + } + if this.CanReadMachines != that.CanReadMachines { + return false + } + if this.CanRemoveMachines != that.CanRemoveMachines { + return false + } + if this.CanReadMachineLogs != that.CanReadMachineLogs { + return false + } + if this.CanReadMachineConfigPatches != that.CanReadMachineConfigPatches { + return false + } + if this.CanManageMachineConfigPatches != that.CanManageMachineConfigPatches { + return false + } + if this.CanManageBackupStore != that.CanManageBackupStore { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *PermissionsSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*PermissionsSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *ClusterPermissionsSpec) EqualVT(that *ClusterPermissionsSpec) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.CanAddMachines != that.CanAddMachines { + return false + } + if this.CanRemoveMachines != that.CanRemoveMachines { + return false + } + if this.CanRebootMachines != that.CanRebootMachines { + return false + } + if this.CanUpdateKubernetes != that.CanUpdateKubernetes { + return false + } + if this.CanDownloadKubeconfig != that.CanDownloadKubeconfig { + return false + } + if this.CanSyncKubernetesManifests != that.CanSyncKubernetesManifests { + return false + } + if this.CanUpdateTalos != that.CanUpdateTalos { + return false + } + if this.CanDownloadTalosconfig != that.CanDownloadTalosconfig { + return false + } + if this.CanReadConfigPatches != that.CanReadConfigPatches { + return false + } + if this.CanManageConfigPatches != that.CanManageConfigPatches { + return false + } + if this.CanManageClusterFeatures != that.CanManageClusterFeatures { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *ClusterPermissionsSpec) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*ClusterPermissionsSpec) + if !ok { + return false + } + return this.EqualVT(that) +} +func (m *CurrentUserSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CurrentUserSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *CurrentUserSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Role) > 0 { + i -= len(m.Role) + copy(dAtA[i:], m.Role) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Role))) + i-- + dAtA[i] = 0x1a + } + if len(m.Identity) > 0 { + i -= len(m.Identity) + copy(dAtA[i:], m.Identity) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Identity))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *PermissionsSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PermissionsSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *PermissionsSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.CanManageBackupStore { + i-- + if m.CanManageBackupStore { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x58 + } + if m.CanManageMachineConfigPatches { + i-- + if m.CanManageMachineConfigPatches { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x50 + } + if m.CanReadMachineConfigPatches { + i-- + if m.CanReadMachineConfigPatches { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x48 + } + if m.CanReadMachineLogs { + i-- + if m.CanReadMachineLogs { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x30 + } + if m.CanRemoveMachines { + i-- + if m.CanRemoveMachines { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x28 + } + if m.CanReadMachines { + i-- + if m.CanReadMachines { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x20 + } + if m.CanManageUsers { + i-- + if m.CanManageUsers { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x18 + } + if m.CanCreateClusters { + i-- + if m.CanCreateClusters { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x10 + } + if m.CanReadClusters { + i-- + if m.CanReadClusters { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *ClusterPermissionsSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ClusterPermissionsSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *ClusterPermissionsSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.CanManageClusterFeatures { + i-- + if m.CanManageClusterFeatures { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x58 + } + if m.CanManageConfigPatches { + i-- + if m.CanManageConfigPatches { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x50 + } + if m.CanReadConfigPatches { + i-- + if m.CanReadConfigPatches { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x48 + } + if m.CanDownloadTalosconfig { + i-- + if m.CanDownloadTalosconfig { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x40 + } + if m.CanUpdateTalos { + i-- + if m.CanUpdateTalos { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x38 + } + if m.CanSyncKubernetesManifests { + i-- + if m.CanSyncKubernetesManifests { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x30 + } + if m.CanDownloadKubeconfig { + i-- + if m.CanDownloadKubeconfig { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x28 + } + if m.CanUpdateKubernetes { + i-- + if m.CanUpdateKubernetes { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x20 + } + if m.CanRebootMachines { + i-- + if m.CanRebootMachines { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x18 + } + if m.CanRemoveMachines { + i-- + if m.CanRemoveMachines { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x10 + } + if m.CanAddMachines { + i-- + if m.CanAddMachines { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *CurrentUserSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Identity) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Role) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *PermissionsSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.CanReadClusters { + n += 2 + } + if m.CanCreateClusters { + n += 2 + } + if m.CanManageUsers { + n += 2 + } + if m.CanReadMachines { + n += 2 + } + if m.CanRemoveMachines { + n += 2 + } + if m.CanReadMachineLogs { + n += 2 + } + if m.CanReadMachineConfigPatches { + n += 2 + } + if m.CanManageMachineConfigPatches { + n += 2 + } + if m.CanManageBackupStore { + n += 2 + } + n += len(m.unknownFields) + return n +} + +func (m *ClusterPermissionsSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.CanAddMachines { + n += 2 + } + if m.CanRemoveMachines { + n += 2 + } + if m.CanRebootMachines { + n += 2 + } + if m.CanUpdateKubernetes { + n += 2 + } + if m.CanDownloadKubeconfig { + n += 2 + } + if m.CanSyncKubernetesManifests { + n += 2 + } + if m.CanUpdateTalos { + n += 2 + } + if m.CanDownloadTalosconfig { + n += 2 + } + if m.CanReadConfigPatches { + n += 2 + } + if m.CanManageConfigPatches { + n += 2 + } + if m.CanManageClusterFeatures { + n += 2 + } + n += len(m.unknownFields) + return n +} + +func (m *CurrentUserSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CurrentUserSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CurrentUserSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Identity = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Role", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Role = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PermissionsSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PermissionsSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PermissionsSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CanReadClusters", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.CanReadClusters = bool(v != 0) + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CanCreateClusters", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.CanCreateClusters = bool(v != 0) + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CanManageUsers", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.CanManageUsers = bool(v != 0) + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CanReadMachines", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.CanReadMachines = bool(v != 0) + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CanRemoveMachines", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.CanRemoveMachines = bool(v != 0) + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CanReadMachineLogs", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.CanReadMachineLogs = bool(v != 0) + case 9: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CanReadMachineConfigPatches", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.CanReadMachineConfigPatches = bool(v != 0) + case 10: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CanManageMachineConfigPatches", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.CanManageMachineConfigPatches = bool(v != 0) + case 11: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CanManageBackupStore", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.CanManageBackupStore = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ClusterPermissionsSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ClusterPermissionsSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ClusterPermissionsSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CanAddMachines", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.CanAddMachines = bool(v != 0) + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CanRemoveMachines", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.CanRemoveMachines = bool(v != 0) + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CanRebootMachines", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.CanRebootMachines = bool(v != 0) + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CanUpdateKubernetes", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.CanUpdateKubernetes = bool(v != 0) + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CanDownloadKubeconfig", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.CanDownloadKubeconfig = bool(v != 0) + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CanSyncKubernetesManifests", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.CanSyncKubernetesManifests = bool(v != 0) + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CanUpdateTalos", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.CanUpdateTalos = bool(v != 0) + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CanDownloadTalosconfig", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.CanDownloadTalosconfig = bool(v != 0) + case 9: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CanReadConfigPatches", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.CanReadConfigPatches = bool(v != 0) + case 10: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CanManageConfigPatches", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.CanManageConfigPatches = bool(v != 0) + case 11: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CanManageClusterFeatures", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.CanManageClusterFeatures = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} diff --git a/client/api/talos/machine/machine.pb.gw.go b/client/api/talos/machine/machine.pb.gw.go new file mode 100644 index 00000000..b901f512 --- /dev/null +++ b/client/api/talos/machine/machine.pb.gw.go @@ -0,0 +1,3016 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: talos/machine/machine.proto + +/* +Package machine is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package machine + +import ( + "context" + "io" + "net/http" + + "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" + extCommon "github.com/siderolabs/talos/pkg/machinery/api/common" + extMachine "github.com/siderolabs/talos/pkg/machinery/api/machine" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" + extEmptypb "google.golang.org/protobuf/types/known/emptypb" +) + +// Suppress "imported and not used" errors +var _ codes.Code +var _ io.Reader +var _ status.Status +var _ = runtime.String +var _ = utilities.NewDoubleArray +var _ = metadata.Join + +func request_MachineService_ApplyConfiguration_0(ctx context.Context, marshaler runtime.Marshaler, client extMachine.MachineServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extMachine.ApplyConfigurationRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.ApplyConfiguration(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_MachineService_ApplyConfiguration_0(ctx context.Context, marshaler runtime.Marshaler, server extMachine.MachineServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extMachine.ApplyConfigurationRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.ApplyConfiguration(ctx, &protoReq) + return msg, metadata, err + +} + +func request_MachineService_Bootstrap_0(ctx context.Context, marshaler runtime.Marshaler, client extMachine.MachineServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extMachine.BootstrapRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.Bootstrap(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_MachineService_Bootstrap_0(ctx context.Context, marshaler runtime.Marshaler, server extMachine.MachineServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extMachine.BootstrapRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.Bootstrap(ctx, &protoReq) + return msg, metadata, err + +} + +func request_MachineService_Containers_0(ctx context.Context, marshaler runtime.Marshaler, client extMachine.MachineServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extMachine.ContainersRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.Containers(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_MachineService_Containers_0(ctx context.Context, marshaler runtime.Marshaler, server extMachine.MachineServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extMachine.ContainersRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.Containers(ctx, &protoReq) + return msg, metadata, err + +} + +func request_MachineService_Copy_0(ctx context.Context, marshaler runtime.Marshaler, client extMachine.MachineServiceClient, req *http.Request, pathParams map[string]string) (extMachine.MachineService_CopyClient, runtime.ServerMetadata, error) { + var protoReq extMachine.CopyRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + stream, err := client.Copy(ctx, &protoReq) + if err != nil { + return nil, metadata, err + } + header, err := stream.Header() + if err != nil { + return nil, metadata, err + } + metadata.HeaderMD = header + return stream, metadata, nil + +} + +func request_MachineService_CPUInfo_0(ctx context.Context, marshaler runtime.Marshaler, client extMachine.MachineServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extEmptypb.Empty + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.CPUInfo(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_MachineService_CPUInfo_0(ctx context.Context, marshaler runtime.Marshaler, server extMachine.MachineServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extEmptypb.Empty + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.CPUInfo(ctx, &protoReq) + return msg, metadata, err + +} + +func request_MachineService_DiskStats_0(ctx context.Context, marshaler runtime.Marshaler, client extMachine.MachineServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extEmptypb.Empty + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.DiskStats(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_MachineService_DiskStats_0(ctx context.Context, marshaler runtime.Marshaler, server extMachine.MachineServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extEmptypb.Empty + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.DiskStats(ctx, &protoReq) + return msg, metadata, err + +} + +func request_MachineService_Dmesg_0(ctx context.Context, marshaler runtime.Marshaler, client extMachine.MachineServiceClient, req *http.Request, pathParams map[string]string) (extMachine.MachineService_DmesgClient, runtime.ServerMetadata, error) { + var protoReq extMachine.DmesgRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + stream, err := client.Dmesg(ctx, &protoReq) + if err != nil { + return nil, metadata, err + } + header, err := stream.Header() + if err != nil { + return nil, metadata, err + } + metadata.HeaderMD = header + return stream, metadata, nil + +} + +func request_MachineService_Events_0(ctx context.Context, marshaler runtime.Marshaler, client extMachine.MachineServiceClient, req *http.Request, pathParams map[string]string) (extMachine.MachineService_EventsClient, runtime.ServerMetadata, error) { + var protoReq extMachine.EventsRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + stream, err := client.Events(ctx, &protoReq) + if err != nil { + return nil, metadata, err + } + header, err := stream.Header() + if err != nil { + return nil, metadata, err + } + metadata.HeaderMD = header + return stream, metadata, nil + +} + +func request_MachineService_EtcdMemberList_0(ctx context.Context, marshaler runtime.Marshaler, client extMachine.MachineServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extMachine.EtcdMemberListRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.EtcdMemberList(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_MachineService_EtcdMemberList_0(ctx context.Context, marshaler runtime.Marshaler, server extMachine.MachineServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extMachine.EtcdMemberListRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.EtcdMemberList(ctx, &protoReq) + return msg, metadata, err + +} + +func request_MachineService_EtcdRemoveMember_0(ctx context.Context, marshaler runtime.Marshaler, client extMachine.MachineServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extMachine.EtcdRemoveMemberRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.EtcdRemoveMember(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_MachineService_EtcdRemoveMember_0(ctx context.Context, marshaler runtime.Marshaler, server extMachine.MachineServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extMachine.EtcdRemoveMemberRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.EtcdRemoveMember(ctx, &protoReq) + return msg, metadata, err + +} + +func request_MachineService_EtcdLeaveCluster_0(ctx context.Context, marshaler runtime.Marshaler, client extMachine.MachineServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extMachine.EtcdLeaveClusterRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.EtcdLeaveCluster(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_MachineService_EtcdLeaveCluster_0(ctx context.Context, marshaler runtime.Marshaler, server extMachine.MachineServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extMachine.EtcdLeaveClusterRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.EtcdLeaveCluster(ctx, &protoReq) + return msg, metadata, err + +} + +func request_MachineService_EtcdForfeitLeadership_0(ctx context.Context, marshaler runtime.Marshaler, client extMachine.MachineServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extMachine.EtcdForfeitLeadershipRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.EtcdForfeitLeadership(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_MachineService_EtcdForfeitLeadership_0(ctx context.Context, marshaler runtime.Marshaler, server extMachine.MachineServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extMachine.EtcdForfeitLeadershipRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.EtcdForfeitLeadership(ctx, &protoReq) + return msg, metadata, err + +} + +func request_MachineService_EtcdRecover_0(ctx context.Context, marshaler runtime.Marshaler, client extMachine.MachineServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var metadata runtime.ServerMetadata + stream, err := client.EtcdRecover(ctx) + if err != nil { + grpclog.Infof("Failed to start streaming: %v", err) + return nil, metadata, err + } + dec := marshaler.NewDecoder(req.Body) + for { + var protoReq extCommon.Data + err = dec.Decode(&protoReq) + if err == io.EOF { + break + } + if err != nil { + grpclog.Infof("Failed to decode request: %v", err) + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err = stream.Send(&protoReq); err != nil { + if err == io.EOF { + break + } + grpclog.Infof("Failed to send request: %v", err) + return nil, metadata, err + } + } + + if err := stream.CloseSend(); err != nil { + grpclog.Infof("Failed to terminate client stream: %v", err) + return nil, metadata, err + } + header, err := stream.Header() + if err != nil { + grpclog.Infof("Failed to get header from client: %v", err) + return nil, metadata, err + } + metadata.HeaderMD = header + + msg, err := stream.CloseAndRecv() + metadata.TrailerMD = stream.Trailer() + return msg, metadata, err + +} + +func request_MachineService_EtcdSnapshot_0(ctx context.Context, marshaler runtime.Marshaler, client extMachine.MachineServiceClient, req *http.Request, pathParams map[string]string) (extMachine.MachineService_EtcdSnapshotClient, runtime.ServerMetadata, error) { + var protoReq extMachine.EtcdSnapshotRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + stream, err := client.EtcdSnapshot(ctx, &protoReq) + if err != nil { + return nil, metadata, err + } + header, err := stream.Header() + if err != nil { + return nil, metadata, err + } + metadata.HeaderMD = header + return stream, metadata, nil + +} + +func request_MachineService_GenerateConfiguration_0(ctx context.Context, marshaler runtime.Marshaler, client extMachine.MachineServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extMachine.GenerateConfigurationRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.GenerateConfiguration(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_MachineService_GenerateConfiguration_0(ctx context.Context, marshaler runtime.Marshaler, server extMachine.MachineServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extMachine.GenerateConfigurationRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.GenerateConfiguration(ctx, &protoReq) + return msg, metadata, err + +} + +func request_MachineService_Hostname_0(ctx context.Context, marshaler runtime.Marshaler, client extMachine.MachineServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extEmptypb.Empty + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.Hostname(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_MachineService_Hostname_0(ctx context.Context, marshaler runtime.Marshaler, server extMachine.MachineServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extEmptypb.Empty + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.Hostname(ctx, &protoReq) + return msg, metadata, err + +} + +func request_MachineService_Kubeconfig_0(ctx context.Context, marshaler runtime.Marshaler, client extMachine.MachineServiceClient, req *http.Request, pathParams map[string]string) (extMachine.MachineService_KubeconfigClient, runtime.ServerMetadata, error) { + var protoReq extEmptypb.Empty + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + stream, err := client.Kubeconfig(ctx, &protoReq) + if err != nil { + return nil, metadata, err + } + header, err := stream.Header() + if err != nil { + return nil, metadata, err + } + metadata.HeaderMD = header + return stream, metadata, nil + +} + +func request_MachineService_List_0(ctx context.Context, marshaler runtime.Marshaler, client extMachine.MachineServiceClient, req *http.Request, pathParams map[string]string) (extMachine.MachineService_ListClient, runtime.ServerMetadata, error) { + var protoReq extMachine.ListRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + stream, err := client.List(ctx, &protoReq) + if err != nil { + return nil, metadata, err + } + header, err := stream.Header() + if err != nil { + return nil, metadata, err + } + metadata.HeaderMD = header + return stream, metadata, nil + +} + +func request_MachineService_DiskUsage_0(ctx context.Context, marshaler runtime.Marshaler, client extMachine.MachineServiceClient, req *http.Request, pathParams map[string]string) (extMachine.MachineService_DiskUsageClient, runtime.ServerMetadata, error) { + var protoReq extMachine.DiskUsageRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + stream, err := client.DiskUsage(ctx, &protoReq) + if err != nil { + return nil, metadata, err + } + header, err := stream.Header() + if err != nil { + return nil, metadata, err + } + metadata.HeaderMD = header + return stream, metadata, nil + +} + +func request_MachineService_LoadAvg_0(ctx context.Context, marshaler runtime.Marshaler, client extMachine.MachineServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extEmptypb.Empty + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.LoadAvg(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_MachineService_LoadAvg_0(ctx context.Context, marshaler runtime.Marshaler, server extMachine.MachineServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extEmptypb.Empty + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.LoadAvg(ctx, &protoReq) + return msg, metadata, err + +} + +func request_MachineService_Logs_0(ctx context.Context, marshaler runtime.Marshaler, client extMachine.MachineServiceClient, req *http.Request, pathParams map[string]string) (extMachine.MachineService_LogsClient, runtime.ServerMetadata, error) { + var protoReq extMachine.LogsRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + stream, err := client.Logs(ctx, &protoReq) + if err != nil { + return nil, metadata, err + } + header, err := stream.Header() + if err != nil { + return nil, metadata, err + } + metadata.HeaderMD = header + return stream, metadata, nil + +} + +func request_MachineService_Memory_0(ctx context.Context, marshaler runtime.Marshaler, client extMachine.MachineServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extEmptypb.Empty + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.Memory(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_MachineService_Memory_0(ctx context.Context, marshaler runtime.Marshaler, server extMachine.MachineServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extEmptypb.Empty + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.Memory(ctx, &protoReq) + return msg, metadata, err + +} + +func request_MachineService_Mounts_0(ctx context.Context, marshaler runtime.Marshaler, client extMachine.MachineServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extEmptypb.Empty + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.Mounts(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_MachineService_Mounts_0(ctx context.Context, marshaler runtime.Marshaler, server extMachine.MachineServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extEmptypb.Empty + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.Mounts(ctx, &protoReq) + return msg, metadata, err + +} + +func request_MachineService_NetworkDeviceStats_0(ctx context.Context, marshaler runtime.Marshaler, client extMachine.MachineServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extEmptypb.Empty + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.NetworkDeviceStats(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_MachineService_NetworkDeviceStats_0(ctx context.Context, marshaler runtime.Marshaler, server extMachine.MachineServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extEmptypb.Empty + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.NetworkDeviceStats(ctx, &protoReq) + return msg, metadata, err + +} + +func request_MachineService_Processes_0(ctx context.Context, marshaler runtime.Marshaler, client extMachine.MachineServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extEmptypb.Empty + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.Processes(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_MachineService_Processes_0(ctx context.Context, marshaler runtime.Marshaler, server extMachine.MachineServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extEmptypb.Empty + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.Processes(ctx, &protoReq) + return msg, metadata, err + +} + +func request_MachineService_Read_0(ctx context.Context, marshaler runtime.Marshaler, client extMachine.MachineServiceClient, req *http.Request, pathParams map[string]string) (extMachine.MachineService_ReadClient, runtime.ServerMetadata, error) { + var protoReq extMachine.ReadRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + stream, err := client.Read(ctx, &protoReq) + if err != nil { + return nil, metadata, err + } + header, err := stream.Header() + if err != nil { + return nil, metadata, err + } + metadata.HeaderMD = header + return stream, metadata, nil + +} + +func request_MachineService_Reboot_0(ctx context.Context, marshaler runtime.Marshaler, client extMachine.MachineServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extMachine.RebootRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.Reboot(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_MachineService_Reboot_0(ctx context.Context, marshaler runtime.Marshaler, server extMachine.MachineServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extMachine.RebootRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.Reboot(ctx, &protoReq) + return msg, metadata, err + +} + +func request_MachineService_Restart_0(ctx context.Context, marshaler runtime.Marshaler, client extMachine.MachineServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extMachine.RestartRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.Restart(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_MachineService_Restart_0(ctx context.Context, marshaler runtime.Marshaler, server extMachine.MachineServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extMachine.RestartRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.Restart(ctx, &protoReq) + return msg, metadata, err + +} + +func request_MachineService_Rollback_0(ctx context.Context, marshaler runtime.Marshaler, client extMachine.MachineServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extMachine.RollbackRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.Rollback(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_MachineService_Rollback_0(ctx context.Context, marshaler runtime.Marshaler, server extMachine.MachineServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extMachine.RollbackRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.Rollback(ctx, &protoReq) + return msg, metadata, err + +} + +func request_MachineService_Reset_0(ctx context.Context, marshaler runtime.Marshaler, client extMachine.MachineServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extMachine.ResetRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.Reset(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_MachineService_Reset_0(ctx context.Context, marshaler runtime.Marshaler, server extMachine.MachineServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extMachine.ResetRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.Reset(ctx, &protoReq) + return msg, metadata, err + +} + +func request_MachineService_ServiceList_0(ctx context.Context, marshaler runtime.Marshaler, client extMachine.MachineServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extEmptypb.Empty + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.ServiceList(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_MachineService_ServiceList_0(ctx context.Context, marshaler runtime.Marshaler, server extMachine.MachineServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extEmptypb.Empty + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.ServiceList(ctx, &protoReq) + return msg, metadata, err + +} + +func request_MachineService_ServiceRestart_0(ctx context.Context, marshaler runtime.Marshaler, client extMachine.MachineServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extMachine.ServiceRestartRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.ServiceRestart(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_MachineService_ServiceRestart_0(ctx context.Context, marshaler runtime.Marshaler, server extMachine.MachineServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extMachine.ServiceRestartRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.ServiceRestart(ctx, &protoReq) + return msg, metadata, err + +} + +func request_MachineService_ServiceStart_0(ctx context.Context, marshaler runtime.Marshaler, client extMachine.MachineServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extMachine.ServiceStartRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.ServiceStart(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_MachineService_ServiceStart_0(ctx context.Context, marshaler runtime.Marshaler, server extMachine.MachineServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extMachine.ServiceStartRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.ServiceStart(ctx, &protoReq) + return msg, metadata, err + +} + +func request_MachineService_ServiceStop_0(ctx context.Context, marshaler runtime.Marshaler, client extMachine.MachineServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extMachine.ServiceStopRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.ServiceStop(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_MachineService_ServiceStop_0(ctx context.Context, marshaler runtime.Marshaler, server extMachine.MachineServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extMachine.ServiceStopRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.ServiceStop(ctx, &protoReq) + return msg, metadata, err + +} + +func request_MachineService_Shutdown_0(ctx context.Context, marshaler runtime.Marshaler, client extMachine.MachineServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extMachine.ShutdownRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.Shutdown(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_MachineService_Shutdown_0(ctx context.Context, marshaler runtime.Marshaler, server extMachine.MachineServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extMachine.ShutdownRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.Shutdown(ctx, &protoReq) + return msg, metadata, err + +} + +func request_MachineService_Stats_0(ctx context.Context, marshaler runtime.Marshaler, client extMachine.MachineServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extMachine.StatsRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.Stats(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_MachineService_Stats_0(ctx context.Context, marshaler runtime.Marshaler, server extMachine.MachineServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extMachine.StatsRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.Stats(ctx, &protoReq) + return msg, metadata, err + +} + +func request_MachineService_SystemStat_0(ctx context.Context, marshaler runtime.Marshaler, client extMachine.MachineServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extEmptypb.Empty + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.SystemStat(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_MachineService_SystemStat_0(ctx context.Context, marshaler runtime.Marshaler, server extMachine.MachineServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extEmptypb.Empty + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.SystemStat(ctx, &protoReq) + return msg, metadata, err + +} + +func request_MachineService_Upgrade_0(ctx context.Context, marshaler runtime.Marshaler, client extMachine.MachineServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extMachine.UpgradeRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.Upgrade(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_MachineService_Upgrade_0(ctx context.Context, marshaler runtime.Marshaler, server extMachine.MachineServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extMachine.UpgradeRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.Upgrade(ctx, &protoReq) + return msg, metadata, err + +} + +func request_MachineService_Version_0(ctx context.Context, marshaler runtime.Marshaler, client extMachine.MachineServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extEmptypb.Empty + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.Version(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_MachineService_Version_0(ctx context.Context, marshaler runtime.Marshaler, server extMachine.MachineServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extEmptypb.Empty + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.Version(ctx, &protoReq) + return msg, metadata, err + +} + +func request_MachineService_GenerateClientConfiguration_0(ctx context.Context, marshaler runtime.Marshaler, client extMachine.MachineServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extMachine.GenerateClientConfigurationRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.GenerateClientConfiguration(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_MachineService_GenerateClientConfiguration_0(ctx context.Context, marshaler runtime.Marshaler, server extMachine.MachineServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq extMachine.GenerateClientConfigurationRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.GenerateClientConfiguration(ctx, &protoReq) + return msg, metadata, err + +} + +func request_MachineService_PacketCapture_0(ctx context.Context, marshaler runtime.Marshaler, client extMachine.MachineServiceClient, req *http.Request, pathParams map[string]string) (extMachine.MachineService_PacketCaptureClient, runtime.ServerMetadata, error) { + var protoReq extMachine.PacketCaptureRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + stream, err := client.PacketCapture(ctx, &protoReq) + if err != nil { + return nil, metadata, err + } + header, err := stream.Header() + if err != nil { + return nil, metadata, err + } + metadata.HeaderMD = header + return stream, metadata, nil + +} + +// RegisterMachineServiceHandlerServer registers the http handlers for service MachineService to "mux". +// UnaryRPC :call MachineServiceServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterMachineServiceHandlerFromEndpoint instead. +func RegisterMachineServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server extMachine.MachineServiceServer) error { + + mux.Handle("POST", pattern_MachineService_ApplyConfiguration_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/machine.MachineService/ApplyConfiguration", runtime.WithHTTPPathPattern("/machine.MachineService/ApplyConfiguration")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_MachineService_ApplyConfiguration_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_ApplyConfiguration_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_Bootstrap_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/machine.MachineService/Bootstrap", runtime.WithHTTPPathPattern("/machine.MachineService/Bootstrap")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_MachineService_Bootstrap_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_Bootstrap_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_Containers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/machine.MachineService/Containers", runtime.WithHTTPPathPattern("/machine.MachineService/Containers")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_MachineService_Containers_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_Containers_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_Copy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + err := status.Error(codes.Unimplemented, "streaming calls are not yet supported in the in-process transport") + _, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + }) + + mux.Handle("POST", pattern_MachineService_CPUInfo_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/machine.MachineService/CPUInfo", runtime.WithHTTPPathPattern("/machine.MachineService/CPUInfo")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_MachineService_CPUInfo_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_CPUInfo_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_DiskStats_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/machine.MachineService/DiskStats", runtime.WithHTTPPathPattern("/machine.MachineService/DiskStats")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_MachineService_DiskStats_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_DiskStats_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_Dmesg_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + err := status.Error(codes.Unimplemented, "streaming calls are not yet supported in the in-process transport") + _, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + }) + + mux.Handle("POST", pattern_MachineService_Events_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + err := status.Error(codes.Unimplemented, "streaming calls are not yet supported in the in-process transport") + _, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + }) + + mux.Handle("POST", pattern_MachineService_EtcdMemberList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/machine.MachineService/EtcdMemberList", runtime.WithHTTPPathPattern("/machine.MachineService/EtcdMemberList")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_MachineService_EtcdMemberList_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_EtcdMemberList_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_EtcdRemoveMember_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/machine.MachineService/EtcdRemoveMember", runtime.WithHTTPPathPattern("/machine.MachineService/EtcdRemoveMember")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_MachineService_EtcdRemoveMember_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_EtcdRemoveMember_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_EtcdLeaveCluster_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/machine.MachineService/EtcdLeaveCluster", runtime.WithHTTPPathPattern("/machine.MachineService/EtcdLeaveCluster")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_MachineService_EtcdLeaveCluster_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_EtcdLeaveCluster_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_EtcdForfeitLeadership_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/machine.MachineService/EtcdForfeitLeadership", runtime.WithHTTPPathPattern("/machine.MachineService/EtcdForfeitLeadership")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_MachineService_EtcdForfeitLeadership_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_EtcdForfeitLeadership_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_EtcdRecover_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + err := status.Error(codes.Unimplemented, "streaming calls are not yet supported in the in-process transport") + _, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + }) + + mux.Handle("POST", pattern_MachineService_EtcdSnapshot_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + err := status.Error(codes.Unimplemented, "streaming calls are not yet supported in the in-process transport") + _, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + }) + + mux.Handle("POST", pattern_MachineService_GenerateConfiguration_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/machine.MachineService/GenerateConfiguration", runtime.WithHTTPPathPattern("/machine.MachineService/GenerateConfiguration")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_MachineService_GenerateConfiguration_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_GenerateConfiguration_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_Hostname_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/machine.MachineService/Hostname", runtime.WithHTTPPathPattern("/machine.MachineService/Hostname")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_MachineService_Hostname_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_Hostname_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_Kubeconfig_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + err := status.Error(codes.Unimplemented, "streaming calls are not yet supported in the in-process transport") + _, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + }) + + mux.Handle("POST", pattern_MachineService_List_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + err := status.Error(codes.Unimplemented, "streaming calls are not yet supported in the in-process transport") + _, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + }) + + mux.Handle("POST", pattern_MachineService_DiskUsage_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + err := status.Error(codes.Unimplemented, "streaming calls are not yet supported in the in-process transport") + _, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + }) + + mux.Handle("POST", pattern_MachineService_LoadAvg_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/machine.MachineService/LoadAvg", runtime.WithHTTPPathPattern("/machine.MachineService/LoadAvg")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_MachineService_LoadAvg_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_LoadAvg_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_Logs_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + err := status.Error(codes.Unimplemented, "streaming calls are not yet supported in the in-process transport") + _, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + }) + + mux.Handle("POST", pattern_MachineService_Memory_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/machine.MachineService/Memory", runtime.WithHTTPPathPattern("/machine.MachineService/Memory")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_MachineService_Memory_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_Memory_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_Mounts_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/machine.MachineService/Mounts", runtime.WithHTTPPathPattern("/machine.MachineService/Mounts")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_MachineService_Mounts_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_Mounts_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_NetworkDeviceStats_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/machine.MachineService/NetworkDeviceStats", runtime.WithHTTPPathPattern("/machine.MachineService/NetworkDeviceStats")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_MachineService_NetworkDeviceStats_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_NetworkDeviceStats_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_Processes_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/machine.MachineService/Processes", runtime.WithHTTPPathPattern("/machine.MachineService/Processes")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_MachineService_Processes_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_Processes_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_Read_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + err := status.Error(codes.Unimplemented, "streaming calls are not yet supported in the in-process transport") + _, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + }) + + mux.Handle("POST", pattern_MachineService_Reboot_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/machine.MachineService/Reboot", runtime.WithHTTPPathPattern("/machine.MachineService/Reboot")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_MachineService_Reboot_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_Reboot_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_Restart_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/machine.MachineService/Restart", runtime.WithHTTPPathPattern("/machine.MachineService/Restart")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_MachineService_Restart_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_Restart_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_Rollback_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/machine.MachineService/Rollback", runtime.WithHTTPPathPattern("/machine.MachineService/Rollback")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_MachineService_Rollback_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_Rollback_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_Reset_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/machine.MachineService/Reset", runtime.WithHTTPPathPattern("/machine.MachineService/Reset")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_MachineService_Reset_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_Reset_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_ServiceList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/machine.MachineService/ServiceList", runtime.WithHTTPPathPattern("/machine.MachineService/ServiceList")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_MachineService_ServiceList_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_ServiceList_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_ServiceRestart_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/machine.MachineService/ServiceRestart", runtime.WithHTTPPathPattern("/machine.MachineService/ServiceRestart")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_MachineService_ServiceRestart_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_ServiceRestart_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_ServiceStart_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/machine.MachineService/ServiceStart", runtime.WithHTTPPathPattern("/machine.MachineService/ServiceStart")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_MachineService_ServiceStart_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_ServiceStart_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_ServiceStop_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/machine.MachineService/ServiceStop", runtime.WithHTTPPathPattern("/machine.MachineService/ServiceStop")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_MachineService_ServiceStop_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_ServiceStop_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_Shutdown_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/machine.MachineService/Shutdown", runtime.WithHTTPPathPattern("/machine.MachineService/Shutdown")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_MachineService_Shutdown_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_Shutdown_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_Stats_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/machine.MachineService/Stats", runtime.WithHTTPPathPattern("/machine.MachineService/Stats")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_MachineService_Stats_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_Stats_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_SystemStat_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/machine.MachineService/SystemStat", runtime.WithHTTPPathPattern("/machine.MachineService/SystemStat")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_MachineService_SystemStat_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_SystemStat_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_Upgrade_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/machine.MachineService/Upgrade", runtime.WithHTTPPathPattern("/machine.MachineService/Upgrade")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_MachineService_Upgrade_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_Upgrade_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_Version_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/machine.MachineService/Version", runtime.WithHTTPPathPattern("/machine.MachineService/Version")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_MachineService_Version_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_Version_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_GenerateClientConfiguration_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/machine.MachineService/GenerateClientConfiguration", runtime.WithHTTPPathPattern("/machine.MachineService/GenerateClientConfiguration")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_MachineService_GenerateClientConfiguration_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_GenerateClientConfiguration_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_PacketCapture_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + err := status.Error(codes.Unimplemented, "streaming calls are not yet supported in the in-process transport") + _, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + }) + + return nil +} + +// RegisterMachineServiceHandlerFromEndpoint is same as RegisterMachineServiceHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterMachineServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.DialContext(ctx, endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + + return RegisterMachineServiceHandler(ctx, mux, conn) +} + +// RegisterMachineServiceHandler registers the http handlers for service MachineService to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterMachineServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterMachineServiceHandlerClient(ctx, mux, extMachine.NewMachineServiceClient(conn)) +} + +// RegisterMachineServiceHandlerClient registers the http handlers for service MachineService +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "extMachine.MachineServiceClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "extMachine.MachineServiceClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "extMachine.MachineServiceClient" to call the correct interceptors. +func RegisterMachineServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client extMachine.MachineServiceClient) error { + + mux.Handle("POST", pattern_MachineService_ApplyConfiguration_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/machine.MachineService/ApplyConfiguration", runtime.WithHTTPPathPattern("/machine.MachineService/ApplyConfiguration")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_MachineService_ApplyConfiguration_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_ApplyConfiguration_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_Bootstrap_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/machine.MachineService/Bootstrap", runtime.WithHTTPPathPattern("/machine.MachineService/Bootstrap")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_MachineService_Bootstrap_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_Bootstrap_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_Containers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/machine.MachineService/Containers", runtime.WithHTTPPathPattern("/machine.MachineService/Containers")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_MachineService_Containers_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_Containers_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_Copy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/machine.MachineService/Copy", runtime.WithHTTPPathPattern("/machine.MachineService/Copy")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_MachineService_Copy_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_Copy_0(annotatedContext, mux, outboundMarshaler, w, req, func() (proto.Message, error) { return resp.Recv() }, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_CPUInfo_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/machine.MachineService/CPUInfo", runtime.WithHTTPPathPattern("/machine.MachineService/CPUInfo")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_MachineService_CPUInfo_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_CPUInfo_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_DiskStats_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/machine.MachineService/DiskStats", runtime.WithHTTPPathPattern("/machine.MachineService/DiskStats")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_MachineService_DiskStats_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_DiskStats_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_Dmesg_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/machine.MachineService/Dmesg", runtime.WithHTTPPathPattern("/machine.MachineService/Dmesg")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_MachineService_Dmesg_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_Dmesg_0(annotatedContext, mux, outboundMarshaler, w, req, func() (proto.Message, error) { return resp.Recv() }, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_Events_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/machine.MachineService/Events", runtime.WithHTTPPathPattern("/machine.MachineService/Events")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_MachineService_Events_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_Events_0(annotatedContext, mux, outboundMarshaler, w, req, func() (proto.Message, error) { return resp.Recv() }, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_EtcdMemberList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/machine.MachineService/EtcdMemberList", runtime.WithHTTPPathPattern("/machine.MachineService/EtcdMemberList")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_MachineService_EtcdMemberList_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_EtcdMemberList_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_EtcdRemoveMember_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/machine.MachineService/EtcdRemoveMember", runtime.WithHTTPPathPattern("/machine.MachineService/EtcdRemoveMember")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_MachineService_EtcdRemoveMember_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_EtcdRemoveMember_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_EtcdLeaveCluster_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/machine.MachineService/EtcdLeaveCluster", runtime.WithHTTPPathPattern("/machine.MachineService/EtcdLeaveCluster")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_MachineService_EtcdLeaveCluster_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_EtcdLeaveCluster_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_EtcdForfeitLeadership_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/machine.MachineService/EtcdForfeitLeadership", runtime.WithHTTPPathPattern("/machine.MachineService/EtcdForfeitLeadership")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_MachineService_EtcdForfeitLeadership_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_EtcdForfeitLeadership_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_EtcdRecover_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/machine.MachineService/EtcdRecover", runtime.WithHTTPPathPattern("/machine.MachineService/EtcdRecover")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_MachineService_EtcdRecover_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_EtcdRecover_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_EtcdSnapshot_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/machine.MachineService/EtcdSnapshot", runtime.WithHTTPPathPattern("/machine.MachineService/EtcdSnapshot")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_MachineService_EtcdSnapshot_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_EtcdSnapshot_0(annotatedContext, mux, outboundMarshaler, w, req, func() (proto.Message, error) { return resp.Recv() }, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_GenerateConfiguration_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/machine.MachineService/GenerateConfiguration", runtime.WithHTTPPathPattern("/machine.MachineService/GenerateConfiguration")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_MachineService_GenerateConfiguration_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_GenerateConfiguration_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_Hostname_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/machine.MachineService/Hostname", runtime.WithHTTPPathPattern("/machine.MachineService/Hostname")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_MachineService_Hostname_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_Hostname_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_Kubeconfig_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/machine.MachineService/Kubeconfig", runtime.WithHTTPPathPattern("/machine.MachineService/Kubeconfig")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_MachineService_Kubeconfig_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_Kubeconfig_0(annotatedContext, mux, outboundMarshaler, w, req, func() (proto.Message, error) { return resp.Recv() }, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_List_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/machine.MachineService/List", runtime.WithHTTPPathPattern("/machine.MachineService/List")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_MachineService_List_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_List_0(annotatedContext, mux, outboundMarshaler, w, req, func() (proto.Message, error) { return resp.Recv() }, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_DiskUsage_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/machine.MachineService/DiskUsage", runtime.WithHTTPPathPattern("/machine.MachineService/DiskUsage")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_MachineService_DiskUsage_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_DiskUsage_0(annotatedContext, mux, outboundMarshaler, w, req, func() (proto.Message, error) { return resp.Recv() }, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_LoadAvg_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/machine.MachineService/LoadAvg", runtime.WithHTTPPathPattern("/machine.MachineService/LoadAvg")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_MachineService_LoadAvg_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_LoadAvg_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_Logs_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/machine.MachineService/Logs", runtime.WithHTTPPathPattern("/machine.MachineService/Logs")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_MachineService_Logs_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_Logs_0(annotatedContext, mux, outboundMarshaler, w, req, func() (proto.Message, error) { return resp.Recv() }, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_Memory_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/machine.MachineService/Memory", runtime.WithHTTPPathPattern("/machine.MachineService/Memory")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_MachineService_Memory_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_Memory_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_Mounts_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/machine.MachineService/Mounts", runtime.WithHTTPPathPattern("/machine.MachineService/Mounts")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_MachineService_Mounts_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_Mounts_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_NetworkDeviceStats_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/machine.MachineService/NetworkDeviceStats", runtime.WithHTTPPathPattern("/machine.MachineService/NetworkDeviceStats")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_MachineService_NetworkDeviceStats_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_NetworkDeviceStats_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_Processes_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/machine.MachineService/Processes", runtime.WithHTTPPathPattern("/machine.MachineService/Processes")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_MachineService_Processes_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_Processes_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_Read_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/machine.MachineService/Read", runtime.WithHTTPPathPattern("/machine.MachineService/Read")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_MachineService_Read_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_Read_0(annotatedContext, mux, outboundMarshaler, w, req, func() (proto.Message, error) { return resp.Recv() }, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_Reboot_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/machine.MachineService/Reboot", runtime.WithHTTPPathPattern("/machine.MachineService/Reboot")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_MachineService_Reboot_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_Reboot_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_Restart_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/machine.MachineService/Restart", runtime.WithHTTPPathPattern("/machine.MachineService/Restart")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_MachineService_Restart_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_Restart_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_Rollback_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/machine.MachineService/Rollback", runtime.WithHTTPPathPattern("/machine.MachineService/Rollback")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_MachineService_Rollback_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_Rollback_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_Reset_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/machine.MachineService/Reset", runtime.WithHTTPPathPattern("/machine.MachineService/Reset")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_MachineService_Reset_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_Reset_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_ServiceList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/machine.MachineService/ServiceList", runtime.WithHTTPPathPattern("/machine.MachineService/ServiceList")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_MachineService_ServiceList_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_ServiceList_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_ServiceRestart_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/machine.MachineService/ServiceRestart", runtime.WithHTTPPathPattern("/machine.MachineService/ServiceRestart")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_MachineService_ServiceRestart_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_ServiceRestart_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_ServiceStart_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/machine.MachineService/ServiceStart", runtime.WithHTTPPathPattern("/machine.MachineService/ServiceStart")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_MachineService_ServiceStart_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_ServiceStart_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_ServiceStop_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/machine.MachineService/ServiceStop", runtime.WithHTTPPathPattern("/machine.MachineService/ServiceStop")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_MachineService_ServiceStop_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_ServiceStop_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_Shutdown_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/machine.MachineService/Shutdown", runtime.WithHTTPPathPattern("/machine.MachineService/Shutdown")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_MachineService_Shutdown_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_Shutdown_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_Stats_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/machine.MachineService/Stats", runtime.WithHTTPPathPattern("/machine.MachineService/Stats")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_MachineService_Stats_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_Stats_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_SystemStat_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/machine.MachineService/SystemStat", runtime.WithHTTPPathPattern("/machine.MachineService/SystemStat")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_MachineService_SystemStat_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_SystemStat_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_Upgrade_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/machine.MachineService/Upgrade", runtime.WithHTTPPathPattern("/machine.MachineService/Upgrade")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_MachineService_Upgrade_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_Upgrade_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_Version_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/machine.MachineService/Version", runtime.WithHTTPPathPattern("/machine.MachineService/Version")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_MachineService_Version_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_Version_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_GenerateClientConfiguration_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/machine.MachineService/GenerateClientConfiguration", runtime.WithHTTPPathPattern("/machine.MachineService/GenerateClientConfiguration")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_MachineService_GenerateClientConfiguration_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_GenerateClientConfiguration_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MachineService_PacketCapture_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/machine.MachineService/PacketCapture", runtime.WithHTTPPathPattern("/machine.MachineService/PacketCapture")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_MachineService_PacketCapture_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MachineService_PacketCapture_0(annotatedContext, mux, outboundMarshaler, w, req, func() (proto.Message, error) { return resp.Recv() }, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +var ( + pattern_MachineService_ApplyConfiguration_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"machine.MachineService", "ApplyConfiguration"}, "")) + + pattern_MachineService_Bootstrap_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"machine.MachineService", "Bootstrap"}, "")) + + pattern_MachineService_Containers_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"machine.MachineService", "Containers"}, "")) + + pattern_MachineService_Copy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"machine.MachineService", "Copy"}, "")) + + pattern_MachineService_CPUInfo_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"machine.MachineService", "CPUInfo"}, "")) + + pattern_MachineService_DiskStats_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"machine.MachineService", "DiskStats"}, "")) + + pattern_MachineService_Dmesg_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"machine.MachineService", "Dmesg"}, "")) + + pattern_MachineService_Events_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"machine.MachineService", "Events"}, "")) + + pattern_MachineService_EtcdMemberList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"machine.MachineService", "EtcdMemberList"}, "")) + + pattern_MachineService_EtcdRemoveMember_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"machine.MachineService", "EtcdRemoveMember"}, "")) + + pattern_MachineService_EtcdLeaveCluster_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"machine.MachineService", "EtcdLeaveCluster"}, "")) + + pattern_MachineService_EtcdForfeitLeadership_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"machine.MachineService", "EtcdForfeitLeadership"}, "")) + + pattern_MachineService_EtcdRecover_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"machine.MachineService", "EtcdRecover"}, "")) + + pattern_MachineService_EtcdSnapshot_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"machine.MachineService", "EtcdSnapshot"}, "")) + + pattern_MachineService_GenerateConfiguration_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"machine.MachineService", "GenerateConfiguration"}, "")) + + pattern_MachineService_Hostname_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"machine.MachineService", "Hostname"}, "")) + + pattern_MachineService_Kubeconfig_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"machine.MachineService", "Kubeconfig"}, "")) + + pattern_MachineService_List_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"machine.MachineService", "List"}, "")) + + pattern_MachineService_DiskUsage_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"machine.MachineService", "DiskUsage"}, "")) + + pattern_MachineService_LoadAvg_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"machine.MachineService", "LoadAvg"}, "")) + + pattern_MachineService_Logs_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"machine.MachineService", "Logs"}, "")) + + pattern_MachineService_Memory_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"machine.MachineService", "Memory"}, "")) + + pattern_MachineService_Mounts_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"machine.MachineService", "Mounts"}, "")) + + pattern_MachineService_NetworkDeviceStats_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"machine.MachineService", "NetworkDeviceStats"}, "")) + + pattern_MachineService_Processes_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"machine.MachineService", "Processes"}, "")) + + pattern_MachineService_Read_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"machine.MachineService", "Read"}, "")) + + pattern_MachineService_Reboot_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"machine.MachineService", "Reboot"}, "")) + + pattern_MachineService_Restart_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"machine.MachineService", "Restart"}, "")) + + pattern_MachineService_Rollback_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"machine.MachineService", "Rollback"}, "")) + + pattern_MachineService_Reset_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"machine.MachineService", "Reset"}, "")) + + pattern_MachineService_ServiceList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"machine.MachineService", "ServiceList"}, "")) + + pattern_MachineService_ServiceRestart_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"machine.MachineService", "ServiceRestart"}, "")) + + pattern_MachineService_ServiceStart_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"machine.MachineService", "ServiceStart"}, "")) + + pattern_MachineService_ServiceStop_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"machine.MachineService", "ServiceStop"}, "")) + + pattern_MachineService_Shutdown_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"machine.MachineService", "Shutdown"}, "")) + + pattern_MachineService_Stats_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"machine.MachineService", "Stats"}, "")) + + pattern_MachineService_SystemStat_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"machine.MachineService", "SystemStat"}, "")) + + pattern_MachineService_Upgrade_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"machine.MachineService", "Upgrade"}, "")) + + pattern_MachineService_Version_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"machine.MachineService", "Version"}, "")) + + pattern_MachineService_GenerateClientConfiguration_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"machine.MachineService", "GenerateClientConfiguration"}, "")) + + pattern_MachineService_PacketCapture_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"machine.MachineService", "PacketCapture"}, "")) +) + +var ( + forward_MachineService_ApplyConfiguration_0 = runtime.ForwardResponseMessage + + forward_MachineService_Bootstrap_0 = runtime.ForwardResponseMessage + + forward_MachineService_Containers_0 = runtime.ForwardResponseMessage + + forward_MachineService_Copy_0 = runtime.ForwardResponseStream + + forward_MachineService_CPUInfo_0 = runtime.ForwardResponseMessage + + forward_MachineService_DiskStats_0 = runtime.ForwardResponseMessage + + forward_MachineService_Dmesg_0 = runtime.ForwardResponseStream + + forward_MachineService_Events_0 = runtime.ForwardResponseStream + + forward_MachineService_EtcdMemberList_0 = runtime.ForwardResponseMessage + + forward_MachineService_EtcdRemoveMember_0 = runtime.ForwardResponseMessage + + forward_MachineService_EtcdLeaveCluster_0 = runtime.ForwardResponseMessage + + forward_MachineService_EtcdForfeitLeadership_0 = runtime.ForwardResponseMessage + + forward_MachineService_EtcdRecover_0 = runtime.ForwardResponseMessage + + forward_MachineService_EtcdSnapshot_0 = runtime.ForwardResponseStream + + forward_MachineService_GenerateConfiguration_0 = runtime.ForwardResponseMessage + + forward_MachineService_Hostname_0 = runtime.ForwardResponseMessage + + forward_MachineService_Kubeconfig_0 = runtime.ForwardResponseStream + + forward_MachineService_List_0 = runtime.ForwardResponseStream + + forward_MachineService_DiskUsage_0 = runtime.ForwardResponseStream + + forward_MachineService_LoadAvg_0 = runtime.ForwardResponseMessage + + forward_MachineService_Logs_0 = runtime.ForwardResponseStream + + forward_MachineService_Memory_0 = runtime.ForwardResponseMessage + + forward_MachineService_Mounts_0 = runtime.ForwardResponseMessage + + forward_MachineService_NetworkDeviceStats_0 = runtime.ForwardResponseMessage + + forward_MachineService_Processes_0 = runtime.ForwardResponseMessage + + forward_MachineService_Read_0 = runtime.ForwardResponseStream + + forward_MachineService_Reboot_0 = runtime.ForwardResponseMessage + + forward_MachineService_Restart_0 = runtime.ForwardResponseMessage + + forward_MachineService_Rollback_0 = runtime.ForwardResponseMessage + + forward_MachineService_Reset_0 = runtime.ForwardResponseMessage + + forward_MachineService_ServiceList_0 = runtime.ForwardResponseMessage + + forward_MachineService_ServiceRestart_0 = runtime.ForwardResponseMessage + + forward_MachineService_ServiceStart_0 = runtime.ForwardResponseMessage + + forward_MachineService_ServiceStop_0 = runtime.ForwardResponseMessage + + forward_MachineService_Shutdown_0 = runtime.ForwardResponseMessage + + forward_MachineService_Stats_0 = runtime.ForwardResponseMessage + + forward_MachineService_SystemStat_0 = runtime.ForwardResponseMessage + + forward_MachineService_Upgrade_0 = runtime.ForwardResponseMessage + + forward_MachineService_Version_0 = runtime.ForwardResponseMessage + + forward_MachineService_GenerateClientConfiguration_0 = runtime.ForwardResponseMessage + + forward_MachineService_PacketCapture_0 = runtime.ForwardResponseStream +) diff --git a/client/api/talos/machine/machine.proto b/client/api/talos/machine/machine.proto new file mode 100644 index 00000000..f2d6cdff --- /dev/null +++ b/client/api/talos/machine/machine.proto @@ -0,0 +1,1097 @@ +syntax = "proto3"; + +package machine; + +option go_package = "github.com/siderolabs/talos/pkg/machinery/api/machine"; + +import "common/common.proto"; +import "google/protobuf/any.proto"; +import "google/protobuf/duration.proto"; +import "google/protobuf/empty.proto"; +import "google/protobuf/timestamp.proto"; + +// The machine service definition. +service MachineService { + rpc ApplyConfiguration(ApplyConfigurationRequest) returns (ApplyConfigurationResponse); + // Bootstrap method makes control plane node enter etcd bootstrap mode. + // + // Node aborts etcd join sequence and creates single-node etcd cluster. + // + // If recover_etcd argument is specified, etcd is recovered from a snapshot + // uploaded with EtcdRecover. + rpc Bootstrap(BootstrapRequest) returns (BootstrapResponse); + rpc Containers(ContainersRequest) returns (ContainersResponse); + rpc Copy(CopyRequest) returns (stream common.Data); + rpc CPUInfo(google.protobuf.Empty) returns (CPUInfoResponse); + rpc DiskStats(google.protobuf.Empty) returns (DiskStatsResponse); + rpc Dmesg(DmesgRequest) returns (stream common.Data); + rpc Events(EventsRequest) returns (stream Event); + rpc EtcdMemberList(EtcdMemberListRequest) returns (EtcdMemberListResponse); + rpc EtcdRemoveMember(EtcdRemoveMemberRequest) returns (EtcdRemoveMemberResponse); + rpc EtcdLeaveCluster(EtcdLeaveClusterRequest) returns (EtcdLeaveClusterResponse); + rpc EtcdForfeitLeadership(EtcdForfeitLeadershipRequest) returns (EtcdForfeitLeadershipResponse); + // EtcdRecover method uploads etcd data snapshot created with EtcdSnapshot + // to the node. + // + // Snapshot can be later used to recover the cluster via Bootstrap method. + rpc EtcdRecover(stream common.Data) returns (EtcdRecoverResponse); + // EtcdSnapshot method creates etcd data snapshot (backup) from the local etcd instance + // and streams it back to the client. + // + // This method is available only on control plane nodes (which run etcd). + rpc EtcdSnapshot(EtcdSnapshotRequest) returns (stream common.Data); + rpc GenerateConfiguration(GenerateConfigurationRequest) returns (GenerateConfigurationResponse); + rpc Hostname(google.protobuf.Empty) returns (HostnameResponse); + rpc Kubeconfig(google.protobuf.Empty) returns (stream common.Data); + rpc List(ListRequest) returns (stream FileInfo); + rpc DiskUsage(DiskUsageRequest) returns (stream DiskUsageInfo); + rpc LoadAvg(google.protobuf.Empty) returns (LoadAvgResponse); + rpc Logs(LogsRequest) returns (stream common.Data); + rpc Memory(google.protobuf.Empty) returns (MemoryResponse); + rpc Mounts(google.protobuf.Empty) returns (MountsResponse); + rpc NetworkDeviceStats(google.protobuf.Empty) returns (NetworkDeviceStatsResponse); + rpc Processes(google.protobuf.Empty) returns (ProcessesResponse); + rpc Read(ReadRequest) returns (stream common.Data); + rpc Reboot(RebootRequest) returns (RebootResponse); + rpc Restart(RestartRequest) returns (RestartResponse); + rpc Rollback(RollbackRequest) returns (RollbackResponse); + rpc Reset(ResetRequest) returns (ResetResponse); + rpc ServiceList(google.protobuf.Empty) returns (ServiceListResponse); + rpc ServiceRestart(ServiceRestartRequest) returns (ServiceRestartResponse); + rpc ServiceStart(ServiceStartRequest) returns (ServiceStartResponse); + rpc ServiceStop(ServiceStopRequest) returns (ServiceStopResponse); + rpc Shutdown(ShutdownRequest) returns (ShutdownResponse); + rpc Stats(StatsRequest) returns (StatsResponse); + rpc SystemStat(google.protobuf.Empty) returns (SystemStatResponse); + rpc Upgrade(UpgradeRequest) returns (UpgradeResponse); + rpc Version(google.protobuf.Empty) returns (VersionResponse); + // GenerateClientConfiguration generates talosctl client configuration (talosconfig). + rpc GenerateClientConfiguration(GenerateClientConfigurationRequest) returns (GenerateClientConfigurationResponse); + // PacketCapture performs packet capture and streams back pcap file. + rpc PacketCapture(PacketCaptureRequest) returns (stream common.Data); +} + +// rpc applyConfiguration +// ApplyConfiguration describes a request to assert a new configuration upon a +// node. +message ApplyConfigurationRequest { + enum Mode { + REBOOT = 0; + AUTO = 1; + NO_REBOOT = 2; + STAGED = 3; + TRY = 4; + } + bytes data = 1; + // replaced by mode + bool on_reboot = 2 [ + (common.remove_deprecated_field) = "v1.4", + deprecated = true + ]; + // replaced by mode + bool immediate = 3 [ + (common.remove_deprecated_field) = "v1.4", + deprecated = true + ]; + Mode mode = 4; + bool dry_run = 5; + google.protobuf.Duration try_mode_timeout = 6; +} + +// ApplyConfigurationResponse describes the response to a configuration request. +message ApplyConfiguration { + common.Metadata metadata = 1; + // Configuration validation warnings. + repeated string warnings = 2; + // States which mode was actually chosen. + ApplyConfigurationRequest.Mode mode = 3; + // Human-readable message explaining the result of the apply configuration call. + string mode_details = 4; +} + +message ApplyConfigurationResponse { + repeated ApplyConfiguration messages = 1; +} + +// rpc reboot +message RebootRequest { + enum Mode { + DEFAULT = 0; + POWERCYCLE = 1; + } + Mode mode = 1; +} + +// The reboot message containing the reboot status. +message Reboot { + common.Metadata metadata = 1; + string actor_id = 2; +} + +message RebootResponse { + repeated Reboot messages = 1; +} + +// rpc Bootstrap +message BootstrapRequest { + // Enable etcd recovery from the snapshot. + // + // Snapshot should be uploaded before this call via EtcdRecover RPC. + bool recover_etcd = 1; + // Skip hash check on the snapshot (etcd). + // + // Enable this when recovering from data directory copy to skip integrity check. + bool recover_skip_hash_check = 2; +} + +// The bootstrap message containing the bootstrap status. +message Bootstrap { + common.Metadata metadata = 1; +} + +message BootstrapResponse { + repeated Bootstrap messages = 1; +} + +// rpc events +message SequenceEvent { + string sequence = 1; + enum Action { + NOOP = 0; + START = 1; + STOP = 2; + } + Action action = 2; + common.Error error = 3; +} + +message PhaseEvent { + string phase = 1; + enum Action { + START = 0; + STOP = 1; + } + Action action = 2; +} + +message TaskEvent { + string task = 1; + enum Action { + START = 0; + STOP = 1; + } + Action action = 2; +} + +message ServiceStateEvent { + string service = 1; + enum Action { + INITIALIZED = 0; + PREPARING = 1; + WAITING = 2; + RUNNING = 3; + STOPPING = 4; + FINISHED = 5; + FAILED = 6; + SKIPPED = 7; + } + Action action = 2; + string message = 3; + ServiceHealth health = 4; +} + +message RestartEvent { + int64 cmd = 1; +} + +// ConfigLoadErrorEvent is reported when the config loading has failed. +message ConfigLoadErrorEvent { + string error = 1; +} + +// ConfigValidationErrorEvent is reported when config validation has failed. +message ConfigValidationErrorEvent { + string error = 1; +} + +// AddressEvent reports node endpoints aggregated from k8s.Endpoints and network.Hostname. +message AddressEvent { + string hostname = 1; + repeated string addresses = 2; +} + +// MachineStatusEvent reports changes to the MachineStatus resource. +message MachineStatusEvent { + message MachineStatus { + message UnmetCondition { + string name = 1; + string reason = 2; + } + bool ready = 1; + repeated UnmetCondition unmet_conditions = 2; + } + enum MachineStage { + UNKNOWN = 0; + BOOTING = 1; + INSTALLING = 2; + MAINTENANCE = 3; + RUNNING = 4; + REBOOTING = 5; + SHUTTING_DOWN = 6; + RESETTING = 7; + UPGRADING = 8; + } + MachineStage stage = 1; + MachineStatus status = 2; +} + +message EventsRequest { + int32 tail_events = 1; + string tail_id = 2; + int32 tail_seconds = 3; + string with_actor_id = 4; +} + +message Event { + common.Metadata metadata = 1; + google.protobuf.Any data = 2; + string id = 3; + string actor_id = 4; +} + +// rpc reset +message ResetPartitionSpec { + string label = 1; + bool wipe = 2; +} + +message ResetRequest { + // Graceful indicates whether node should leave etcd before the upgrade, it also + // enforces etcd checks before leaving. + bool graceful = 1; + // Reboot indicates whether node should reboot or halt after resetting. + bool reboot = 2; + // System_partitions_to_wipe lists specific system disk partitions to be reset (wiped). + // If system_partitions_to_wipe is empty, all the partitions are erased. + repeated ResetPartitionSpec system_partitions_to_wipe = 3; +} + +// The reset message containing the restart status. +message Reset { + common.Metadata metadata = 1; + string actor_id = 2; +} + +message ResetResponse { + repeated Reset messages = 1; +} + +// rpc shutdown +// The messages message containing the shutdown status. +message Shutdown { + common.Metadata metadata = 1; + string actor_id = 2; +} + +message ShutdownRequest { + // Force indicates whether node should shutdown without first cordening and draining + bool force = 1; +} + +message ShutdownResponse { + repeated Shutdown messages = 1; +} + +// rpc upgrade +message UpgradeRequest { + string image = 1; + bool preserve = 2; + bool stage = 3; + bool force = 4; +} + +message Upgrade { + common.Metadata metadata = 1; + string ack = 2; + string actor_id = 3; +} + +message UpgradeResponse { + repeated Upgrade messages = 1; +} + +// rpc servicelist +message ServiceList { + common.Metadata metadata = 1; + repeated ServiceInfo services = 2; +} + +message ServiceListResponse { + repeated ServiceList messages = 1; +} + +message ServiceInfo { + string id = 1; + string state = 2; + ServiceEvents events = 3; + ServiceHealth health = 4; +} + +message ServiceEvents { + repeated ServiceEvent events = 1; +} + +message ServiceEvent { + string msg = 1; + string state = 2; + google.protobuf.Timestamp ts = 3; +} + +message ServiceHealth { + bool unknown = 1; + bool healthy = 2; + string last_message = 3; + google.protobuf.Timestamp last_change = 4; +} + +// rpc servicestart +message ServiceStartRequest { + string id = 1; +} + +message ServiceStart { + common.Metadata metadata = 1; + string resp = 2; +} + +message ServiceStartResponse { + repeated ServiceStart messages = 1; +} + +message ServiceStopRequest { + string id = 1; +} + +message ServiceStop { + common.Metadata metadata = 1; + string resp = 2; +} + +message ServiceStopResponse { + repeated ServiceStop messages = 1; +} + +message ServiceRestartRequest { + string id = 1; +} + +message ServiceRestart { + common.Metadata metadata = 1; + string resp = 2; +} + +message ServiceRestartResponse { + repeated ServiceRestart messages = 1; +} + +// CopyRequest describes a request to copy data out of Talos node +// +// Copy produces .tar.gz archive which is streamed back to the caller +message CopyRequest { + // Root path to start copying data out, it might be either a file or directory + string root_path = 1; +} + +// ListRequest describes a request to list the contents of a directory. +message ListRequest { + // Root indicates the root directory for the list. If not indicated, '/' is + // presumed. + string root = 1; + // Recurse indicates that subdirectories should be recursed. + bool recurse = 2; + // RecursionDepth indicates how many levels of subdirectories should be + // recursed. The default (0) indicates that no limit should be enforced. + int32 recursion_depth = 3; + // File type. + enum Type { + // Regular file (not directory, symlink, etc). + REGULAR = 0; + // Directory. + DIRECTORY = 1; + // Symbolic link. + SYMLINK = 2; + } + // Types indicates what file type should be returned. If not indicated, + // all files will be returned. + repeated Type types = 4; +} + +// DiskUsageRequest describes a request to list disk usage of directories and regular files +message DiskUsageRequest { + // RecursionDepth indicates how many levels of subdirectories should be + // recursed. The default (0) indicates that no limit should be enforced. + int32 recursion_depth = 1; + // All write sizes for all files, not just directories. + bool all = 2; + // Threshold exclude entries smaller than SIZE if positive, + // or entries greater than SIZE if negative. + int64 threshold = 3; + // DiskUsagePaths is the list of directories to calculate disk usage for. + repeated string paths = 4; +} + +// FileInfo describes a file or directory's information +message FileInfo { + common.Metadata metadata = 1; + // Name is the name (including prefixed path) of the file or directory + string name = 2; + // Size indicates the number of bytes contained within the file + int64 size = 3; + // Mode is the bitmap of UNIX mode/permission flags of the file + uint32 mode = 4; + // Modified indicates the UNIX timestamp at which the file was last modified + int64 modified = 5; + // IsDir indicates that the file is a directory + bool is_dir = 6; + // Error describes any error encountered while trying to read the file + // information. + string error = 7; + // Link is filled with symlink target + string link = 8; + // RelativeName is the name of the file or directory relative to the RootPath + string relative_name = 9; + // Owner uid + uint32 uid = 10; + // Owner gid + uint32 gid = 11; +} + +// DiskUsageInfo describes a file or directory's information for du command +message DiskUsageInfo { + common.Metadata metadata = 1; + // Name is the name (including prefixed path) of the file or directory + string name = 2; + // Size indicates the number of bytes contained within the file + int64 size = 3; + // Error describes any error encountered while trying to read the file + // information. + string error = 4; + // RelativeName is the name of the file or directory relative to the RootPath + string relative_name = 5; +} + +// The messages message containing the requested df stats. +message Mounts { + common.Metadata metadata = 1; + repeated MountStat stats = 2; +} + +message MountsResponse { + repeated Mounts messages = 1; +} + +// The messages message containing the requested processes. +message MountStat { + string filesystem = 1; + uint64 size = 2; + uint64 available = 3; + string mounted_on = 4; +} + +message Version { + common.Metadata metadata = 1; + VersionInfo version = 2; + PlatformInfo platform = 3; + // Features describe individual Talos features that can be switched on or off. + FeaturesInfo features = 4; +} + +message VersionResponse { + repeated Version messages = 1; +} + +message VersionInfo { + string tag = 1; + string sha = 2; + string built = 3; + string go_version = 4; + string os = 5; + string arch = 6; +} + +message PlatformInfo { + string name = 1; + string mode = 2; +} + +// FeaturesInfo describes individual Talos features that can be switched on or off. +message FeaturesInfo { + // RBAC is true if role-based access control is enabled. + bool rbac = 1; +} + +// rpc logs +// The request message containing the process name. +message LogsRequest { + string namespace = 1; + string id = 2; + // driver might be default "containerd" or "cri" + common.ContainerDriver driver = 3; + bool follow = 4; + int32 tail_lines = 5; +} + +message ReadRequest { + string path = 1; +} + +// rpc rollback +message RollbackRequest {} + +message Rollback { + common.Metadata metadata = 1; +} + +message RollbackResponse { + repeated Rollback messages = 1; +} + +// rpc Containers + +message ContainersRequest { + string namespace = 1; + // driver might be default "containerd" or "cri" + common.ContainerDriver driver = 2; +} + +// The messages message containing the requested containers. +message ContainerInfo { + string namespace = 1; + string id = 2; + string image = 3; + uint32 pid = 4; + string status = 5; + string pod_id = 6; + string name = 7; +} + +// The messages message containing the requested containers. +message Container { + common.Metadata metadata = 1; + repeated ContainerInfo containers = 2; +} + +message ContainersResponse { + repeated Container messages = 1; +} + +// dmesg +message DmesgRequest { + bool follow = 1; + bool tail = 2; +} + +// rpc processes +message ProcessesResponse { + repeated Process messages = 1; +} + +message Process { + common.Metadata metadata = 1; + repeated ProcessInfo processes = 2; +} + +message ProcessInfo { + int32 pid = 1; + int32 ppid = 2; + string state = 3; + int32 threads = 4; + double cpu_time = 5; + uint64 virtual_memory = 6; + uint64 resident_memory = 7; + string command = 8; + string executable = 9; + string args = 10; +} + +// rpc restart +// The request message containing the process to restart. +message RestartRequest { + string namespace = 1; + string id = 2; + // driver might be default "containerd" or "cri" + common.ContainerDriver driver = 3; +} + +message Restart { + common.Metadata metadata = 1; +} + +// The messages message containing the restart status. +message RestartResponse { + repeated Restart messages = 1; +} + +// rpc stats + +// The request message containing the containerd namespace. +message StatsRequest { + string namespace = 1; + // driver might be default "containerd" or "cri" + common.ContainerDriver driver = 2; +} + +// The messages message containing the requested stats. +message Stats { + common.Metadata metadata = 1; + repeated Stat stats = 2; +} + +message StatsResponse { + repeated Stats messages = 1; +} + +// The messages message containing the requested stat. +message Stat { + string namespace = 1; + string id = 2; + uint64 memory_usage = 4; + uint64 cpu_usage = 5; + string pod_id = 6; + string name = 7; +} + +message Memory { + common.Metadata metadata = 1; + MemInfo meminfo = 2; +} + +message MemoryResponse { + repeated Memory messages = 1; +} + +message MemInfo { + uint64 memtotal = 1; + uint64 memfree = 2; + uint64 memavailable = 3; + uint64 buffers = 4; + uint64 cached = 5; + uint64 swapcached = 6; + uint64 active = 7; + uint64 inactive = 8; + uint64 activeanon = 9; + uint64 inactiveanon = 10; + uint64 activefile = 11; + uint64 inactivefile = 12; + uint64 unevictable = 13; + uint64 mlocked = 14; + uint64 swaptotal = 15; + uint64 swapfree = 16; + uint64 dirty = 17; + uint64 writeback = 18; + uint64 anonpages = 19; + uint64 mapped = 20; + uint64 shmem = 21; + uint64 slab = 22; + uint64 sreclaimable = 23; + uint64 sunreclaim = 24; + uint64 kernelstack = 25; + uint64 pagetables = 26; + uint64 nfsunstable = 27; + uint64 bounce = 28; + uint64 writebacktmp = 29; + uint64 commitlimit = 30; + uint64 committedas = 31; + uint64 vmalloctotal = 32; + uint64 vmallocused = 33; + uint64 vmallocchunk = 34; + uint64 hardwarecorrupted = 35; + uint64 anonhugepages = 36; + uint64 shmemhugepages = 37; + uint64 shmempmdmapped = 38; + uint64 cmatotal = 39; + uint64 cmafree = 40; + uint64 hugepagestotal = 41; + uint64 hugepagesfree = 42; + uint64 hugepagesrsvd = 43; + uint64 hugepagessurp = 44; + uint64 hugepagesize = 45; + uint64 directmap4k = 46; + uint64 directmap2m = 47; + uint64 directmap1g = 48; +} + +// rpc Hostname + +message HostnameResponse { + repeated Hostname messages = 1; +} + +message Hostname { + common.Metadata metadata = 1; + string hostname = 2; +} + +// rpc LoadAvg + +message LoadAvgResponse { + repeated LoadAvg messages = 1; +} + +message LoadAvg { + common.Metadata metadata = 1; + double load1 = 2; + double load5 = 3; + double load15 = 4; +} + +// rpc SystemStat + +message SystemStatResponse { + repeated SystemStat messages = 1; +} + +message SystemStat { + common.Metadata metadata = 1; + uint64 boot_time = 2; + CPUStat cpu_total = 3; + repeated CPUStat cpu = 4; + uint64 irq_total = 5; + repeated uint64 irq = 6; + uint64 context_switches = 7; + uint64 process_created = 8; + uint64 process_running = 9; + uint64 process_blocked = 10; + uint64 soft_irq_total = 11; + SoftIRQStat soft_irq = 12; +} + +message CPUStat { + double user = 1; + double nice = 2; + double system = 3; + double idle = 4; + double iowait = 5; + double irq = 6; + double soft_irq = 7; + double steal = 8; + double guest = 9; + double guest_nice = 10; +} + +message SoftIRQStat { + uint64 hi = 1; + uint64 timer = 2; + uint64 net_tx = 3; + uint64 net_rx = 4; + uint64 block = 5; + uint64 block_io_poll = 6; + uint64 tasklet = 7; + uint64 sched = 8; + uint64 hrtimer = 9; + uint64 rcu = 10; +} + +// rpc CPUInfo + +message CPUInfoResponse { + repeated CPUsInfo messages = 1; +} + +message CPUsInfo { + common.Metadata metadata = 1; + repeated CPUInfo cpu_info = 2; +} + +message CPUInfo { + uint32 processor = 1; + string vendor_id = 2; + string cpu_family = 3; + string model = 4; + string model_name = 5; + string stepping = 6; + string microcode = 7; + double cpu_mhz = 8; + string cache_size = 9; + string physical_id = 10; + uint32 siblings = 11; + string core_id = 12; + uint32 cpu_cores = 13; + string apic_id = 14; + string initial_apic_id = 15; + string fpu = 16; + string fpu_exception = 17; + uint32 cpu_id_level = 18; + string wp = 19; + repeated string flags = 20; + repeated string bugs = 21; + double bogo_mips = 22; + uint32 cl_flush_size = 23; + uint32 cache_alignment = 24; + string address_sizes = 25; + string power_management = 26; +} + +// rpc NetworkDeviceStats + +message NetworkDeviceStatsResponse { + repeated NetworkDeviceStats messages = 1; +} + +message NetworkDeviceStats { + common.Metadata metadata = 1; + NetDev total = 2; + repeated NetDev devices = 3; +} + +message NetDev { + string name = 1; + uint64 rx_bytes = 2; + uint64 rx_packets = 3; + uint64 rx_errors = 4; + uint64 rx_dropped = 5; + uint64 rx_fifo = 6; + uint64 rx_frame = 7; + uint64 rx_compressed = 8; + uint64 rx_multicast = 9; + uint64 tx_bytes = 10; + uint64 tx_packets = 11; + uint64 tx_errors = 12; + uint64 tx_dropped = 13; + uint64 tx_fifo = 14; + uint64 tx_collisions = 15; + uint64 tx_carrier = 16; + uint64 tx_compressed = 17; +} + +// rpc DiskStats + +message DiskStatsResponse { + repeated DiskStats messages = 1; +} + +message DiskStats { + common.Metadata metadata = 1; + DiskStat total = 2; + repeated DiskStat devices = 3; +} + +message DiskStat { + string name = 1; + uint64 read_completed = 2; + uint64 read_merged = 3; + uint64 read_sectors = 4; + uint64 read_time_ms = 5; + uint64 write_completed = 6; + uint64 write_merged = 7; + uint64 write_sectors = 8; + uint64 write_time_ms = 9; + uint64 io_in_progress = 10; + uint64 io_time_ms = 11; + uint64 io_time_weighted_ms = 12; + uint64 discard_completed = 13; + uint64 discard_merged = 14; + uint64 discard_sectors = 15; + uint64 discard_time_ms = 16; +} + +message EtcdLeaveClusterRequest {} + +message EtcdLeaveCluster { + common.Metadata metadata = 1; +} + +message EtcdLeaveClusterResponse { + repeated EtcdLeaveCluster messages = 1; +} + +message EtcdRemoveMemberRequest { + string member = 1; +} + +message EtcdRemoveMember { + common.Metadata metadata = 1; +} + +message EtcdRemoveMemberResponse { + repeated EtcdRemoveMember messages = 1; +} + +message EtcdForfeitLeadershipRequest {} + +message EtcdForfeitLeadership { + common.Metadata metadata = 1; + string member = 2; +} + +message EtcdForfeitLeadershipResponse { + repeated EtcdForfeitLeadership messages = 1; +} + +message EtcdMemberListRequest { + bool query_local = 1; +} + +// EtcdMember describes a single etcd member. +message EtcdMember { + // member ID. + uint64 id = 2; + // human-readable name of the member. + string hostname = 3; + // the list of URLs the member exposes to clients for communication. + repeated string peer_urls = 4; + // the list of URLs the member exposes to the cluster for communication. + repeated string client_urls = 5; + // learner flag + bool is_learner = 6; +} + +// EtcdMembers contains the list of members registered on the host. +message EtcdMembers { + common.Metadata metadata = 1; + // list of member hostnames. + repeated string legacy_members = 2; + // the list of etcd members registered on the node. + repeated EtcdMember members = 3; +} + +message EtcdMemberListResponse { + repeated EtcdMembers messages = 1; +} + +message EtcdSnapshotRequest {} + +message EtcdRecover { + common.Metadata metadata = 1; +} + +message EtcdRecoverResponse { + repeated EtcdRecover messages = 1; +} + +// rpc generateConfiguration + +message RouteConfig { + string network = 1; + string gateway = 2; + uint32 metric = 3; +} + +message DHCPOptionsConfig { + uint32 route_metric = 1; +} + +message NetworkDeviceConfig { + string interface = 1; + string cidr = 2; + int32 mtu = 3; + bool dhcp = 4; + bool ignore = 5; + DHCPOptionsConfig dhcp_options = 6; + repeated RouteConfig routes = 7; +} + +message NetworkConfig { + string hostname = 1; + repeated NetworkDeviceConfig interfaces = 2; +} + +message InstallConfig { + string install_disk = 1; + string install_image = 2; +} + +message MachineConfig { + enum MachineType { + TYPE_UNKNOWN = 0; + TYPE_INIT = 1; + TYPE_CONTROL_PLANE = 2; + TYPE_WORKER = 3; + } + MachineType type = 1; + InstallConfig install_config = 2; + NetworkConfig network_config = 3; + string kubernetes_version = 4; +} + +message ControlPlaneConfig { + string endpoint = 1; +} + +message CNIConfig { + string name = 1; + repeated string urls = 2; +} + +message ClusterNetworkConfig { + string dns_domain = 1; + CNIConfig cni_config = 2; +} + +message ClusterConfig { + string name = 1; + ControlPlaneConfig control_plane = 2; + ClusterNetworkConfig cluster_network = 3; + bool allow_scheduling_on_control_planes = 4; +} + +// GenerateConfigurationRequest describes a request to generate a new configuration +// on a node. +message GenerateConfigurationRequest { + string config_version = 1; + ClusterConfig cluster_config = 2; + MachineConfig machine_config = 3; + google.protobuf.Timestamp override_time = 4; +} + +// GenerateConfiguration describes the response to a generate configuration request. +message GenerateConfiguration { + common.Metadata metadata = 1; + repeated bytes data = 2; + bytes talosconfig = 3; +} + +message GenerateConfigurationResponse { + repeated GenerateConfiguration messages = 1; +} + +message GenerateClientConfigurationRequest { + // Roles in the generated client certificate. + repeated string roles = 1; + // Client certificate TTL. + google.protobuf.Duration crt_ttl = 2; +} + +message GenerateClientConfiguration { + common.Metadata metadata = 1; + // PEM-encoded CA certificate. + bytes ca = 2; + // PEM-encoded generated client certificate. + bytes crt = 3; + // PEM-encoded generated client key. + bytes key = 4; + // Client configuration (talosconfig) file content. + bytes talosconfig = 5; +} + +message GenerateClientConfigurationResponse { + repeated GenerateClientConfiguration messages = 1; +} + +message PacketCaptureRequest { + // Interface name to perform packet capture on. + string interface = 1; + // Enable promiscuous mode. + bool promiscuous = 2; + // Snap length in bytes. + uint32 snap_len = 3; + // BPF filter. + repeated BPFInstruction bpf_filter = 4; +} + +message BPFInstruction { + uint32 op = 1; + uint32 jt = 2; + uint32 jf = 3; + uint32 k = 4; +} diff --git a/client/api/v1alpha1/resource.proto b/client/api/v1alpha1/resource.proto new file mode 100644 index 00000000..3a8caf70 --- /dev/null +++ b/client/api/v1alpha1/resource.proto @@ -0,0 +1,72 @@ +syntax = "proto3"; + +// Resource package defines protobuf serialization of COSI resources. +package cosi.resource; + +option go_package = "github.com/cosi-project/runtime/api/v1alpha1"; + +import "google/protobuf/timestamp.proto"; + +// Metadata represents resource metadata. +// +// (namespace, type, id) is a resource pointer. +// (version) is a current resource version. +// (owner) is filled in for controller-managed resources with controller name. +// (phase) indicates whether resource is going through tear down phase. +// (finalizers) are attached controllers blocking teardown of the resource. +// (labels) and (annotations) are free-form key-value pairs; labels allow queries. +message Metadata { + string namespace = 1; + string type = 2; + string id = 3; + string version = 4; + string owner = 5; + string phase = 6; + google.protobuf.Timestamp created = 7; + google.protobuf.Timestamp updated = 8; + repeated string finalizers = 9; + map<string, string> annotations = 11; + map<string, string> labels = 10; +} + +// Spec defines content of the resource. +message Spec { + // Protobuf-serialized representation of the resource. + bytes proto_spec = 1; + // YAML representation of the spec (optional). + string yaml_spec = 2; +} + +// Resource is a combination of metadata and spec. +message Resource { + Metadata metadata = 1; + Spec spec = 2; +} + +// LabelTerm is an expression on a label. +message LabelTerm { + enum Operation { + // Label exists. + EXISTS = 0; + // Label value is equal. + EQUAL = 1; + // Label doesn't exist. + NOT_EXISTS = 2; + } + + string key = 1; + Operation op = 2; + string value = 3; +} + +// LabelQuery is a query on resource metadata labels. +// +// Terms are combined with AND. +message LabelQuery { + repeated LabelTerm terms = 1; +} + +// IDQuery is a query on resource metadata ID. +message IDQuery { + string regexp = 1; +} diff --git a/client/go.mod b/client/go.mod new file mode 100644 index 00000000..1428c177 --- /dev/null +++ b/client/go.mod @@ -0,0 +1,100 @@ +module github.com/siderolabs/omni/client + +go 1.22.0 + +replace ( + // forked go-yaml that introduces RawYAML interface, which can be used to populate YAML fields using bytes + // which are then encoded as a valid YAML blocks with proper indentiation + gopkg.in/yaml.v3 => github.com/unix4ever/yaml v0.0.0-20220527175918-f17b0f05cf2c + // our fork for tcpproxy with fixes + inet.af/tcpproxy => github.com/smira/tcpproxy v0.0.0-20201015133617-de5f7797b95b +) + +require ( + github.com/adrg/xdg v0.4.0 + github.com/blang/semver v3.5.1+incompatible + github.com/cosi-project/runtime v0.4.0-alpha.6 + github.com/fatih/color v1.16.0 + github.com/google/uuid v1.4.0 + github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 + github.com/hashicorp/go-multierror v1.1.1 + github.com/hexops/gotextdiff v1.0.3 + github.com/mattn/go-isatty v0.0.20 + github.com/planetscale/vtprotobuf v0.6.0 + github.com/sergi/go-diff v1.3.1 + github.com/siderolabs/gen v0.4.7 + github.com/siderolabs/go-api-signature v0.3.1 + github.com/siderolabs/go-kubeconfig v0.1.0 + github.com/siderolabs/go-pointer v1.0.0 + github.com/siderolabs/talos/pkg/machinery v1.6.4 + github.com/spf13/cobra v1.8.0 + github.com/stretchr/testify v1.8.4 + github.com/xlab/treeprint v1.2.0 + go.uber.org/zap v1.26.0 + golang.org/x/term v0.15.0 + google.golang.org/grpc v1.61.0 + google.golang.org/protobuf v1.32.0 + gopkg.in/yaml.v3 v3.0.1 + k8s.io/client-go v0.28.4 +) + +require ( + github.com/ProtonMail/go-crypto v0.0.0-20230923063757-afb1ddc0824c // indirect + github.com/ProtonMail/go-mime v0.0.0-20230322103455-7d82a3887f2f // indirect + github.com/ProtonMail/gopenpgp/v2 v2.7.4 // indirect + github.com/cloudflare/circl v1.3.6 // indirect + github.com/containerd/go-cni v1.1.9 // indirect + github.com/containernetworking/cni v1.1.2 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/gertd/go-pluralize v0.2.1 // indirect + github.com/go-logr/logr v1.3.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.3 // indirect + github.com/google/go-cmp v0.6.0 // indirect + github.com/google/gofuzz v1.2.0 // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/imdario/mergo v0.3.16 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/josharian/native v1.1.0 // indirect + github.com/jsimonetti/rtnetlink v1.4.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mdlayher/ethtool v0.1.0 // indirect + github.com/mdlayher/genetlink v1.3.2 // indirect + github.com/mdlayher/netlink v1.7.2 // indirect + github.com/mdlayher/socket v0.5.0 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/opencontainers/runtime-spec v1.1.0 // indirect + github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/russross/blackfriday/v2 v2.1.0 // indirect + github.com/ryanuber/go-glob v1.0.0 // indirect + github.com/siderolabs/crypto v0.4.1 // indirect + github.com/siderolabs/go-blockdevice v0.4.7 // indirect + github.com/siderolabs/net v0.4.0 // indirect + github.com/siderolabs/protoenc v0.2.1 // indirect + github.com/spf13/pflag v1.0.5 // indirect + go.uber.org/multierr v1.11.0 // indirect + golang.org/x/crypto v0.16.0 // indirect + golang.org/x/net v0.19.0 // indirect + golang.org/x/oauth2 v0.15.0 // indirect + golang.org/x/sync v0.6.0 // indirect + golang.org/x/sys v0.15.0 // indirect + golang.org/x/text v0.14.0 // indirect + golang.org/x/time v0.5.0 // indirect + google.golang.org/appengine v1.6.8 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240102182953-50ed04b92917 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917 // indirect + gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + k8s.io/apimachinery v0.28.4 // indirect + k8s.io/klog/v2 v2.110.1 // indirect + k8s.io/utils v0.0.0-20231127182322-b307cd553661 // indirect + sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect + sigs.k8s.io/yaml v1.4.0 // indirect +) diff --git a/client/go.sum b/client/go.sum new file mode 100644 index 00000000..e7b2f400 --- /dev/null +++ b/client/go.sum @@ -0,0 +1,368 @@ +github.com/ProtonMail/go-crypto v0.0.0-20230717121422-5aa5874ade95/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= +github.com/ProtonMail/go-crypto v0.0.0-20230923063757-afb1ddc0824c h1:kMFnB0vCcX7IL/m9Y5LO+KQYv+t1CQOiFe6+SV2J7bE= +github.com/ProtonMail/go-crypto v0.0.0-20230923063757-afb1ddc0824c/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= +github.com/ProtonMail/go-mime v0.0.0-20230322103455-7d82a3887f2f h1:tCbYj7/299ekTTXpdwKYF8eBlsYsDVoggDAuAjoK66k= +github.com/ProtonMail/go-mime v0.0.0-20230322103455-7d82a3887f2f/go.mod h1:gcr0kNtGBqin9zDW9GOHcVntrwnjrK+qdJ06mWYBybw= +github.com/ProtonMail/gopenpgp/v2 v2.7.4 h1:Vz/8+HViFFnf2A6XX8JOvZMrA6F5puwNvvF21O1mRlo= +github.com/ProtonMail/gopenpgp/v2 v2.7.4/go.mod h1:IhkNEDaxec6NyzSI0PlxapinnwPVIESk8/76da3Ct3g= +github.com/adrg/xdg v0.4.0 h1:RzRqFcjH4nE5C6oTAxhBtoE2IRyjBSa62SCbyPidvls= +github.com/adrg/xdg v0.4.0/go.mod h1:N6ag73EX4wyxeaoeHctc1mas01KZgsj5tYiAIwqJE/E= +github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= +github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= +github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= +github.com/brianvoe/gofakeit/v6 v6.24.0 h1:74yq7RRz/noddscZHRS2T84oHZisW9muwbb8sRnU52A= +github.com/brianvoe/gofakeit/v6 v6.24.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8= +github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/cilium/ebpf v0.12.3 h1:8ht6F9MquybnY97at+VDZb3eQQr8ev79RueWeVaEcG4= +github.com/cilium/ebpf v0.12.3/go.mod h1:TctK1ivibvI3znr66ljgi4hqOT8EYQjz1KWBfb1UVgM= +github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= +github.com/cloudflare/circl v1.3.6 h1:/xbKIqSHbZXHwkhbrhrt2YOHIwYJlXH94E3tI/gDlUg= +github.com/cloudflare/circl v1.3.6/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= +github.com/containerd/go-cni v1.1.9 h1:ORi7P1dYzCwVM6XPN4n3CbkuOx/NZ2DOqy+SHRdo9rU= +github.com/containerd/go-cni v1.1.9/go.mod h1:XYrZJ1d5W6E2VOvjffL3IZq0Dz6bsVlERHbekNK90PM= +github.com/containernetworking/cni v1.1.2 h1:wtRGZVv7olUHMOqouPpn3cXJWpJgM6+EUl31EQbXALQ= +github.com/containernetworking/cni v1.1.2/go.mod h1:sDpYKmGVENF3s6uvMvGgldDWeG8dMxakj/u+i9ht9vw= +github.com/cosi-project/runtime v0.4.0-alpha.6 h1:GFxRH6fc/9z0ffDjod6P7SzjqhKOk6BgoDBgBEOjTvo= +github.com/cosi-project/runtime v0.4.0-alpha.6/go.mod h1:JE9yuyufGRCd28AyCWFkTNf3UMiZJT722bpfPEPnsNE= +github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM= +github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +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/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE= +github.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/evanphx/json-patch v5.7.0+incompatible h1:vgGkfT/9f8zE6tvSCe74nfpAVDQ2tG6yudJd8LBksgI= +github.com/evanphx/json-patch v5.7.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= +github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/gertd/go-pluralize v0.2.1 h1:M3uASbVjMnTsPb0PNqg+E/24Vwigyo/tvyMTtAlLgiA= +github.com/gertd/go-pluralize v0.2.1/go.mod h1:rbYaKDbsXxmRfr8uygAEKhOWsjyrrqrkHVpZvoOp8zk= +github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= +github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= +github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= +github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= +github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= +github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= +github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 h1:Wqo399gCIufwto+VfwCSvsnfGpF/w5E9CNxSwbpD6No= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0/go.mod h1:qmOFXW2epJhM0qSnUUYpldc7gVz2KMQwJ/QYCDIa7XU= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= +github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= +github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/josharian/native v1.1.0 h1:uuaP0hAbW7Y4l0ZRQ6C9zfb7Mg1mbFKry/xzDAfmtLA= +github.com/josharian/native v1.1.0/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w= +github.com/jsimonetti/rtnetlink v1.4.0 h1:Z1BF0fRgcETPEa0Kt0MRk3yV5+kF1FWTni6KUFKrq2I= +github.com/jsimonetti/rtnetlink v1.4.0/go.mod h1:5W1jDvWdnthFJ7fxYX1GMK07BUpI4oskfOqvPteYS6E= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mdlayher/ethtool v0.1.0 h1:XAWHsmKhyPOo42qq/yTPb0eFBGUKKTR1rE0dVrWVQ0Y= +github.com/mdlayher/ethtool v0.1.0/go.mod h1:fBMLn2UhfRGtcH5ZFjr+6GUiHEjZsItFD7fSn7jbZVQ= +github.com/mdlayher/genetlink v1.3.2 h1:KdrNKe+CTu+IbZnm/GVUMXSqBBLqcGpRDa0xkQy56gw= +github.com/mdlayher/genetlink v1.3.2/go.mod h1:tcC3pkCrPUGIKKsCsp0B3AdaaKuHtaxoJRz3cc+528o= +github.com/mdlayher/netlink v1.7.2 h1:/UtM3ofJap7Vl4QWCPDGXY8d3GIY2UGSDbK+QWmY8/g= +github.com/mdlayher/netlink v1.7.2/go.mod h1:xraEF7uJbxLhc5fpHL4cPe221LI2bdttWlU+ZGLfQSw= +github.com/mdlayher/socket v0.5.0 h1:ilICZmJcQz70vrWVes1MFera4jGiWNocSkykwwoy3XI= +github.com/mdlayher/socket v0.5.0/go.mod h1:WkcBFfvyG8QENs5+hfQPl1X6Jpd2yeLIYgrGFmJiJxI= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= +github.com/onsi/ginkgo/v2 v2.9.4 h1:xR7vG4IXt5RWx6FfIjyAtsoMAtnc3C/rFXBBd2AjZwE= +github.com/onsi/ginkgo/v2 v2.9.4/go.mod h1:gCQYp2Q+kSoIj7ykSVb9nskRSsR6PUj4AiLywzIhbKM= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE= +github.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+qQlhg= +github.com/opencontainers/runtime-spec v1.1.0 h1:HHUyrt9mwHUjtasSbXSMvs4cyFxh+Bll4AjJ9odEGpg= +github.com/opencontainers/runtime-spec v1.1.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.0 h1:nBeETjudeJ5ZgBHUz1fVHvbqUKnYOXNhsIEabROxmNA= +github.com/planetscale/vtprotobuf v0.6.0/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +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/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk= +github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= +github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= +github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= +github.com/siderolabs/crypto v0.4.1 h1:PP84WSDDyCCbjYKePcc0IaMSPXDndz8V3cQ9hMRSvpA= +github.com/siderolabs/crypto v0.4.1/go.mod h1:nJmvkqWy1Hngbzw3eg2TdtJ/ZYHHofQK1NbmmYywW8k= +github.com/siderolabs/gen v0.4.7 h1:lM69UYggT7yzpubf7hEFaNujPdY55Y9zvQf/NC18GvA= +github.com/siderolabs/gen v0.4.7/go.mod h1:4PBYMdXxTg292IDRq4CGn5AymyDxJVEDvobVKDqFBEA= +github.com/siderolabs/go-api-signature v0.3.1 h1:ePXOxBT2fxRICsDntXed9kivmVK269nZe5UXvOxgtnM= +github.com/siderolabs/go-api-signature v0.3.1/go.mod h1:RZQFRiZ4midsdC9XCGhhWyS8QcIWtpEFeigvqoDPYJY= +github.com/siderolabs/go-blockdevice v0.4.7 h1:2bk4WpEEflGxjrNwp57ye24Pr+cYgAiAeNMWiQOuWbQ= +github.com/siderolabs/go-blockdevice v0.4.7/go.mod h1:4PeOuk71pReJj1JQEXDE7kIIQJPVe8a+HZQa+qjxSEA= +github.com/siderolabs/go-kubeconfig v0.1.0 h1:t/2oMWkLSdWHXglKPMz8ySXnx6ZjHckeGY79NaDcBTo= +github.com/siderolabs/go-kubeconfig v0.1.0/go.mod h1:eM3mO02Td6wYDvdi9zTbMrj1Q4WqEFN8XQ6pNjCUWkI= +github.com/siderolabs/go-pointer v1.0.0 h1:6TshPKep2doDQJAAtHUuHWXbca8ZfyRySjSBT/4GsMU= +github.com/siderolabs/go-pointer v1.0.0/go.mod h1:HTRFUNYa3R+k0FFKNv11zgkaCLzEkWVzoYZ433P3kHc= +github.com/siderolabs/go-retry v0.3.3 h1:zKV+S1vumtO72E6sYsLlmIdV/G/GcYSBLiEx/c9oCEg= +github.com/siderolabs/go-retry v0.3.3/go.mod h1:Ff/VGc7v7un4uQg3DybgrmOWHEmJ8BzZds/XNn/BqMI= +github.com/siderolabs/net v0.4.0 h1:1bOgVay/ijPkJz4qct98nHsiB/ysLQU0KLoBC4qLm7I= +github.com/siderolabs/net v0.4.0/go.mod h1:/ibG+Hm9HU27agp5r9Q3eZicEfjquzNzQNux5uEk0kM= +github.com/siderolabs/protoenc v0.2.1 h1:BqxEmeWQeMpNP3R6WrPqDatX8sM/r4t97OP8mFmg6GA= +github.com/siderolabs/protoenc v0.2.1/go.mod h1:StTHxjet1g11GpNAWiATgc8K0HMKiFSEVVFOa/H0otc= +github.com/siderolabs/talos/pkg/machinery v1.6.4 h1:xzkHpHqVnio3IL2z44f/dG3TNVvSafZFvuyqlR6J7nY= +github.com/siderolabs/talos/pkg/machinery v1.6.4/go.mod h1:0x8zKxjyasg7n03lHXo5FX8ZaodFSSaompcGYa4alPE= +github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= +github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/unix4ever/yaml v0.0.0-20220527175918-f17b0f05cf2c h1:Vn6nVVu9MdOYvXPkJP83iX5jVIfvxFC9v9xIKb+DlaQ= +github.com/unix4ever/yaml v0.0.0-20220527175918-f17b0f05cf2c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +github.com/xlab/treeprint v1.2.0 h1:HzHnuAF1plUN2zGlAFHbSQP2qJ0ZAD3XF5XD7OesXRQ= +github.com/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= +go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= +golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= +golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/exp v0.0.0-20230224173230-c95f2b4c22f2 h1:Jvc7gsqn21cJHCmAWx0LiimpP18LZmUxkT5Mp7EZ1mI= +golang.org/x/exp v0.0.0-20230224173230-c95f2b4c22f2/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +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/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= +golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +golang.org/x/oauth2 v0.15.0 h1:s8pnnxNVzjWyrvYdFUQq5llS1PX2zhPXmccZv99h7uQ= +golang.org/x/oauth2 v0.15.0/go.mod h1:q48ptWNTY5XWf+JNten23lcvHpLJ0ZSxF5ttTHKVCAM= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/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= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +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= +golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= +golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.8.0 h1:vSDcovVPld282ceKgDimkRSC8kpaH1dgyc9UMzlt84Y= +golang.org/x/tools v0.8.0/go.mod h1:JxBZ99ISMI5ViVkT1tr6tdNmXeTrcpVSD3vZ1RsRdN4= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto v0.0.0-20231212172506-995d672761c0 h1:YJ5pD9rF8o9Qtta0Cmy9rdBwkSjrTCT6XTiUQVOtIos= +google.golang.org/genproto v0.0.0-20231212172506-995d672761c0/go.mod h1:l/k7rMz0vFTBPy+tFSGvXEd3z+BcoG1k7EHbqm+YBsY= +google.golang.org/genproto/googleapis/api v0.0.0-20240102182953-50ed04b92917 h1:rcS6EyEaoCO52hQDupoSfrxI3R6C2Tq741is7X8OvnM= +google.golang.org/genproto/googleapis/api v0.0.0-20240102182953-50ed04b92917/go.mod h1:CmlNWB9lSezaYELKS5Ym1r44VrrbPUa7JTvw+6MbpJ0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917 h1:6G8oQ016D88m1xAKljMlBOOGWDZkes4kMhgGFlf8WcQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917/go.mod h1:xtjpI3tXFPP051KaWnhvxkiubL/6dJ18vLVf7q2pTOU= +google.golang.org/grpc v1.61.0 h1:TOvOcuXn30kRao+gfcvsebNEa5iZIiLkisYEkf7R7o0= +google.golang.org/grpc v1.61.0/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +k8s.io/api v0.28.4 h1:8ZBrLjwosLl/NYgv1P7EQLqoO8MGQApnbgH8tu3BMzY= +k8s.io/api v0.28.4/go.mod h1:axWTGrY88s/5YE+JSt4uUi6NMM+gur1en2REMR7IRj0= +k8s.io/apimachinery v0.28.4 h1:zOSJe1mc+GxuMnFzD4Z/U1wst50X28ZNsn5bhgIIao8= +k8s.io/apimachinery v0.28.4/go.mod h1:wI37ncBvfAoswfq626yPTe6Bz1c22L7uaJ8dho83mgg= +k8s.io/client-go v0.28.4 h1:Np5ocjlZcTrkyRJ3+T3PkXDpe4UpatQxj85+xjaD2wY= +k8s.io/client-go v0.28.4/go.mod h1:0VDZFpgoZfelyP5Wqu0/r/TRYcLYuJ2U1KEeoaPa1N4= +k8s.io/klog/v2 v2.110.1 h1:U/Af64HJf7FcwMcXyKm2RPM22WZzyR7OSpYj5tg3cL0= +k8s.io/klog/v2 v2.110.1/go.mod h1:YGtd1984u+GgbuZ7e08/yBuAfKLSO0+uR1Fhi6ExXjo= +k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9 h1:LyMgNKD2P8Wn1iAwQU5OhxCKlKJy0sHc+PcDwFB24dQ= +k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9/go.mod h1:wZK2AVp1uHCp4VamDVgBP2COHZjqD1T68Rf0CM3YjSM= +k8s.io/utils v0.0.0-20231127182322-b307cd553661 h1:FepOBzJ0GXm8t0su67ln2wAZjbQ6RxQGZDnzuLcrUTI= +k8s.io/utils v0.0.0-20231127182322-b307cd553661/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/client/pkg/access/access.go b/client/pkg/access/access.go new file mode 100644 index 00000000..60aecf4e --- /dev/null +++ b/client/pkg/access/access.go @@ -0,0 +1,11 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +// Package access contains commands related to API access for the client. +package access + +const ( + // ServiceAccountNameSuffix is appended to the name of all service accounts. + ServiceAccountNameSuffix = "@serviceaccount.omni.sidero.dev" +) diff --git a/client/pkg/client/client.go b/client/pkg/client/client.go new file mode 100644 index 00000000..dbd126cb --- /dev/null +++ b/client/pkg/client/client.go @@ -0,0 +1,132 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +// Package client provides Omni API client. +package client + +import ( + "context" + "crypto/tls" + "net" + "net/url" + + "github.com/siderolabs/go-api-signature/pkg/client/auth" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials" + "google.golang.org/grpc/credentials/insecure" + "google.golang.org/grpc/encoding/gzip" + + "github.com/siderolabs/omni/client/pkg/client/management" + "github.com/siderolabs/omni/client/pkg/client/oidc" + "github.com/siderolabs/omni/client/pkg/client/omni" + "github.com/siderolabs/omni/client/pkg/client/talos" + "github.com/siderolabs/omni/client/pkg/constants" +) + +// Client is Omni API client. +type Client struct { + conn *grpc.ClientConn + + endpoint string +} + +// New creates a new Omni API client. +func New(ctx context.Context, endpoint string, opts ...Option) (*Client, error) { + u, err := url.Parse(endpoint) + if err != nil { + return nil, err + } + + if u.Port() == "" && u.Scheme == "https" { + u.Host = net.JoinHostPort(u.Host, "443") + } + + if u.Scheme == "http" { + u.Scheme = "grpc" + } + + if u.Port() == "" && u.Scheme == "grpc" { + u.Host = net.JoinHostPort(u.Host, "80") + } + + var ( + options Options + grpcDialOptions []grpc.DialOption + ) + + for _, opt := range opts { + opt(&options) + } + + if options.AuthInterceptor != nil { + grpcDialOptions = append(grpcDialOptions, + grpc.WithUnaryInterceptor(options.AuthInterceptor.Unary()), + grpc.WithStreamInterceptor(options.AuthInterceptor.Stream())) + } + + grpcDialOptions = append(grpcDialOptions, options.AdditionalGRPCDialOptions...) + + switch u.Scheme { + case "https": + grpcDialOptions = append(grpcDialOptions, grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{ + InsecureSkipVerify: options.InsecureSkipTLSVerify, + }))) + default: + grpcDialOptions = append(grpcDialOptions, grpc.WithTransportCredentials(insecure.NewCredentials())) + } + + grpcDialOptions = append(grpcDialOptions, + grpc.WithDefaultCallOptions( + grpc.MaxCallRecvMsgSize(constants.GRPCMaxMessageSize), + grpc.UseCompressor(gzip.Name), + ), + grpc.WithSharedWriteBuffer(true), + ) + + c := &Client{ + endpoint: u.String(), + } + + c.conn, err = grpc.DialContext(ctx, u.Host, grpcDialOptions...) + if err != nil { + return nil, err + } + + return c, nil +} + +// Close the client. +func (c *Client) Close() error { + return c.conn.Close() +} + +// Omni provides access to Omni resource API. +func (c *Client) Omni() *omni.Client { + return omni.NewClient(c.conn) +} + +// Management provides access to the management API. +func (c *Client) Management() *management.Client { + return management.NewClient(c.conn) +} + +// OIDC provides access to the OIDC API. +func (c *Client) OIDC() *oidc.Client { + return oidc.NewClient(c.conn) +} + +// Auth provides access to the auth API. +func (c *Client) Auth() *auth.Client { + return auth.NewClient(c.conn) +} + +// Talos provides access to Talos machine API. +func (c *Client) Talos() *talos.Client { + return talos.NewClient(c.conn) +} + +// Endpoint returns the endpoint this client is configured to talk to. +func (c *Client) Endpoint() string { + return c.endpoint +} diff --git a/client/pkg/client/example_test.go b/client/pkg/client/example_test.go new file mode 100644 index 00000000..cdd736ea --- /dev/null +++ b/client/pkg/client/example_test.go @@ -0,0 +1,130 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package client_test + +import ( + "context" + "log" + + "github.com/cosi-project/runtime/pkg/safe" + "google.golang.org/protobuf/types/known/emptypb" + + "github.com/siderolabs/omni/client/pkg/client" + "github.com/siderolabs/omni/client/pkg/omni/resources" + "github.com/siderolabs/omni/client/pkg/omni/resources/omni" + "github.com/siderolabs/omni/client/pkg/template" + "github.com/siderolabs/omni/client/pkg/version" +) + +//nolint:wsl,testableexamples +func Example() { + // This example shows how to use Omni client to access resources. + + // Setup versions information. You can embed that into `go build` too. + version.Name = "omni" + version.SHA = "build SHA" + version.Tag = "v0.9.1" + + // For this example we will use Omni service account. + // You can create your service account in advance: + // + // omnictl serviceaccount create example.account + // Created service account "example.account" with public key ID "<REDACTED>" + // + // Set the following environment variables to use the service account: + // OMNI_ENDPOINT=https://<account>.omni.siderolabs.io:443 + // OMNI_SERVICE_ACCOUNT_KEY=base64encodedkey + // + // Note: Store the service account key securely, it will not be displayed again + + ctx := context.Background() + + // Creating a new client. + client, err := client.New(ctx, "https://<account>.omni.siderolabs.io:443", client.WithServiceAccount( + "base64encodedkey", // From the generated service account. + )) + if err != nil { + log.Fatalf("failed to create omni client %s", err) + } + + // Omni service is using COSI https://github.com/cosi-project/runtime/. + // The same client is used to get resources in Talos. + st := client.Omni().State() + + // Getting the resources from the Omni state. + machines, err := safe.StateList[*omni.MachineStatus](ctx, st, omni.NewMachineStatus(resources.DefaultNamespace, "").Metadata()) + if err != nil { + log.Fatalf("failed to get machines %s", err) + } + + var ( + cluster string + machine *omni.MachineStatus + ) + + for iter := machines.Iterator(); iter.Next(); { + item := iter.Value() + + log.Printf("machine %s, connected: %t", item.Metadata(), item.TypedSpec().Value.GetConnected()) + + // Check cluster assignment for a machine. + // Find a machine which is allocated into a cluster for the later use. + if c, ok := item.Metadata().Labels().Get(omni.LabelCluster); ok && machine == nil { + cluster = c + machine = item + } + } + + // Creating an empty cluster via template. + // Alternative is to use template.Load to load a cluster template. + template := template.WithCluster("example.cluster") + + if _, err = template.Sync(ctx, st); err != nil { + log.Fatalf("failed to sync cluster %s", err) + } + + log.Printf("sync cluster") + + // Delete cluster. + if _, err = template.Delete(ctx, st); err != nil { + log.Fatalf("failed to delete the cluster %s", err) + } + + log.Printf("destroyed cluster") + + // No machines found, exit. + if machine == nil { + log.Printf("no allocated machines found, exit") + + return + } + + // Using Talos through Omni. + // Use cluster and machine which we previously found. + cpuInfo, err := client.Talos().WithCluster( + cluster, + ).WithNodes( + machine.Metadata().ID(), // You can use machine UUID as Omni will properly resolve it into machine IP. + ).CPUInfo(ctx, &emptypb.Empty{}) + if err != nil { + log.Fatalf("failed to read machine CPU info %s", err) + } + + for _, message := range cpuInfo.Messages { + for i, info := range message.CpuInfo { + log.Printf("machine %s, CPU %d family %s", machine.Metadata(), i, info.CpuFamily) + } + + if len(message.CpuInfo) == 0 { + log.Printf("no CPU info for machine %s", machine.Metadata()) + } + } + + // Talking to Omni specific APIs: getting talosconfig. + _, err = client.Management().Talosconfig(ctx) + if err != nil { + log.Fatalf("failed to get talosconfig %s", err) + } +} diff --git a/client/pkg/client/management/management.go b/client/pkg/client/management/management.go new file mode 100644 index 00000000..7084bcc2 --- /dev/null +++ b/client/pkg/client/management/management.go @@ -0,0 +1,316 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +// Package management provides client for Omni management API. +package management + +import ( + "bytes" + "context" + "errors" + "fmt" + "io" + "time" + + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/types/known/durationpb" + "google.golang.org/protobuf/types/known/emptypb" + + "github.com/siderolabs/omni/client/api/omni/management" +) + +// TalosconfigOption is a functional option for Talosconfig. +type TalosconfigOption func(*management.TalosconfigRequest) + +// WithAdminTalosconfig sets whether the Talosconfig request should return an admin Talosconfig. +func WithAdminTalosconfig(adminConfig bool) TalosconfigOption { + return func(req *management.TalosconfigRequest) { + req.Admin = adminConfig + } +} + +// KubeconfigOption is a functional option for Kubeconfig. +type KubeconfigOption func(request *management.KubeconfigRequest) + +// WithServiceAccount sets whether the Kubeconfig request should return a user or service account type kubeconfig. +func WithServiceAccount(ttl time.Duration, user string, groups ...string) KubeconfigOption { + return func(request *management.KubeconfigRequest) { + request.ServiceAccount = true + request.ServiceAccountTtl = durationpb.New(ttl) + request.ServiceAccountUser = user + request.ServiceAccountGroups = groups + } +} + +// Client for Management API . +type Client struct { + conn management.ManagementServiceClient +} + +// NewClient builds a client out of gRPC connection. +func NewClient(conn *grpc.ClientConn) *Client { + return &Client{ + conn: management.NewManagementServiceClient(conn), + } +} + +// WithCluster sets the cluster name context. +func (client *Client) WithCluster(clusterName string) *ClusterClient { + return &ClusterClient{ + client: client, + clusterName: clusterName, + } +} + +// Talosconfig retrieves Talos client configuration for the whole instance. +func (client *Client) Talosconfig(ctx context.Context, opts ...TalosconfigOption) ([]byte, error) { + request := management.TalosconfigRequest{} + + for _, opt := range opts { + opt(&request) + } + + talosconfigResp, err := client.conn.Talosconfig(ctx, &request) + + return talosconfigResp.GetTalosconfig(), err +} + +// Omniconfig retrieves Omni configuration for the clients. +func (client *Client) Omniconfig(ctx context.Context) ([]byte, error) { + omniconfig, err := client.conn.Omniconfig(ctx, &emptypb.Empty{}) + if err != nil { + return nil, fmt.Errorf("failed to get omniconfig: %w", err) + } + + return omniconfig.Omniconfig, nil +} + +// LogsReader returns the io.Reader for the logs with each message separated by '\n'. +func (client *Client) LogsReader(ctx context.Context, machineID string, follow bool, tailLines int32) (io.Reader, error) { + logStream, err := client.conn.MachineLogs(ctx, &management.MachineLogsRequest{ + MachineId: machineID, + Follow: follow, + TailLines: tailLines, + }) + if err != nil { + return nil, err + } + + return &LogReader{ + ctx: ctx, + client: logStream, + }, nil +} + +// CreateSchematic using the image factory. +func (client *Client) CreateSchematic(ctx context.Context, req *management.CreateSchematicRequest) (*management.CreateSchematicResponse, error) { + schematic, err := client.conn.CreateSchematic(ctx, req) + if err != nil { + return nil, err + } + + return schematic, nil +} + +// CreateServiceAccount creates a service account and returns the public key ID. +func (client *Client) CreateServiceAccount(ctx context.Context, armoredPGPPublicKey string, role string, useUserRole bool) (string, error) { + resp, err := client.conn.CreateServiceAccount(ctx, &management.CreateServiceAccountRequest{ + ArmoredPgpPublicKey: armoredPGPPublicKey, + Role: role, + UseUserRole: useUserRole, + }) + if err != nil { + return "", err + } + + return resp.PublicKeyId, nil +} + +// RenewServiceAccount renews a service account and returns the public key ID. +func (client *Client) RenewServiceAccount(ctx context.Context, name, armoredPGPPublicKey string) (string, error) { + resp, err := client.conn.RenewServiceAccount(ctx, &management.RenewServiceAccountRequest{ + Name: name, + ArmoredPgpPublicKey: armoredPGPPublicKey, + }) + if err != nil { + return "", err + } + + return resp.PublicKeyId, nil +} + +// ListServiceAccounts lists service accounts. +func (client *Client) ListServiceAccounts(ctx context.Context) ([]*management.ListServiceAccountsResponse_ServiceAccount, error) { + response, err := client.conn.ListServiceAccounts(ctx, &emptypb.Empty{}) + if err != nil { + return nil, err + } + + return response.GetServiceAccounts(), nil +} + +// DestroyServiceAccount deletes a service account. +func (client *Client) DestroyServiceAccount(ctx context.Context, name string) error { + _, err := client.conn.DestroyServiceAccount(ctx, &management.DestroyServiceAccountRequest{ + Name: name, + }) + + return err +} + +// LogReader is a log client reader which implements io.Reader. +type LogReader struct { + ctx context.Context //nolint:containedctx + client management.ManagementService_MachineLogsClient + + buf bytes.Buffer +} + +// Read reads from the log stream. +func (l *LogReader) Read(p []byte) (int, error) { + if l.buf.Len() > 0 { + return l.buf.Read(p) + } + + for { + if l.ctx.Err() != nil { + return 0, io.EOF + } + + recv, err := l.client.Recv() + if err != nil { + if expectedErr(err) { + return 0, io.EOF + } + + return 0, err + } + + err = writeLine(&l.buf, recv.Bytes) + if err != nil { + return 0, fmt.Errorf("failed to write log msg: %w", err) + } + + if l.buf.Len() > 0 { + return l.buf.Read(p) + } + } +} + +type byteWriter interface { + io.Writer + io.ByteWriter +} + +func writeLine(writer byteWriter, line []byte) error { + _, err := writer.Write(line) + if err != nil { + return err + } + + err = writer.WriteByte('\n') + if err != nil { + return err + } + + return nil +} + +func expectedErr(err error) bool { + return errors.Is(err, context.Canceled) || + errors.Is(err, context.DeadlineExceeded) || + errors.Is(err, io.EOF) || + status.Code(err) == codes.Canceled +} + +// ClusterClient is a client for a specific cluster. +type ClusterClient struct { + client *Client + clusterName string +} + +// Kubeconfig retrieves Kubernetes client configuration for the cluster. +func (client *ClusterClient) Kubeconfig(ctx context.Context, opts ...KubeconfigOption) ([]byte, error) { + ctx = metadata.AppendToOutgoingContext(ctx, "context", client.clusterName) + + request := management.KubeconfigRequest{} + + for _, opt := range opts { + opt(&request) + } + + kubeconfigResp, err := client.client.conn.Kubeconfig(ctx, &request) + + return kubeconfigResp.GetKubeconfig(), err +} + +// Talosconfig retrieves Talos client configuration for the cluster. +func (client *ClusterClient) Talosconfig(ctx context.Context, opts ...TalosconfigOption) ([]byte, error) { + ctx = metadata.AppendToOutgoingContext(ctx, "context", client.clusterName) + + request := management.TalosconfigRequest{} + + for _, opt := range opts { + opt(&request) + } + + talosconfigResp, err := client.client.conn.Talosconfig(ctx, &request) + + return talosconfigResp.GetTalosconfig(), err +} + +// KubernetesUpgradePreChecks runs the pre-checks for an upgrade. +func (client *ClusterClient) KubernetesUpgradePreChecks(ctx context.Context, newVersion string) error { + ctx = metadata.AppendToOutgoingContext(ctx, "context", client.clusterName) + + resp, err := client.client.conn.KubernetesUpgradePreChecks(ctx, &management.KubernetesUpgradePreChecksRequest{ + NewVersion: newVersion, + }) + if err != nil { + return err + } + + if resp.Ok { + return nil + } + + return fmt.Errorf("%s", resp.GetReason()) +} + +// KubernetesSyncManifestHandler is called for each sync event. +type KubernetesSyncManifestHandler func(*management.KubernetesSyncManifestResponse) error + +// KubernetesSyncManifests syncs the bootstrap Kubernetes manifests. +func (client *ClusterClient) KubernetesSyncManifests(ctx context.Context, dryRun bool, handler KubernetesSyncManifestHandler) error { + ctx, cancel := context.WithCancel(ctx) + defer cancel() + + ctx = metadata.AppendToOutgoingContext(ctx, "context", client.clusterName) + + cli, err := client.client.conn.KubernetesSyncManifests(ctx, &management.KubernetesSyncManifestRequest{ + DryRun: dryRun, + }) + if err != nil { + return err + } + + for { + msg, err := cli.Recv() + if err != nil { + if errors.Is(err, io.EOF) || status.Code(err) == codes.Canceled { + return nil + } + + return err + } + + err = handler(msg) + if err != nil { + return err + } + } +} diff --git a/client/pkg/client/oidc/oidc.go b/client/pkg/client/oidc/oidc.go new file mode 100644 index 00000000..4c79f763 --- /dev/null +++ b/client/pkg/client/oidc/oidc.go @@ -0,0 +1,37 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +// Package oidc provides client for Omni OIDC API. +package oidc + +import ( + "context" + + "google.golang.org/grpc" + + "github.com/siderolabs/omni/client/api/omni/oidc" +) + +// Client for Management API . +type Client struct { + conn oidc.OIDCServiceClient +} + +// NewClient builds a client out of gRPC connection. +func NewClient(conn *grpc.ClientConn) *Client { + return &Client{ + conn: oidc.NewOIDCServiceClient(conn), + } +} + +// Authenticate confirms the OIDC auth request. +func (client *Client) Authenticate(ctx context.Context, requestID string) (string, error) { + resp, err := client.conn.Authenticate(ctx, + &oidc.AuthenticateRequest{ + AuthRequestId: requestID, + }, + ) + + return resp.GetRedirectUrl(), err +} diff --git a/client/pkg/client/omni/omni.go b/client/pkg/client/omni/omni.go new file mode 100644 index 00000000..7be31bc1 --- /dev/null +++ b/client/pkg/client/omni/omni.go @@ -0,0 +1,38 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +// Package omni provides client for Omni resource access. +package omni + +import ( + "github.com/cosi-project/runtime/api/v1alpha1" + "github.com/cosi-project/runtime/pkg/state" + "github.com/cosi-project/runtime/pkg/state/protobuf/client" + "google.golang.org/grpc" + + _ "github.com/siderolabs/omni/client/pkg/omni/resources/auth" // import resources to register protobufs + _ "github.com/siderolabs/omni/client/pkg/omni/resources/k8s" + _ "github.com/siderolabs/omni/client/pkg/omni/resources/oidc" + _ "github.com/siderolabs/omni/client/pkg/omni/resources/omni" + _ "github.com/siderolabs/omni/client/pkg/omni/resources/siderolink" + _ "github.com/siderolabs/omni/client/pkg/omni/resources/system" + _ "github.com/siderolabs/omni/client/pkg/omni/resources/virtual" +) + +// Client for Omni resource API (COSI). +type Client struct { + state state.State +} + +// NewClient builds a client out of gRPC connection. +func NewClient(conn *grpc.ClientConn) *Client { + return &Client{ + state: state.WrapCore(client.NewAdapter(v1alpha1.NewStateClient(conn))), + } +} + +// State provides access to the COSI resource state. +func (client *Client) State() state.State { //nolint:ireturn + return client.state +} diff --git a/client/pkg/client/options.go b/client/pkg/client/options.go new file mode 100644 index 00000000..46ee786b --- /dev/null +++ b/client/pkg/client/options.go @@ -0,0 +1,64 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +// Package client provides Omni API client. +package client + +import ( + "github.com/siderolabs/go-api-signature/pkg/client/interceptor" + "github.com/siderolabs/go-api-signature/pkg/pgp/client" + "google.golang.org/grpc" + + "github.com/siderolabs/omni/client/pkg/version" +) + +// Options is the options for the client. +type Options struct { + AuthInterceptor *interceptor.Interceptor + + AdditionalGRPCDialOptions []grpc.DialOption + + InsecureSkipTLSVerify bool +} + +// Option is a functional option for the client. +type Option func(*Options) + +// WithInsecureSkipTLSVerify creates the client with insecure TLS verification. +func WithInsecureSkipTLSVerify(insecureSkipTLSVerify bool) Option { + return func(options *Options) { + options.InsecureSkipTLSVerify = insecureSkipTLSVerify + } +} + +// WithServiceAccount creates the client authenticating with the given service account. +func WithServiceAccount(serviceAccountBase64 string) Option { + return func(options *Options) { + options.AuthInterceptor = signatureAuthInterceptor("", "", serviceAccountBase64) + } +} + +// WithUserAccount is used for accessing Omni by a human. +func WithUserAccount(contextName, identity string) Option { + return func(options *Options) { + options.AuthInterceptor = signatureAuthInterceptor(contextName, identity, "") + } +} + +func signatureAuthInterceptor(contextName, identity, serviceAccountBase64 string) *interceptor.Interceptor { + return interceptor.New(interceptor.Options{ + UserKeyProvider: client.NewKeyProvider("omni/keys"), + ContextName: contextName, + Identity: identity, + ClientName: version.Name + " " + version.Tag, + ServiceAccountBase64: serviceAccountBase64, + }) +} + +// WithGrpcOpts adds additional gRPC dial options to the client. +func WithGrpcOpts(opts ...grpc.DialOption) Option { + return func(options *Options) { + options.AdditionalGRPCDialOptions = append(options.AdditionalGRPCDialOptions, opts...) + } +} diff --git a/client/pkg/client/talos/talos.go b/client/pkg/client/talos/talos.go new file mode 100644 index 00000000..30896215 --- /dev/null +++ b/client/pkg/client/talos/talos.go @@ -0,0 +1,80 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +// Package talos provides helpers for accessing Talos Machine API. +package talos + +import ( + "context" + + "github.com/siderolabs/talos/pkg/machinery/api/machine" + "google.golang.org/grpc" + "google.golang.org/grpc/metadata" + + "github.com/siderolabs/omni/client/api/common" +) + +// NewClient wraps gRPC connection interface which adds nodes, cluster name +// to each request. +func NewClient(conn grpc.ClientConnInterface) *Client { + c := &Client{ + conn: conn, + } + + c.MachineServiceClient = machine.NewMachineServiceClient(c) + + return c +} + +// Client adds runtime, cluster and nodes metadata to all gRPC calls. +type Client struct { + machine.MachineServiceClient + conn grpc.ClientConnInterface + clusterName string + nodes []string +} + +// WithCluster adds clusterName to the request metadata. +func (c *Client) WithCluster(clusterName string) *Client { + c.clusterName = clusterName + + return c +} + +// WithNodes adds nodes to the request metadata. +func (c *Client) WithNodes(nodes ...string) *Client { + c.nodes = nodes + + return c +} + +// Invoke performs a unary RPC and returns after the response is received +// into reply. +func (c *Client) Invoke(ctx context.Context, method string, args any, reply any, opts ...grpc.CallOption) error { + return c.conn.Invoke(c.appendMetadata(ctx), method, args, reply, opts...) +} + +// NewStream begins a streaming RPC. +func (c *Client) NewStream(ctx context.Context, desc *grpc.StreamDesc, method string, opts ...grpc.CallOption) (grpc.ClientStream, error) { + return c.conn.NewStream(c.appendMetadata(ctx), desc, method, opts...) +} + +func (c *Client) appendMetadata(ctx context.Context) context.Context { + ctx = metadata.AppendToOutgoingContext(ctx, "runtime", common.Runtime_Talos.String()) + + if c.clusterName != "" { + ctx = metadata.AppendToOutgoingContext(ctx, "context", c.clusterName) + } + + if len(c.nodes) > 0 { + pairs := make([]string, 0, len(c.nodes)*2) + for _, node := range c.nodes { + pairs = append(pairs, "nodes", node) + } + + ctx = metadata.AppendToOutgoingContext(ctx, pairs...) + } + + return ctx +} diff --git a/client/pkg/constants/constants.go b/client/pkg/constants/constants.go new file mode 100644 index 00000000..9547b3f1 --- /dev/null +++ b/client/pkg/constants/constants.go @@ -0,0 +1,75 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +// Package constants contains global backend constants. +package constants + +import "time" + +// SecureBoot defines query parameter for enabling secure boot for the generated image. +// tsgen:SecureBoot +const SecureBoot = "secureboot" + +// DefaultTalosVersion is pre-selected in the UI, default image and used in the integration tests. +// +// tsgen:DefaultTalosVersion +const DefaultTalosVersion = "1.6.4" + +const ( + // TalosRegistry is the default Talos repository URL. + TalosRegistry = "ghcr.io/siderolabs/installer" + + // ImageFactoryBaseURL is the default Image Factory base URL. + ImageFactoryBaseURL = "https://factory.talos.dev" + + // KubernetesRegistry is the default kubernetes repository URL. + KubernetesRegistry = "ghcr.io/siderolabs/kubelet" +) + +const ( + // PatchWeightInstallDisk is the weight of the install disk config patch. + // tsgen:PatchWeightInstallDisk + PatchWeightInstallDisk = 0 + // PatchBaseWeightCluster is the base weight for cluster patches. + // tsgen:PatchBaseWeightCluster + PatchBaseWeightCluster = 200 + // PatchBaseWeightMachineSet is the base weight for machine set patches. + // tsgen:PatchBaseWeightMachineSet + PatchBaseWeightMachineSet = 400 + // PatchBaseWeightClusterMachine is the base weight for cluster machine patches. + // tsgen:PatchBaseWeightClusterMachine + PatchBaseWeightClusterMachine = 400 +) + +const ( + // DefaultAccessGroup specifies the default Kubernetes group asserted in the token claims if the user has modify access to the clusters. + // + // If not, the user will only have the groups specified in the ACLs (AccessPolicies) in the token claims (will be empty if there is no matching ACL). + DefaultAccessGroup = "system:masters" +) + +// GRPCMaxMessageSize is the maximum message size for gRPC server. +const GRPCMaxMessageSize = 32 * 1024 * 1024 + +// DisableValidation force disable resource validation on the Omni runtime for a particular resource (only for debug build). +const DisableValidation = "disable-validation" + +const ( + // EncryptionPatchPrefix is the prefix of the encryption config patch. + EncryptionPatchPrefix = "950" +) + +const ( + // EncryptionConfigName human-readable encryption config patch name annotation. + EncryptionConfigName = "disk encryption config" + + // EncryptionConfigDescription description of the encryption config patch. + EncryptionConfigDescription = "Makes machine encrypt disks using Omni as a KMS server" +) + +// CertificateValidityTime is the default validity time for certificates. +const CertificateValidityTime = time.Hour * 24 * 365 // 1 year + +// KubernetesAdminCertCommonName is the common name of the Kubernetes admin certificate. +const KubernetesAdminCertCommonName = "omni:admin" diff --git a/client/pkg/constants/debug_disabled.go b/client/pkg/constants/debug_disabled.go new file mode 100644 index 00000000..57630f91 --- /dev/null +++ b/client/pkg/constants/debug_disabled.go @@ -0,0 +1,10 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +//go:build sidero.debug + +package constants + +// IsDebugBuild is set to true when the build is a debug build (WITH_DEBUG=true). +const IsDebugBuild = true diff --git a/client/pkg/constants/debug_enabled.go b/client/pkg/constants/debug_enabled.go new file mode 100644 index 00000000..9385db8d --- /dev/null +++ b/client/pkg/constants/debug_enabled.go @@ -0,0 +1,10 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +//go:build !sidero.debug + +package constants + +// IsDebugBuild is set to true when the build is a debug build (WITH_DEBUG=true). +const IsDebugBuild = false diff --git a/client/pkg/constants/talos.go b/client/pkg/constants/talos.go new file mode 100644 index 00000000..6ab0a99a --- /dev/null +++ b/client/pkg/constants/talos.go @@ -0,0 +1,55 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package constants + +import ( + "github.com/siderolabs/talos/pkg/machinery/resources/cluster" + "github.com/siderolabs/talos/pkg/machinery/resources/k8s" + "github.com/siderolabs/talos/pkg/machinery/resources/network" + "github.com/siderolabs/talos/pkg/machinery/resources/perf" + "github.com/siderolabs/talos/pkg/machinery/resources/runtime" + "github.com/siderolabs/talos/pkg/machinery/resources/v1alpha1" +) + +// Copy Talos constants to generate them for Typescript. +const ( + // Types. + // tsgen:TalosServiceType + _ = v1alpha1.ServiceType + // tsgen:TalosCPUType + _ = perf.CPUType + // tsgen:TalosMemoryType + _ = perf.MemoryType + // tsgen:TalosNodenameType + _ = k8s.NodenameType + // tsgen:TalosMemberType + _ = cluster.MemberType + // tsgen:TalosNodeAddressType + _ = network.NodeAddressType + // tsgen:TalosMountStatusType + _ = runtime.MountStatusType + + // Resource ids. + // tsgen:TalosNodenameID + _ = k8s.NodenameID + // tsgen:TalosAddressRoutedNoK8s + _ = "routed-no-k8s" + // tsgen:TalosCPUID + _ = perf.CPUID + // tsgen:TalosMemoryID + _ = perf.MemoryID + + // Namespaces. + // tsgen:TalosPerfNamespace + _ = perf.NamespaceName + // tsgen:TalosClusterNamespace + _ = cluster.NamespaceName + // tsgen:TalosRuntimeNamespace + _ = v1alpha1.NamespaceName + // tsgen:TalosK8sNamespace + _ = k8s.NamespaceName + // tsgen:TalosNetworkNamespace + _ = network.NamespaceName +) diff --git a/client/pkg/cosi/labels/labels.go b/client/pkg/cosi/labels/labels.go new file mode 100644 index 00000000..47994d80 --- /dev/null +++ b/client/pkg/cosi/labels/labels.go @@ -0,0 +1,37 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +// Package labels implements label selector parser. +package labels + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +// ParseQuery creates resource.LabelQuery from the string formatted selector. +func ParseQuery(selector string) (*resource.LabelQuery, error) { + return (&parser{ + l: &lexer{ + s: selector, + }, + }).parse() +} + +// ParseSelectors creates resource.LabelQuery from the string formatted selectors. +func ParseSelectors(selectors []string) (resource.LabelQueries, error) { + res := make([]resource.LabelQuery, 0, len(selectors)) + + for _, selector := range selectors { + query, err := ParseQuery(selector) + if err != nil { + return nil, status.Error(codes.InvalidArgument, err.Error()) + } + + res = append(res, *query) + } + + return res, nil +} diff --git a/client/pkg/cosi/labels/labels_test.go b/client/pkg/cosi/labels/labels_test.go new file mode 100644 index 00000000..09e638d1 --- /dev/null +++ b/client/pkg/cosi/labels/labels_test.go @@ -0,0 +1,211 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package labels_test + +import ( + "testing" + + "github.com/cosi-project/runtime/pkg/resource" + "github.com/stretchr/testify/require" + + "github.com/siderolabs/omni/client/pkg/cosi/labels" +) + +func TestParseQuery(t *testing.T) { + for _, tt := range []struct { + expected *resource.LabelQuery + query string + }{ + { + query: "!a", + expected: &resource.LabelQuery{ + Terms: []resource.LabelTerm{ + { + Key: "a", + Op: resource.LabelOpExists, + Invert: true, + }, + }, + }, + }, + { + query: "a", + expected: &resource.LabelQuery{ + Terms: []resource.LabelTerm{ + { + Key: "a", + Op: resource.LabelOpExists, + }, + }, + }, + }, + { + query: "a != b", + expected: &resource.LabelQuery{ + Terms: []resource.LabelTerm{ + { + Key: "a", + Op: resource.LabelOpEqual, + Value: []string{"b"}, + Invert: true, + }, + }, + }, + }, + { + query: "a == b", + expected: &resource.LabelQuery{ + Terms: []resource.LabelTerm{ + { + Key: "a", + Op: resource.LabelOpEqual, + Value: []string{"b"}, + }, + }, + }, + }, + { + query: "a = b", + expected: &resource.LabelQuery{ + Terms: []resource.LabelTerm{ + { + Key: "a", + Op: resource.LabelOpEqual, + Value: []string{"b"}, + }, + }, + }, + }, + { + query: "a < b", + expected: &resource.LabelQuery{ + Terms: []resource.LabelTerm{ + { + Key: "a", + Op: resource.LabelOpLTNumeric, + Value: []string{"b"}, + }, + }, + }, + }, + { + query: "a <= b", + expected: &resource.LabelQuery{ + Terms: []resource.LabelTerm{ + { + Key: "a", + Op: resource.LabelOpLTENumeric, + Value: []string{"b"}, + }, + }, + }, + }, + { + query: "a > b", + expected: &resource.LabelQuery{ + Terms: []resource.LabelTerm{ + { + Key: "a", + Op: resource.LabelOpLTENumeric, + Value: []string{"b"}, + Invert: true, + }, + }, + }, + }, + { + query: "a >= 㰀㰀", + expected: &resource.LabelQuery{ + Terms: []resource.LabelTerm{ + { + Key: "a", + Op: resource.LabelOpLTNumeric, + Value: []string{"㰀㰀"}, + Invert: true, + }, + }, + }, + }, + { + query: "a >= b", + expected: &resource.LabelQuery{ + Terms: []resource.LabelTerm{ + { + Key: "a", + Op: resource.LabelOpLTNumeric, + Value: []string{"b"}, + Invert: true, + }, + }, + }, + }, + { + query: "a notin (a, b, c, d)", + expected: &resource.LabelQuery{ + Terms: []resource.LabelTerm{ + { + Key: "a", + Op: resource.LabelOpIn, + Value: []string{"a", "b", "c", "d"}, + Invert: true, + }, + }, + }, + }, + { + query: "a in (a, b, c, d)", + expected: &resource.LabelQuery{ + Terms: []resource.LabelTerm{ + { + Key: "a", + Op: resource.LabelOpIn, + Value: []string{"a", "b", "c", "d"}, + }, + }, + }, + }, + { + query: "a in a, b, c, d", + }, + { + query: "a in a", + }, + { + query: "!a= 1", + }, + { + query: "a, b > 0", + expected: &resource.LabelQuery{ + Terms: []resource.LabelTerm{ + { + Key: "a", + Op: resource.LabelOpExists, + }, + { + Key: "b", + Op: resource.LabelOpLTENumeric, + Value: []string{"0"}, + Invert: true, + }, + }, + }, + }, + } { + t.Run(tt.query, func(t *testing.T) { + require := require.New(t) + + res, err := labels.ParseQuery(tt.query) + + if tt.expected == nil { + require.Error(err) + + return + } + + require.NoError(err) + require.Equal(tt.expected, res) + }) + } +} diff --git a/client/pkg/cosi/labels/lexer.go b/client/pkg/cosi/labels/lexer.go new file mode 100644 index 00000000..8761a95a --- /dev/null +++ b/client/pkg/cosi/labels/lexer.go @@ -0,0 +1,247 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package labels + +import ( + "fmt" + "unicode/utf8" +) + +// lexerToken represents constant definition for lexer token. +type lexerToken int + +// newToken parses token from string. +func newToken(s string) (lexerToken, bool) { + switch s { + case ")": + return closedParToken, true + case "(": + return openParToken, true + case ",": + return commaToken, true + case "!": + return doesNotExistToken, true + case "!=": + return neqToken, true + case "==": + return doubleEQToken, true + case "=": + return eqToken, true + case ">": + return gtToken, true + case ">=": + return gteToken, true + case "<": + return ltToken, true + case "<=": + return lteToken, true + case "notin": + return notInToken, true + case "in": + return inToken, true + default: + return 0, false + } +} + +// String converts token to string. +func (t lexerToken) String() string { + //nolint:exhaustive + switch t { + case closedParToken: + return ")" + case openParToken: + return "(" + case commaToken: + return "," + case doesNotExistToken: + return "!" + case doubleEQToken: + return "==" + case eqToken: + return "=" + case gtToken: + return ">" + case gteToken: + return ">=" + case ltToken: + return "<" + case lteToken: + return "<=" + case neqToken: + return "!=" + case notInToken: + return "notin" + case inToken: + return "in" + default: + return "" + } +} + +const ( + // errorToken represents scan error. + errorToken lexerToken = iota + // endOfStringToken represents end of string. + endOfStringToken + // closedParToken represents close parenthesis. + closedParToken + // commaToken represents the comma. + commaToken + // doesNotExistToken represents logic not. + doesNotExistToken + // doubleEQToken represents double equals. + doubleEQToken + // eqToken represents equal. + eqToken + // gtToken represents greater than. + gtToken + // gteToken represents greater than or equal. + gteToken + // IdentifierToken represents identifier, e.g. keys and values. + IdentifierToken + // inToken represents in. + inToken + // ltToken represents less than. + ltToken + // lteToken represents less than or equal. + lteToken + // neqToken represents not equal. + neqToken + // notInToken represents not in. + notInToken + // openParToken represents open parenthesis. + openParToken +) + +// isWhitespace returns true if the rune is a space, tab, or newline. +func isWhitespace(ch rune) bool { + return ch == ' ' || ch == '\t' || ch == '\r' || ch == '\n' +} + +// isSpecialSymbol detects if the character ch can be an operator. +func isSpecialSymbol(ch rune) bool { + switch ch { + case '=', '!', '(', ')', ',', '>', '<': + return true + } + + return false +} + +// lexer represents the lexer struct for label selector. +// It contains necessary information to tokenize the input string. +type lexer struct { + // s stores the string to be tokenized + s string + // pos is the position currently tokenized + pos int +} + +// read returns the character currently lexed +// increment the position and check the buffer overflow. +func (l *lexer) read() (rune, int) { + if l.pos >= len(l.s) { + return 0, 0 + } + + b, width := utf8.DecodeRuneInString(l.s[l.pos:]) + l.pos += width + + return b, width +} + +// scanIDOrKeyword scans string to recognize literal token (for example 'in') or an identifier. +func (l *lexer) scanIDOrKeyword() (tok lexerToken, lit string) { + var buffer []rune +IdentifierLoop: + for { + switch ch, width := l.read(); { + case ch == 0: + break IdentifierLoop + case isSpecialSymbol(ch) || isWhitespace(ch): + l.pos -= width + + break IdentifierLoop + default: + buffer = append(buffer, ch) + } + } + + s := string(buffer) + if val, ok := newToken(s); ok { // is a literal token? + return val, s + } + + return IdentifierToken, s // otherwise is an identifier +} + +// scanSpecialSymbol scans string starting with special symbol. +// special symbol identify non literal operators. "!=", "==", "=". +func (l *lexer) scanSpecialSymbol() (lexerToken, string) { + var ( + buffer []rune + token lexerToken + literal string + ) + +SpecialSymbolLoop: + for { + switch ch, width := l.read(); { + case ch == 0: + break SpecialSymbolLoop + case isSpecialSymbol(ch): + buffer = append(buffer, ch) + + if t, ok := newToken(string(buffer)); ok { + token = t + literal = string(buffer) + } else if token != 0 { + l.pos -= width + + break SpecialSymbolLoop + } + default: + l.pos -= width + + break SpecialSymbolLoop + } + } + + if token == 0 { + return errorToken, fmt.Sprintf("error expected: keyword found '%s'", string(buffer)) + } + + return token, literal +} + +// skipWhiteSpaces consumes all blank characters +// returning the first non blank character. +func (l *lexer) skipWhiteSpaces(ch rune, width int) (rune, int) { + for { + if !isWhitespace(ch) { + return ch, width + } + + ch, width = l.read() + } +} + +// lex returns a pair of Token and the literal. +// Literal is meaningful only for IdentifierToken token. +func (l *lexer) lex() (tok lexerToken, lit string) { + switch ch, width := l.skipWhiteSpaces(l.read()); { + case ch == 0: + return endOfStringToken, "" + case isSpecialSymbol(ch): + l.pos -= width + + return l.scanSpecialSymbol() + default: + l.pos -= width + + return l.scanIDOrKeyword() + } +} diff --git a/client/pkg/cosi/labels/parser.go b/client/pkg/cosi/labels/parser.go new file mode 100644 index 00000000..f6c15614 --- /dev/null +++ b/client/pkg/cosi/labels/parser.go @@ -0,0 +1,298 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package labels + +import ( + "fmt" + "sort" + "strings" + + "github.com/cosi-project/runtime/pkg/resource" + "github.com/siderolabs/gen/maps" + "github.com/siderolabs/gen/xslices" +) + +// scannedItem contains the Token and the literal produced by the lexer. +type scannedItem struct { + literal string + token lexerToken +} + +// parser data structure contains the label selector parser data structure. +type parser struct { + currentItem *scannedItem + l *lexer + position int +} + +// parserContext represents context during parsing: +// some literal for example 'in' and 'notin' can be +// recognized as operator for example 'x in (a)' but +// it can be recognized as value for example 'value in (in)'. +type parserContext int + +const ( + keyAndOperatorContext parserContext = iota + valuesContext +) + +// lookahead func returns the current token and string. No increment of current position. +func (p *parser) lookahead(context parserContext) (lexerToken, string) { + if p.currentItem == nil { + token, literal := p.l.lex() + + p.currentItem = &scannedItem{ + token: token, + literal: literal, + } + } + + token, literal := p.currentItem.token, p.currentItem.literal + + if context == valuesContext { + //nolint:exhaustive + switch token { + case inToken, notInToken: + token = IdentifierToken + } + } + + return token, literal +} + +// consume returns current token and string. Increments the position. +func (p *parser) consume(context parserContext) (lexerToken, string) { + tok, lit := p.lookahead(context) + + p.position++ + + p.currentItem = nil + + return tok, lit +} + +// parse runs the left recursive descending algorithm +// on input string. It returns a list of Term objects. +func (p *parser) parse() (*resource.LabelQuery, error) { + var terms []resource.LabelTerm + + for { + tok, lit := p.lookahead(valuesContext) + //nolint:exhaustive + switch tok { + case IdentifierToken, doesNotExistToken: + r, err := p.parseTerm() + if err != nil { + return nil, fmt.Errorf("unable to parse term: %w", err) + } + + terms = append(terms, *r) + + t, l := p.consume(valuesContext) + //nolint:exhaustive + switch t { + case endOfStringToken: + return &resource.LabelQuery{ + Terms: terms, + }, nil + case commaToken: + t2, l2 := p.lookahead(valuesContext) + if t2 != IdentifierToken && t2 != doesNotExistToken { + return nil, fmt.Errorf("found '%s', expected: identifier after ','", l2) + } + default: + return nil, fmt.Errorf("found '%s', expected: ',' or 'end of string'", l) + } + case endOfStringToken: + return &resource.LabelQuery{ + Terms: terms, + }, nil + default: + return nil, fmt.Errorf("found '%s', expected: !, identifier, or 'end of string'", lit) + } + } +} + +func (p *parser) parseTerm() (*resource.LabelTerm, error) { + var ( + term resource.LabelTerm + err error + ) + + tok, key := p.consume(valuesContext) + + doesNotExist := tok == doesNotExistToken + + if doesNotExist { + tok, key = p.consume(valuesContext) + + term.Invert = true + } + + term.Key = key + + if tok != IdentifierToken { + err = fmt.Errorf("found '%s', expected: identifier", key) + + return nil, err + } + + if t, _ := p.lookahead(valuesContext); t == endOfStringToken || t == commaToken { + term.Op = resource.LabelOpExists + + return &term, nil + } else if doesNotExist { + return nil, fmt.Errorf("expected EOF or ',', found %s", tok.String()) + } + + tok, lit := p.consume(keyAndOperatorContext) + //nolint:exhaustive + switch tok { + case notInToken: + term.Invert = true + + fallthrough + case inToken: + term.Op = resource.LabelOpIn + case neqToken: + term.Invert = true + + fallthrough + case eqToken, doubleEQToken: + term.Op = resource.LabelOpEqual + // >= is inverse to < + case gteToken: + term.Invert = true + + fallthrough + case ltToken: + term.Op = resource.LabelOpLTNumeric + // > is inverse to <= + case gtToken: + term.Invert = true + + fallthrough + case lteToken: + term.Op = resource.LabelOpLTENumeric + default: + allowedTokens := []lexerToken{ + doubleEQToken, + eqToken, + neqToken, + gteToken, + gtToken, + inToken, + notInToken, + lteToken, + ltToken, + } + + return nil, fmt.Errorf("found '%s', expected: %v", lit, strings.Join(xslices.Map(allowedTokens, func(t lexerToken) string { return t.String() }), ", ")) + } + + if term.Op == resource.LabelOpIn { + term.Value, err = p.parseValues() + + return &term, err + } + + term.Value, err = p.parseExactValue() + + return &term, err +} + +// parseValues parses the values for set based matching (x,y,z). +func (p *parser) parseValues() ([]string, error) { + tok, lit := p.consume(valuesContext) + if tok != openParToken { + return nil, fmt.Errorf("found '%s' expected: '('", lit) + } + + tok, lit = p.lookahead(valuesContext) + //nolint:exhaustive + switch tok { + case IdentifierToken, commaToken: + s, err := p.parseIdentifiersList() // handles general cases + if err != nil { + return nil, err + } + + if tok, _ = p.consume(valuesContext); tok != closedParToken { + return nil, fmt.Errorf("found '%s', expected: ')'", lit) + } + + res := maps.Keys(s) + sort.Strings(res) + + return res, nil + case closedParToken: // handles "()" + p.consume(valuesContext) + + return []string{""}, nil + default: + return nil, fmt.Errorf("found '%s', expected: ',', ')' or identifier", lit) + } +} + +// parseIdentifiersList parses a (possibly empty) list +// of comma separated (possibly empty) identifiers. +func (p *parser) parseIdentifiersList() (map[string]struct{}, error) { + s := map[string]struct{}{} + + for { + tok, lit := p.consume(valuesContext) + //nolint:exhaustive + switch tok { + case IdentifierToken: + s[lit] = struct{}{} + + tok2, lit2 := p.lookahead(valuesContext) + + //nolint:exhaustive + switch tok2 { + case commaToken: + continue + case closedParToken: + return s, nil + default: + return nil, fmt.Errorf("found '%s', expected: ',' or ')'", lit2) + } + case commaToken: // handled here since we can have "(," + if len(s) == 0 { + s[""] = struct{}{} // to handle (, + } + + tok2, _ := p.lookahead(valuesContext) + if tok2 == closedParToken { + s[""] = struct{}{} // to handle ,) Double "" removed by StringSet + + return s, nil + } + + if tok2 == commaToken { + p.consume(valuesContext) + + s[""] = struct{}{} // to handle ,, Double "" removed by StringSet + } + default: // it can be operator + return s, fmt.Errorf("found '%s', expected: ',', or identifier", lit) + } + } +} + +// parseExactValue parses the only value for exact match style. +func (p *parser) parseExactValue() ([]string, error) { + tok, _ := p.lookahead(valuesContext) + if tok == endOfStringToken || tok == commaToken { + return []string{""}, nil + } + + tok, lit := p.consume(valuesContext) + if tok == IdentifierToken { + return []string{lit}, nil + } + + return nil, fmt.Errorf("found '%s', expected: identifier", lit) +} diff --git a/client/pkg/example_test.go b/client/pkg/example_test.go new file mode 100644 index 00000000..dedfb8fe --- /dev/null +++ b/client/pkg/example_test.go @@ -0,0 +1,33 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package pkg_test + +import ( + "os" + + "github.com/siderolabs/omni/client/pkg/omnictl" + "github.com/siderolabs/omni/client/pkg/version" +) + +//nolint:wsl,testableexamples +func Example() { + // This is an example of building omnictl executable. + + version.Name = "omni" + version.SHA = "build SHA" // Optional. + version.Tag = "v0.29.0" // Optional. + version.API = 1 // Required: omnictl validates that the client has the same API version as the server. + + // You can disable this validation and warnings by setting: + // version.SuppressVersionWarning = true + + // Initialize Root cmd version. + omnictl.RootCmd.Version = version.String() + + // Run Root command. + if err := omnictl.RootCmd.Execute(); err != nil { + os.Exit(1) + } +} diff --git a/client/pkg/meta/labels.go b/client/pkg/meta/labels.go new file mode 100644 index 00000000..1291bda6 --- /dev/null +++ b/client/pkg/meta/labels.go @@ -0,0 +1,31 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +// Package meta keeps Talos meta partition utils. +package meta + +import "gopkg.in/yaml.v3" + +// ImageLabels describes structure that is stored in the Talos metadata and keeps machine labels +// that are initially assigned to the machine when it connects to Omni. +type ImageLabels struct { + Labels map[string]string `yaml:"machineLabels"` + LegacyLabels map[string]string `yaml:"machineInitialLabels,omitempty"` +} + +// Encode converts labels to the serialized value to be stored in the meta partition. +func (l ImageLabels) Encode() ([]byte, error) { + return yaml.Marshal(l) +} + +// ParseLabels reads label from the encoded metadata value. +func ParseLabels(data []byte) (*ImageLabels, error) { + labels := &ImageLabels{} + + if err := yaml.Unmarshal(data, &labels); err != nil { + return nil, err + } + + return labels, nil +} diff --git a/client/pkg/meta/meta.go b/client/pkg/meta/meta.go new file mode 100644 index 00000000..e47235e3 --- /dev/null +++ b/client/pkg/meta/meta.go @@ -0,0 +1,38 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +// Package meta keeps Talos meta partition utils. +package meta + +// StateEncryptionConfig is github.com/siderolabs/talos/internal/pkg/meta.StateEncryptionConfig. +const StateEncryptionConfig = 9 + +// MetalNetworkPlatformConfig is github.com/siderolabs/talos/internal/pkg/meta.MetalNetworkPlatformConfig. +// tsgen:MetalNetworkPlatformConfig +const MetalNetworkPlatformConfig = 10 + +// LabelsMeta is github.com/siderolabs/talos/internal/pkg/meta.UserReserved1. +// Omni stores initial machine labels under that key. +// tsgen:LabelsMeta +const LabelsMeta = 12 + +// UserReserved2 is github.com/siderolabs/talos/internal/pkg/meta.UserReserved2. +const UserReserved2 = 13 + +// UserReserved3 is github.com/siderolabs/talos/internal/pkg/meta.UserReserved3. +const UserReserved3 = 14 + +// CanSetMetaKey checks if the meta key can be set using Omni/Image Factory. +// To avoid messing up things which are internal to Talos. +func CanSetMetaKey(key int) bool { + switch key { + case LabelsMeta, + MetalNetworkPlatformConfig, + UserReserved2, + UserReserved3: + return true + } + + return false +} diff --git a/client/pkg/omni/resources/auth/access_policy.go b/client/pkg/omni/resources/auth/access_policy.go new file mode 100644 index 00000000..d0cce86c --- /dev/null +++ b/client/pkg/omni/resources/auth/access_policy.go @@ -0,0 +1,52 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package auth + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +const ( + // AccessPolicyID is the ID of AccessPolicy resource. + AccessPolicyID = "access-policy" + + // AccessPolicyType is the type of AccessPolicy resource. + // + // tsgen:AccessPolicyType + AccessPolicyType = resource.Type("AccessPolicies.omni.sidero.dev") +) + +// NewAccessPolicy creates new AccessPolicy resource. +func NewAccessPolicy() *AccessPolicy { + return typed.NewResource[AccessPolicySpec, AccessPolicyExtension]( + resource.NewMetadata(resources.DefaultNamespace, AccessPolicyType, AccessPolicyID, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.AccessPolicySpec{}), + ) +} + +// AccessPolicy resource describes a user ACL. +type AccessPolicy = typed.Resource[AccessPolicySpec, AccessPolicyExtension] + +// AccessPolicySpec wraps specs.AccessPolicySpec. +type AccessPolicySpec = protobuf.ResourceSpec[specs.AccessPolicySpec, *specs.AccessPolicySpec] + +// AccessPolicyExtension providers auxiliary methods for AccessPolicy resource. +type AccessPolicyExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (AccessPolicyExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: AccessPolicyType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{}, + } +} diff --git a/client/pkg/omni/resources/auth/auth.go b/client/pkg/omni/resources/auth/auth.go new file mode 100644 index 00000000..c8af3244 --- /dev/null +++ b/client/pkg/omni/resources/auth/auth.go @@ -0,0 +1,18 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +// Package auth provides resources related to the authentication. +package auth + +import "github.com/siderolabs/omni/client/pkg/omni/resources/registry" + +func init() { + registry.MustRegisterResource(AuthConfigType, &Config{}) + registry.MustRegisterResource(IdentityType, &Identity{}) + registry.MustRegisterResource(PublicKeyType, &PublicKey{}) + registry.MustRegisterResource(UserType, &User{}) + registry.MustRegisterResource(AccessPolicyType, &AccessPolicy{}) + registry.MustRegisterResource(SAMLAssertionType, &SAMLAssertion{}) + registry.MustRegisterResource(SAMLLabelRuleType, &SAMLLabelRule{}) +} diff --git a/client/pkg/omni/resources/auth/config.go b/client/pkg/omni/resources/auth/config.go new file mode 100644 index 00000000..fe67dbfd --- /dev/null +++ b/client/pkg/omni/resources/auth/config.go @@ -0,0 +1,64 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package auth + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +const ( + // ConfigID is the resource ID under which the authentication parameters for auth0 & webauthn will be written to COSI state. + // tsgen:AuthConfigID + ConfigID = "auth-config" +) + +// NewAuthConfig creates new Config state. +func NewAuthConfig() *Config { + return typed.NewResource[ConfigSpec, ConfigExtension]( + resource.NewMetadata(resources.DefaultNamespace, AuthConfigType, ConfigID, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.AuthConfigSpec{}), + ) +} + +const ( + // AuthConfigType is the type of Config resource. + // + // tsgen:AuthConfigType + AuthConfigType = resource.Type("AuthConfigs.omni.sidero.dev") +) + +// Config resource is the Omni authentication configuration. +// +// Config resource ID is a human-readable string without white-space that uniquely identifies the installation media. +type Config = typed.Resource[ConfigSpec, ConfigExtension] + +// ConfigSpec wraps specs.AuthConfigSpec. +type ConfigSpec = protobuf.ResourceSpec[specs.AuthConfigSpec, *specs.AuthConfigSpec] + +// ConfigExtension providers auxiliary methods for Config resource. +type ConfigExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (ConfigExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: AuthConfigType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{}, + } +} + +// Enabled check is config settings has any auth enabled. +func Enabled(res *Config) bool { + spec := res.TypedSpec().Value + + return spec.Auth0.Enabled || spec.Webauthn.Enabled || spec.Saml.Enabled +} diff --git a/client/pkg/omni/resources/auth/identity.go b/client/pkg/omni/resources/auth/identity.go new file mode 100644 index 00000000..1a98bc79 --- /dev/null +++ b/client/pkg/omni/resources/auth/identity.go @@ -0,0 +1,49 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package auth + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewIdentity creates a new Identity resource. +func NewIdentity(ns, id string) *Identity { + return typed.NewResource[IdentitySpec, IdentityExtension]( + resource.NewMetadata(ns, IdentityType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.IdentitySpec{}), + ) +} + +const ( + // IdentityType is the type of Identity resource. + // + // tsgen:IdentityType + IdentityType = resource.Type("Identities.omni.sidero.dev") +) + +// Identity resource describes a user identity. +type Identity = typed.Resource[IdentitySpec, IdentityExtension] + +// IdentitySpec wraps specs.IdentitySpec. +type IdentitySpec = protobuf.ResourceSpec[specs.IdentitySpec, *specs.IdentitySpec] + +// IdentityExtension providers auxiliary methods for Identity resource. +type IdentityExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (IdentityExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: IdentityType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{}, + } +} diff --git a/client/pkg/omni/resources/auth/labels.go b/client/pkg/omni/resources/auth/labels.go new file mode 100644 index 00000000..9bf14a3d --- /dev/null +++ b/client/pkg/omni/resources/auth/labels.go @@ -0,0 +1,32 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package auth + +const ( + // SAMLLabelPrefix is the prefix added to all SAML attributes on the User resource. + // tsgen:SAMLLabelPrefix + SAMLLabelPrefix = "saml.omni.sidero.dev/" +) + +const ( + // LabelPublicKeyUserID is the label that defines the user ID of the public key. + LabelPublicKeyUserID = "user-id" + + // LabelIdentityUserID is a label linking identity to the user. + // tsgen:LabelIdentityUserID + LabelIdentityUserID = "user-id" + + // LabelIdentityTypeServiceAccount is set when the type of the identity is service account. + // tsgen:LabelIdentityTypeServiceAccount + LabelIdentityTypeServiceAccount = "type-service-account" +) + +const ( + // LabelSAMLRole is the roles attribute that is copied from SAML assertion. + LabelSAMLRole = SAMLLabelPrefix + "role" + + // LabelSAMLGroups is the groups attribute that is copied from SAML assertion. + LabelSAMLGroups = SAMLLabelPrefix + "groups" +) diff --git a/client/pkg/omni/resources/auth/public_key.go b/client/pkg/omni/resources/auth/public_key.go new file mode 100644 index 00000000..a1c3882d --- /dev/null +++ b/client/pkg/omni/resources/auth/public_key.go @@ -0,0 +1,49 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package auth + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewPublicKey creates a new PublicKey resource. +func NewPublicKey(ns, id string) *PublicKey { + return typed.NewResource[PublicKeySpec, PublicKeyExtension]( + resource.NewMetadata(ns, PublicKeyType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.PublicKeySpec{}), + ) +} + +const ( + // PublicKeyType is the type of PublicKey resource. + // + // tsgen:PublicKeyType + PublicKeyType = resource.Type("PublicKeys.omni.sidero.dev") +) + +// PublicKey resource describes a user public key. +type PublicKey = typed.Resource[PublicKeySpec, PublicKeyExtension] + +// PublicKeySpec wraps specs.PublicKeySpec. +type PublicKeySpec = protobuf.ResourceSpec[specs.PublicKeySpec, *specs.PublicKeySpec] + +// PublicKeyExtension providers auxiliary methods for PublicKey resource. +type PublicKeyExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (PublicKeyExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: PublicKeyType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{}, + } +} diff --git a/client/pkg/omni/resources/auth/saml_assertion.go b/client/pkg/omni/resources/auth/saml_assertion.go new file mode 100644 index 00000000..a5c033e4 --- /dev/null +++ b/client/pkg/omni/resources/auth/saml_assertion.go @@ -0,0 +1,47 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package auth + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewSAMLAssertion creates a new SAMLAssertion resource. +func NewSAMLAssertion(ns, id string) *SAMLAssertion { + return typed.NewResource[SAMLAssertionSpec, SAMLAssertionExtension]( + resource.NewMetadata(ns, SAMLAssertionType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.SAMLAssertionSpec{}), + ) +} + +const ( + // SAMLAssertionType is the type of SAMLAssertion resource. + SAMLAssertionType = resource.Type("SAMLAssertions.omni.sidero.dev") +) + +// SAMLAssertion resource describes SAML assertion. +type SAMLAssertion = typed.Resource[SAMLAssertionSpec, SAMLAssertionExtension] + +// SAMLAssertionSpec wraps specs.SAMLAssertionSpec. +type SAMLAssertionSpec = protobuf.ResourceSpec[specs.SAMLAssertionSpec, *specs.SAMLAssertionSpec] + +// SAMLAssertionExtension providers auxiliary methods for SAMLAssertion resource. +type SAMLAssertionExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (SAMLAssertionExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: SAMLAssertionType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{}, + } +} diff --git a/client/pkg/omni/resources/auth/saml_label_rule.go b/client/pkg/omni/resources/auth/saml_label_rule.go new file mode 100644 index 00000000..8464ff34 --- /dev/null +++ b/client/pkg/omni/resources/auth/saml_label_rule.go @@ -0,0 +1,58 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package auth + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewSAMLLabelRule creates a new SAMLLabelRule resource. +func NewSAMLLabelRule(ns, id string) *SAMLLabelRule { + return typed.NewResource[SAMLLabelRuleSpec, SAMLLabelRuleExtension]( + resource.NewMetadata(ns, SAMLLabelRuleType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.SAMLLabelRuleSpec{}), + ) +} + +const ( + // SAMLLabelRuleType is the type of SAMLLabelRule resource. + // + // tsgen:SAMLLabelRuleType + SAMLLabelRuleType = resource.Type("SAMLLabelRules.omni.sidero.dev") +) + +// SAMLLabelRule resource describes a SAML label rule. +type SAMLLabelRule = typed.Resource[SAMLLabelRuleSpec, SAMLLabelRuleExtension] + +// SAMLLabelRuleSpec wraps specs.SAMLLabelRuleSpec. +type SAMLLabelRuleSpec = protobuf.ResourceSpec[specs.SAMLLabelRuleSpec, *specs.SAMLLabelRuleSpec] + +// SAMLLabelRuleExtension providers auxiliary methods for SAMLLabelRule resource. +type SAMLLabelRuleExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (SAMLLabelRuleExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: SAMLLabelRuleType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{ + { + Name: "Role On Registration", + JSONPath: "{.assignroleonregistration}", + }, + { + Name: "Match Labels", + JSONPath: "{.matchlabels}", + }, + }, + } +} diff --git a/client/pkg/omni/resources/auth/user.go b/client/pkg/omni/resources/auth/user.go new file mode 100644 index 00000000..83d3cdf5 --- /dev/null +++ b/client/pkg/omni/resources/auth/user.go @@ -0,0 +1,49 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package auth + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewUser creates a new User resource. +func NewUser(ns, id string) *User { + return typed.NewResource[UserSpec, UserExtension]( + resource.NewMetadata(ns, UserType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.UserSpec{}), + ) +} + +const ( + // UserType is the type of User resource. + // + // tsgen:UserType + UserType = resource.Type("Users.omni.sidero.dev") +) + +// User resource describes a user. +type User = typed.Resource[UserSpec, UserExtension] + +// UserSpec wraps specs.UserSpec. +type UserSpec = protobuf.ResourceSpec[specs.UserSpec, *specs.UserSpec] + +// UserExtension providers auxiliary methods for User resource. +type UserExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (UserExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: UserType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{}, + } +} diff --git a/client/pkg/omni/resources/common/common.go b/client/pkg/omni/resources/common/common.go new file mode 100644 index 00000000..421a8f9c --- /dev/null +++ b/client/pkg/omni/resources/common/common.go @@ -0,0 +1,30 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +// Package common contains common variables related to resources. +package common + +import ( + "github.com/cosi-project/runtime/pkg/resource" + + authres "github.com/siderolabs/omni/client/pkg/omni/resources/auth" + "github.com/siderolabs/omni/client/pkg/omni/resources/omni" +) + +// UserManagedResourceTypes is a list of resource types that are managed by the user. +var UserManagedResourceTypes = []resource.Type{ + authres.IdentityType, + authres.UserType, + authres.AccessPolicyType, + authres.SAMLLabelRuleType, + omni.ClusterType, + omni.ConfigPatchType, + omni.EtcdManualBackupType, + omni.MachineClassType, + omni.MachineLabelsType, + omni.MachineSetType, + omni.MachineSetNodeType, + omni.EtcdBackupS3ConfType, + omni.SchematicConfigurationType, +} diff --git a/client/pkg/omni/resources/k8s/k8s.go b/client/pkg/omni/resources/k8s/k8s.go new file mode 100644 index 00000000..451220d5 --- /dev/null +++ b/client/pkg/omni/resources/k8s/k8s.go @@ -0,0 +1,12 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +// Package k8s provides resources related to the Kubernetes. +package k8s + +import "github.com/siderolabs/omni/client/pkg/omni/resources/registry" + +func init() { + registry.MustRegisterResource(KubernetesResourceType, &KubernetesResource{}) +} diff --git a/client/pkg/omni/resources/k8s/kubernetes_resource.go b/client/pkg/omni/resources/k8s/kubernetes_resource.go new file mode 100644 index 00000000..c0accbd6 --- /dev/null +++ b/client/pkg/omni/resources/k8s/kubernetes_resource.go @@ -0,0 +1,51 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +// Package k8s contains Kubernetes resource wrapper. +package k8s + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewKubernetesResource creates new cluster config version resource. +func NewKubernetesResource(ns string, id resource.ID, spec KubernetesResourceSpec) *KubernetesResource { + return typed.NewResource[KubernetesResourceSpec, KubernetesResourceExtension]( + resource.NewMetadata(ns, KubernetesResourceType, id, resource.VersionUndefined), + spec, + ) +} + +// KubernetesResourceType is the type of KubernetesResource resource. +// +// tsgen:KubernetesResourceType +const KubernetesResourceType = resource.Type("KubernetesResources.omni.sidero.dev") + +// KubernetesResource wraps the Kubernetes Resource. +type KubernetesResource = typed.Resource[KubernetesResourceSpec, KubernetesResourceExtension] + +// KubernetesResourceSpec wraps specs.KubernetesResourceSpec. +type KubernetesResourceSpec string + +// DeepCopy implements DeepCopyable interface. +func (s KubernetesResourceSpec) DeepCopy() KubernetesResourceSpec { + return s +} + +// KubernetesResourceExtension provides auxiliary methods for KubernetesResource. +type KubernetesResourceExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (KubernetesResourceExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: KubernetesResourceType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{}, + } +} diff --git a/client/pkg/omni/resources/oidc/jwt_public_key.go b/client/pkg/omni/resources/oidc/jwt_public_key.go new file mode 100644 index 00000000..f768304f --- /dev/null +++ b/client/pkg/omni/resources/oidc/jwt_public_key.go @@ -0,0 +1,43 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package oidc + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" +) + +// NewJWTPublicKey creates new JWTPublicKey state. +func NewJWTPublicKey(ns, id string) *JWTPublicKey { + return typed.NewResource[JWTPublicKeySpec, JWTPublicKeyExtension]( + resource.NewMetadata(ns, JWTPublicKeyType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.JWTPublicKeySpec{}), + ) +} + +// JWTPublicKeyType is the type of JWTPublicKey resource. +const JWTPublicKeyType = resource.Type("JWTPublicKeys.system.sidero.dev") + +// JWTPublicKey resource describes current DB version (migrations state). +type JWTPublicKey = typed.Resource[JWTPublicKeySpec, JWTPublicKeyExtension] + +// JWTPublicKeySpec wraps specs.JWTPublicKeySpec. +type JWTPublicKeySpec = protobuf.ResourceSpec[specs.JWTPublicKeySpec, *specs.JWTPublicKeySpec] + +// JWTPublicKeyExtension providers auxiliary methods for JWTPublicKey resource. +type JWTPublicKeyExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (JWTPublicKeyExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: JWTPublicKeyType, + Aliases: []resource.Type{}, + DefaultNamespace: NamespaceName, + } +} diff --git a/client/pkg/omni/resources/oidc/oidc.go b/client/pkg/omni/resources/oidc/oidc.go new file mode 100644 index 00000000..987a3612 --- /dev/null +++ b/client/pkg/omni/resources/oidc/oidc.go @@ -0,0 +1,19 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +// Package oidc provides resources related to the OpenID provider. +package oidc + +import ( + "github.com/cosi-project/runtime/pkg/resource" + + "github.com/siderolabs/omni/client/pkg/omni/resources/registry" +) + +// NamespaceName is the namespace for OIDC resources. +const NamespaceName resource.Namespace = "oidc" + +func init() { + registry.MustRegisterResource(JWTPublicKeyType, &JWTPublicKey{}) +} diff --git a/client/pkg/omni/resources/omni/annotations.go b/client/pkg/omni/resources/omni/annotations.go new file mode 100644 index 00000000..cdd078d2 --- /dev/null +++ b/client/pkg/omni/resources/omni/annotations.go @@ -0,0 +1,23 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +const ( + // MachineLocked locks any updates on a machine set node. + // tsgen:MachineLocked + MachineLocked = SystemLabelPrefix + "locked" + + // ResourceManagedByClusterTemplates is an annotation which indicates that a resource is managed by cluster templates. + // tsgen:ResourceManagedByClusterTemplates + ResourceManagedByClusterTemplates = SystemLabelPrefix + "managed-by-cluster-templates" + + // ConfigPatchName human readable patch name. + // tsgen:ConfigPatchName + ConfigPatchName = "name" + + // ConfigPatchDescription human readable patch description. + // tsgen:ConfigPatchDescription + ConfigPatchDescription = "description" +) diff --git a/client/pkg/omni/resources/omni/backup_conf.go b/client/pkg/omni/resources/omni/backup_conf.go new file mode 100644 index 00000000..9a724b39 --- /dev/null +++ b/client/pkg/omni/resources/omni/backup_conf.go @@ -0,0 +1,74 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewEtcdBackupS3Conf creates new resource which holds for backup s3 configuration. +func NewEtcdBackupS3Conf() *EtcdBackupS3Conf { + return typed.NewResource[EtcdBackupS3ConfSpec, EtcdBackupS3ConfExtension]( + resource.NewMetadata(resources.DefaultNamespace, EtcdBackupS3ConfType, EtcdBackupS3ConfID, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.EtcdBackupS3ConfSpec{}), + ) +} + +const ( + // EtcdBackupS3ConfID is the ID of the EtcdBackupS3Conf resource. + // tsgen:EtcdBackupS3ConfID + EtcdBackupS3ConfID = resource.ID("etcd-backup-s3-conf") + + // EtcdBackupS3ConfType is the type of the EtcdBackupS3Conf resource. + // tsgen:EtcdBackupS3ConfType + EtcdBackupS3ConfType = resource.Type("EtcdBackupS3Configs.omni.sidero.dev") +) + +// EtcdBackupS3Conf describes data needed for the etcd backup. +type EtcdBackupS3Conf = typed.Resource[EtcdBackupS3ConfSpec, EtcdBackupS3ConfExtension] + +// EtcdBackupS3ConfSpec wraps specs.EtcdBackupS3ConfSpec. +type EtcdBackupS3ConfSpec = protobuf.ResourceSpec[specs.EtcdBackupS3ConfSpec, *specs.EtcdBackupS3ConfSpec] + +// EtcdBackupS3ConfExtension provides auxiliary methods for EtcdBackupS3Conf resource. +type EtcdBackupS3ConfExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (EtcdBackupS3ConfExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: EtcdBackupS3ConfType, + DefaultNamespace: resources.DefaultNamespace, + Aliases: []resource.Type{}, + PrintColumns: []meta.PrintColumn{ + { + Name: "Bucket", + JSONPath: "{.bucket}", + }, + { + Name: "Region", + JSONPath: "{.region}", + }, + { + Name: "Endpoint", + JSONPath: "{.endpoint}", + }, + { + Name: "Access Key ID", + JSONPath: "{.accesskeyid}", + }, + { + Name: "Session Token", + JSONPath: "{.sessiontoken}", + }, + }, + Sensitivity: meta.Sensitive, + } +} diff --git a/client/pkg/omni/resources/omni/backup_data.go b/client/pkg/omni/resources/omni/backup_data.go new file mode 100644 index 00000000..0ad30d47 --- /dev/null +++ b/client/pkg/omni/resources/omni/backup_data.go @@ -0,0 +1,48 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewBackupData creates new resource which holds data for the next etcd backup. +func NewBackupData(id resource.ID) *BackupData { + return typed.NewResource[BackupDataSpec, BackupDataExtension]( + resource.NewMetadata(resources.DefaultNamespace, BackupDataType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.BackupDataSpec{}), + ) +} + +const ( + // BackupDataType is the type of the BackupData resource. + // tsgen:BackupDataType + BackupDataType = resource.Type("BackupDatas.omni.sidero.dev") +) + +// BackupData describes data needed for the etcd backup. +type BackupData = typed.Resource[BackupDataSpec, BackupDataExtension] + +// BackupDataSpec wraps specs.BackupDataSpec. +type BackupDataSpec = protobuf.ResourceSpec[specs.BackupDataSpec, *specs.BackupDataSpec] + +// BackupDataExtension provides auxiliary methods for BackupData resource. +type BackupDataExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (BackupDataExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: BackupDataType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{}, + } +} diff --git a/client/pkg/omni/resources/omni/cluster.go b/client/pkg/omni/resources/omni/cluster.go new file mode 100644 index 00000000..7d914ec9 --- /dev/null +++ b/client/pkg/omni/resources/omni/cluster.go @@ -0,0 +1,74 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "fmt" + "net/url" + "path/filepath" + "strings" + + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewCluster creates new cluster resource. +func NewCluster(ns string, id resource.ID) *Cluster { + return typed.NewResource[ClusterSpec, ClusterExtension]( + resource.NewMetadata(ns, ClusterType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.ClusterSpec{}), + ) +} + +const ( + // ClusterType is the type of the Cluster resource. + // tsgen:ClusterType + ClusterType = resource.Type("Clusters.omni.sidero.dev") +) + +// Cluster describes client config for Talos API. +type Cluster = typed.Resource[ClusterSpec, ClusterExtension] + +// ClusterSpec wraps specs.ClusterSpec. +type ClusterSpec = protobuf.ResourceSpec[specs.ClusterSpec, *specs.ClusterSpec] + +// ClusterExtension provides auxiliary methods for Cluster resource. +type ClusterExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (ClusterExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: ClusterType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{}, + } +} + +// GetInstallImage extracts Talos version from the cluster resource and adds the installer image url. +func GetInstallImage(vanillaInstallerBaseURL, factoryBaseURL, schematic, version string) (string, error) { + version = strings.TrimLeft(version, "v") + + if schematic == "" { + return fmt.Sprintf("%s:v%s", vanillaInstallerBaseURL, version), nil + } + + u, err := url.Parse(factoryBaseURL) + if err != nil { + return "", fmt.Errorf("failed to parse image factory url %w", err) + } + + return filepath.Join(u.Host, "installer", fmt.Sprintf("%s:v%s", schematic, version)), nil +} + +// GetEncryptionEnabled returns cluster disk encryption feature flag state. +func GetEncryptionEnabled(cluster *Cluster) bool { + return cluster.TypedSpec().Value.Features != nil && cluster.TypedSpec().Value.Features.DiskEncryption +} diff --git a/client/pkg/omni/resources/omni/cluster_bootstrap_status.go b/client/pkg/omni/resources/omni/cluster_bootstrap_status.go new file mode 100644 index 00000000..9405da99 --- /dev/null +++ b/client/pkg/omni/resources/omni/cluster_bootstrap_status.go @@ -0,0 +1,53 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewClusterBootstrapStatus creates new cluster bootstrap status resource. +func NewClusterBootstrapStatus(ns string, id resource.ID) *ClusterBootstrapStatus { + return typed.NewResource[ClusterBootstrapStatusSpec, ClusterBootstrapStatusExtension]( + resource.NewMetadata(ns, ClusterBootstrapStatusType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.ClusterBootstrapStatusSpec{}), + ) +} + +const ( + // ClusterBootstrapStatusType is the type of the ClusterMachineConfigStatus resource. + // tsgen:ClusterBootstrapStatusType + ClusterBootstrapStatusType = resource.Type("ClusterBootstrapStatuses.omni.sidero.dev") +) + +// ClusterBootstrapStatus describes a cluster machine status. +type ClusterBootstrapStatus = typed.Resource[ClusterBootstrapStatusSpec, ClusterBootstrapStatusExtension] + +// ClusterBootstrapStatusSpec wraps specs.ClusterBootstrapStatusSpec. +type ClusterBootstrapStatusSpec = protobuf.ResourceSpec[specs.ClusterBootstrapStatusSpec, *specs.ClusterBootstrapStatusSpec] + +// ClusterBootstrapStatusExtension provides auxiliary methods for ClusterBootstrapStatus resource. +type ClusterBootstrapStatusExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (ClusterBootstrapStatusExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: ClusterBootstrapStatusType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{ + { + Name: "Bootstrapped", + JSONPath: "{.bootstrapped}", + }, + }, + } +} diff --git a/client/pkg/omni/resources/omni/cluster_config_version.go b/client/pkg/omni/resources/omni/cluster_config_version.go new file mode 100644 index 00000000..f423b332 --- /dev/null +++ b/client/pkg/omni/resources/omni/cluster_config_version.go @@ -0,0 +1,48 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewClusterConfigVersion creates new cluster config version resource. +func NewClusterConfigVersion(ns string, id resource.ID) *ClusterConfigVersion { + return typed.NewResource[ClusterConfigVersionSpec, ClusterConfigVersionExtension]( + resource.NewMetadata(ns, ClusterConfigVersionType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.ClusterConfigVersionSpec{}), + ) +} + +const ( + // ClusterConfigVersionType is the type of the ClusterConfigVersion resource. + // tsgen:ClusterConfigVersionType + ClusterConfigVersionType = resource.Type("ClusterConfigVersions.omni.sidero.dev") +) + +// ClusterConfigVersion contains the version contract for the time when the cluster was created initially. +type ClusterConfigVersion = typed.Resource[ClusterConfigVersionSpec, ClusterConfigVersionExtension] + +// ClusterConfigVersionSpec wraps specs.ClusterConfigVersionSpec. +type ClusterConfigVersionSpec = protobuf.ResourceSpec[specs.ClusterConfigVersionSpec, *specs.ClusterConfigVersionSpec] + +// ClusterConfigVersionExtension provides auxiliary methods for ClusterConfigVersion resource. +type ClusterConfigVersionExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (ClusterConfigVersionExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: ClusterConfigVersionType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: nil, + } +} diff --git a/client/pkg/omni/resources/omni/cluster_destroy_status.go b/client/pkg/omni/resources/omni/cluster_destroy_status.go new file mode 100644 index 00000000..2f96de16 --- /dev/null +++ b/client/pkg/omni/resources/omni/cluster_destroy_status.go @@ -0,0 +1,53 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewClusterDestroyStatus creates new cluster destroy status. +func NewClusterDestroyStatus(ns string, id resource.ID) *ClusterDestroyStatus { + return typed.NewResource[ClusterDestroyStatusSpec, ClusterDestroyStatusExtension]( + resource.NewMetadata(ns, ClusterDestroyStatusType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.DestroyStatusSpec{}), + ) +} + +const ( + // ClusterDestroyStatusType is the type of the ClusterDestroyStatus resource. + // tsgen:ClusterDestroyStatusType + ClusterDestroyStatusType = resource.Type("ClusterDestroyStatuses.omni.sidero.dev") +) + +// ClusterDestroyStatus contains the state of cluster destroy for clusters in TearingDown phase. +type ClusterDestroyStatus = typed.Resource[ClusterDestroyStatusSpec, ClusterDestroyStatusExtension] + +// ClusterDestroyStatusSpec wraps specs.ClusterDestroyStatusSpec. +type ClusterDestroyStatusSpec = protobuf.ResourceSpec[specs.DestroyStatusSpec, *specs.DestroyStatusSpec] + +// ClusterDestroyStatusExtension provides auxiliary methods for ClusterDestroyStatus resource. +type ClusterDestroyStatusExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (ClusterDestroyStatusExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: ClusterDestroyStatusType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{ + { + Name: "Phase", + JSONPath: "{.phase}", + }, + }, + } +} diff --git a/client/pkg/omni/resources/omni/cluster_endpoint.go b/client/pkg/omni/resources/omni/cluster_endpoint.go new file mode 100644 index 00000000..78010d58 --- /dev/null +++ b/client/pkg/omni/resources/omni/cluster_endpoint.go @@ -0,0 +1,53 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewClusterEndpoint creates new cluster machine status resource. +func NewClusterEndpoint(ns string, id resource.ID) *ClusterEndpoint { + return typed.NewResource[ClusterEndpointSpec, ClusterEndpointExtension]( + resource.NewMetadata(ns, ClusterEndpointType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.ClusterEndpointSpec{}), + ) +} + +const ( + // ClusterEndpointType is the type of the ClusterEndpoint resource. + // tsgen:ClusterEndpointType + ClusterEndpointType = resource.Type("ClusterEndpoints.omni.sidero.dev") +) + +// ClusterEndpoint contains the summary for the cluster health, availability, number of nodes. +type ClusterEndpoint = typed.Resource[ClusterEndpointSpec, ClusterEndpointExtension] + +// ClusterEndpointSpec wraps specs.ClusterEndpointSpec. +type ClusterEndpointSpec = protobuf.ResourceSpec[specs.ClusterEndpointSpec, *specs.ClusterEndpointSpec] + +// ClusterEndpointExtension provides auxiliary methods for ClusterEndpoint resource. +type ClusterEndpointExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (ClusterEndpointExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: ClusterEndpointType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{ + { + Name: "Endpoints", + JSONPath: "{.managementaddresses}", + }, + }, + } +} diff --git a/client/pkg/omni/resources/omni/cluster_machine.go b/client/pkg/omni/resources/omni/cluster_machine.go new file mode 100644 index 00000000..cc9ece19 --- /dev/null +++ b/client/pkg/omni/resources/omni/cluster_machine.go @@ -0,0 +1,46 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewClusterMachine creates new cluster machine resource. +func NewClusterMachine(ns string, id resource.ID) *ClusterMachine { + return typed.NewResource[ClusterMachineSpec, ClusterMachineExtension]( + resource.NewMetadata(ns, ClusterMachineType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.ClusterMachineSpec{}), + ) +} + +// ClusterMachineType is the type of the ClusterMachine resource. +// tsgen:ClusterMachineType +const ClusterMachineType = resource.Type("ClusterMachines.omni.sidero.dev") + +// ClusterMachine describes a machine belonging to a cluster. +type ClusterMachine = typed.Resource[ClusterMachineSpec, ClusterMachineExtension] + +// ClusterMachineSpec wraps specs.ClusterMachineSpec. +type ClusterMachineSpec = protobuf.ResourceSpec[specs.ClusterMachineSpec, *specs.ClusterMachineSpec] + +// ClusterMachineExtension provides auxiliary methods for ClusterMachine resource. +type ClusterMachineExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (ClusterMachineExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: ClusterMachineType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{}, + } +} diff --git a/client/pkg/omni/resources/omni/cluster_machine_config.go b/client/pkg/omni/resources/omni/cluster_machine_config.go new file mode 100644 index 00000000..d5e7620b --- /dev/null +++ b/client/pkg/omni/resources/omni/cluster_machine_config.go @@ -0,0 +1,49 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewClusterMachineConfig creates new cluster machine config resource. +func NewClusterMachineConfig(ns string, id resource.ID) *ClusterMachineConfig { + return typed.NewResource[ClusterMachineConfigSpec, ClusterMachineConfigExtension]( + resource.NewMetadata(ns, ClusterMachineConfigType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.ClusterMachineConfigSpec{}), + ) +} + +const ( + // ClusterMachineConfigType is the type of the ClusterMachineConfig resource. + // tsgen:ClusterMachineConfigType + ClusterMachineConfigType = resource.Type("ClusterMachineConfigs.omni.sidero.dev") +) + +// ClusterMachineConfig is the final machine config generated from the template, cluster machine, loadbalancer status +// and siderolink config. +type ClusterMachineConfig = typed.Resource[ClusterMachineConfigSpec, ClusterMachineConfigExtension] + +// ClusterMachineConfigSpec wraps specs.ClusterMachineConfigSpec. +type ClusterMachineConfigSpec = protobuf.ResourceSpec[specs.ClusterMachineConfigSpec, *specs.ClusterMachineConfigSpec] + +// ClusterMachineConfigExtension provides auxiliary methods for ClusterMachineConfig resource. +type ClusterMachineConfigExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (ClusterMachineConfigExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: ClusterMachineConfigType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{}, + } +} diff --git a/client/pkg/omni/resources/omni/cluster_machine_config_patches.go b/client/pkg/omni/resources/omni/cluster_machine_config_patches.go new file mode 100644 index 00000000..02531d95 --- /dev/null +++ b/client/pkg/omni/resources/omni/cluster_machine_config_patches.go @@ -0,0 +1,46 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewClusterMachineConfigPatches creates new cluster machine config patches resource. +func NewClusterMachineConfigPatches(ns string, id resource.ID) *ClusterMachineConfigPatches { + return typed.NewResource[ClusterMachineConfigPatchesSpec, ClusterMachineConfigPatchesExtension]( + resource.NewMetadata(ns, ClusterMachineConfigPatchesType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.ClusterMachineConfigPatchesSpec{}), + ) +} + +// ClusterMachineConfigPatchesType is the type of the ClusterMachineConfigPatches resource. +// tsgen:ClusterMachineConfigPatchesType +const ClusterMachineConfigPatchesType = resource.Type("ClusterMachineConfigPatches.omni.sidero.dev") + +// ClusterMachineConfigPatches describes a config patch list related to the cluster machine. +type ClusterMachineConfigPatches = typed.Resource[ClusterMachineConfigPatchesSpec, ClusterMachineConfigPatchesExtension] + +// ClusterMachineConfigPatchesSpec wraps specs.ClusterMachineConfigPatchesSpec. +type ClusterMachineConfigPatchesSpec = protobuf.ResourceSpec[specs.ClusterMachineConfigPatchesSpec, *specs.ClusterMachineConfigPatchesSpec] + +// ClusterMachineConfigPatchesExtension provides auxiliary methods for ClusterMachineConfigPatches resource. +type ClusterMachineConfigPatchesExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (ClusterMachineConfigPatchesExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: ClusterMachineConfigPatchesType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{}, + } +} diff --git a/client/pkg/omni/resources/omni/cluster_machine_config_patches_test.go b/client/pkg/omni/resources/omni/cluster_machine_config_patches_test.go new file mode 100644 index 00000000..f17e5ce9 --- /dev/null +++ b/client/pkg/omni/resources/omni/cluster_machine_config_patches_test.go @@ -0,0 +1,86 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni_test + +import ( + "fmt" + "testing" + "time" + + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/siderolabs/gen/xtesting/must" + "github.com/stretchr/testify/require" + "gopkg.in/yaml.v3" + + "github.com/siderolabs/omni/client/pkg/omni/resources/omni" +) + +const ( + newLineAndText = ` + master: 2 + workers: 3` + + justText = `master: 1 +text: "test"` +) + +func TestClusterMachineConfigPatchesSpecW_marshal(t *testing.T) { + original := omni.NewClusterMachineConfigPatches("default", "1") + original.TypedSpec().Value.Patches = []string{newLineAndText, justText} + + out := must.Value(yaml.Marshal(must.Value(resource.MarshalYAML(original))(t)))(t) + + var dest protobuf.YAMLResource + + err := yaml.Unmarshal(out, &dest) + require.NoError(t, err) + + fmt.Println(string(out)) + + if !resource.Equal(original, dest.Resource()) { + t.Log("original -->", string(must.Value(yaml.Marshal(original.Spec()))(t))) + t.Log("result -->", string(must.Value(yaml.Marshal(dest.Resource().Spec()))(t))) + t.FailNow() + } +} + +func ExampleClusterMachineSpec_marshal() { + original := omni.NewClusterMachineConfigPatches("default", "1") + original.TypedSpec().Value.Patches = []string{newLineAndText, justText} + + current := time.Date(2022, 12, 9, 0, 0, 0, 0, time.UTC) + original.Metadata().SetCreated(current) + original.Metadata().SetUpdated(current) + + wrap, err := resource.MarshalYAML(original) + if err != nil { + panic(err) + } + + out, err := yaml.Marshal(wrap) + if err != nil { + panic(err) + } + + fmt.Println(string(out)) + + // Output: + // metadata: + // namespace: default + // type: ClusterMachineConfigPatches.omni.sidero.dev + // id: 1 + // version: undefined + // owner: + // phase: running + // created: 2022-12-09T00:00:00Z + // updated: 2022-12-09T00:00:00Z + // spec: + // patches: + // - "\n master: 2\n\tworkers: 3" + // - |- + // master: 1 + // text: "test" +} diff --git a/client/pkg/omni/resources/omni/cluster_machine_config_status.go b/client/pkg/omni/resources/omni/cluster_machine_config_status.go new file mode 100644 index 00000000..3e41b96e --- /dev/null +++ b/client/pkg/omni/resources/omni/cluster_machine_config_status.go @@ -0,0 +1,48 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewClusterMachineConfigStatus creates new cluster machine status resource. +func NewClusterMachineConfigStatus(ns string, id resource.ID) *ClusterMachineConfigStatus { + return typed.NewResource[ClusterMachineConfigStatusSpec, ClusterMachineConfigStatusExtension]( + resource.NewMetadata(ns, ClusterMachineConfigStatusType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.ClusterMachineConfigStatusSpec{}), + ) +} + +const ( + // ClusterMachineConfigStatusType is the type of the ClusterMachineConfigStatus resource. + // tsgen:ClusterMachineConfigStatusType + ClusterMachineConfigStatusType = resource.Type("ClusterMachineConfigStatuses.omni.sidero.dev") +) + +// ClusterMachineConfigStatus describes a cluster machine status. +type ClusterMachineConfigStatus = typed.Resource[ClusterMachineConfigStatusSpec, ClusterMachineConfigStatusExtension] + +// ClusterMachineConfigStatusSpec wraps specs.ClusterMachineConfigStatusSpec. +type ClusterMachineConfigStatusSpec = protobuf.ResourceSpec[specs.ClusterMachineConfigStatusSpec, *specs.ClusterMachineConfigStatusSpec] + +// ClusterMachineConfigStatusExtension provides auxiliary methods for ClusterMachineConfigStatus resource. +type ClusterMachineConfigStatusExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (ClusterMachineConfigStatusExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: ClusterMachineConfigStatusType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{}, + } +} diff --git a/client/pkg/omni/resources/omni/cluster_machine_encryption_key.go b/client/pkg/omni/resources/omni/cluster_machine_encryption_key.go new file mode 100644 index 00000000..02dc5573 --- /dev/null +++ b/client/pkg/omni/resources/omni/cluster_machine_encryption_key.go @@ -0,0 +1,48 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewClusterMachineEncryptionKey creates new cluster machine encryption key resource. +func NewClusterMachineEncryptionKey(ns string, id resource.ID) *ClusterMachineEncryptionKey { + return typed.NewResource[ClusterMachineEncryptionKeySpec, ClusterMachineEncryptionKeyExtension]( + resource.NewMetadata(ns, ClusterMachineEncryptionKeyType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.ClusterMachineEncryptionKeySpec{}), + ) +} + +const ( + // ClusterMachineEncryptionKeyType is the type of the ClusterMachineEncryptionKey resource. + // tsgen:ClusterMachineEncryptionKeyType + ClusterMachineEncryptionKeyType = resource.Type("ClusterMachineEncryptionKeys.omni.sidero.dev") +) + +// ClusterMachineEncryptionKey is the generated AES256 encryption key. +type ClusterMachineEncryptionKey = typed.Resource[ClusterMachineEncryptionKeySpec, ClusterMachineEncryptionKeyExtension] + +// ClusterMachineEncryptionKeySpec wraps specs.ClusterMachineEncryptionKeySpec. +type ClusterMachineEncryptionKeySpec = protobuf.ResourceSpec[specs.ClusterMachineEncryptionKeySpec, *specs.ClusterMachineEncryptionKeySpec] + +// ClusterMachineEncryptionKeyExtension provides auxiliary methods for ClusterMachineEncryptionKey resource. +type ClusterMachineEncryptionKeyExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (ClusterMachineEncryptionKeyExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: ClusterMachineEncryptionKeyType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{}, + } +} diff --git a/client/pkg/omni/resources/omni/cluster_machine_identity.go b/client/pkg/omni/resources/omni/cluster_machine_identity.go new file mode 100644 index 00000000..e855136b --- /dev/null +++ b/client/pkg/omni/resources/omni/cluster_machine_identity.go @@ -0,0 +1,48 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewClusterMachineIdentity creates new cluster machine identity resource. +func NewClusterMachineIdentity(ns string, id resource.ID) *ClusterMachineIdentity { + return typed.NewResource[ClusterMachineIdentitySpec, ClusterMachineIdentityExtension]( + resource.NewMetadata(ns, ClusterMachineIdentityType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.ClusterMachineIdentitySpec{}), + ) +} + +const ( + // ClusterMachineIdentityType is the type of the ClusterMachineIdentity resource. + // tsgen:ClusterMachineIdentityType + ClusterMachineIdentityType = resource.Type("ClusterMachineIdentities.omni.sidero.dev") +) + +// ClusterMachineIdentity contains machine identifiers when it's part of a cluster. +type ClusterMachineIdentity = typed.Resource[ClusterMachineIdentitySpec, ClusterMachineIdentityExtension] + +// ClusterMachineIdentitySpec wraps specs.ClusterMachineIdentitySpec. +type ClusterMachineIdentitySpec = protobuf.ResourceSpec[specs.ClusterMachineIdentitySpec, *specs.ClusterMachineIdentitySpec] + +// ClusterMachineIdentityExtension provides auxiliary methods for ClusterMachineIdentity resource. +type ClusterMachineIdentityExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (ClusterMachineIdentityExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: ClusterMachineIdentityType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{}, + } +} diff --git a/client/pkg/omni/resources/omni/cluster_machine_installer_options.go b/client/pkg/omni/resources/omni/cluster_machine_installer_options.go new file mode 100644 index 00000000..33551aa2 --- /dev/null +++ b/client/pkg/omni/resources/omni/cluster_machine_installer_options.go @@ -0,0 +1,47 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewClusterMachineTalosVersion creates a new ClusterMachineTalosVersion state. +func NewClusterMachineTalosVersion(ns, id string) *ClusterMachineTalosVersion { + return typed.NewResource[ClusterMachineTalosVersionSpec, ClusterMachineTalosVersionExtension]( + resource.NewMetadata(ns, ClusterMachineTalosVersionType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.ClusterMachineTalosVersionSpec{}), + ) +} + +// ClusterMachineTalosVersionType is the type of the ClusterMachineTalosVersion resource. +// +// tsgen:ClusterMachineTalosVersionType +const ClusterMachineTalosVersionType = resource.Type("ClusterMachineTalosVersions.omni.sidero.dev") + +// ClusterMachineTalosVersion resource holds information about a machine relevant to its membership in a cluster. +type ClusterMachineTalosVersion = typed.Resource[ClusterMachineTalosVersionSpec, ClusterMachineTalosVersionExtension] + +// ClusterMachineTalosVersionSpec wraps specs.ClusterMachineTalosVersionSpec. +type ClusterMachineTalosVersionSpec = protobuf.ResourceSpec[specs.ClusterMachineTalosVersionSpec, *specs.ClusterMachineTalosVersionSpec] + +// ClusterMachineTalosVersionExtension providers auxiliary methods for ClusterMachineTalosVersion resource. +type ClusterMachineTalosVersionExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (ClusterMachineTalosVersionExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: ClusterMachineTalosVersionType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{}, + } +} diff --git a/client/pkg/omni/resources/omni/cluster_machine_status.go b/client/pkg/omni/resources/omni/cluster_machine_status.go new file mode 100644 index 00000000..007e6b44 --- /dev/null +++ b/client/pkg/omni/resources/omni/cluster_machine_status.go @@ -0,0 +1,60 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewClusterMachineStatus creates a new ClusterMachineStatus state. +func NewClusterMachineStatus(ns, id string) *ClusterMachineStatus { + return typed.NewResource[ClusterMachineStatusSpec, ClusterMachineStatusExtension]( + resource.NewMetadata(ns, ClusterMachineStatusType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.ClusterMachineStatusSpec{}), + ) +} + +// ClusterMachineStatusType is the type of the ClusterMachineStatus resource. +// +// tsgen:ClusterMachineStatusType +const ClusterMachineStatusType = resource.Type("ClusterMachineStatuses.omni.sidero.dev") + +// ClusterMachineStatus resource holds information about a machine relevant to its membership in a cluster. +type ClusterMachineStatus = typed.Resource[ClusterMachineStatusSpec, ClusterMachineStatusExtension] + +// ClusterMachineStatusSpec wraps specs.ClusterMachineStatusSpec. +type ClusterMachineStatusSpec = protobuf.ResourceSpec[specs.ClusterMachineStatusSpec, *specs.ClusterMachineStatusSpec] + +// ClusterMachineStatusExtension providers auxiliary methods for ClusterMachineStatus resource. +type ClusterMachineStatusExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (ClusterMachineStatusExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: ClusterMachineStatusType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{ + { + Name: "Ready", + JSONPath: "{.ready}", + }, + { + Name: "Stage", + JSONPath: "{.stage}", + }, + { + Name: "apid", + JSONPath: "{.apidavailable}", + }, + }, + } +} diff --git a/client/pkg/omni/resources/omni/cluster_machine_template.go b/client/pkg/omni/resources/omni/cluster_machine_template.go new file mode 100644 index 00000000..edfd2191 --- /dev/null +++ b/client/pkg/omni/resources/omni/cluster_machine_template.go @@ -0,0 +1,62 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewClusterMachineTemplate creates new cluster machine status resource. +func NewClusterMachineTemplate(ns string, id resource.ID) *ClusterMachineTemplate { + return typed.NewResource[ClusterMachineTemplateSpec, ClusterMachineTemplateExtension]( + resource.NewMetadata(ns, ClusterMachineTemplateType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.ClusterMachineTemplateSpec{}), + ) +} + +const ( + // ClusterMachineTemplateType is the type of the ClusterMachineTemplate resource. + // tsgen:ClusterMachineTemplateType + ClusterMachineTemplateType = resource.Type("ClusterMachineTemplates.omni.sidero.dev") +) + +// ClusterMachineTemplate describes a cluster machine config generation template +// It's similar to generate.Input struct in the Talos repo. +type ClusterMachineTemplate = typed.Resource[ClusterMachineTemplateSpec, ClusterMachineTemplateExtension] + +// ClusterMachineTemplateSpec wraps specs.ClusterMachineTemplateSpec. +type ClusterMachineTemplateSpec = protobuf.ResourceSpec[specs.ClusterMachineTemplateSpec, *specs.ClusterMachineTemplateSpec] + +// ClusterMachineTemplateExtension provides auxiliary methods for ClusterMachineTemplate resource. +type ClusterMachineTemplateExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (ClusterMachineTemplateExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: ClusterMachineTemplateType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{ + { + Name: "InstallImage", + JSONPath: "{.installimage}", + }, + { + Name: "Kubernetes", + JSONPath: "{.kubernetesversion}", + }, + { + Name: "Disk", + JSONPath: "{.installdisk}", + }, + }, + } +} diff --git a/client/pkg/omni/resources/omni/cluster_status.go b/client/pkg/omni/resources/omni/cluster_status.go new file mode 100644 index 00000000..665e663d --- /dev/null +++ b/client/pkg/omni/resources/omni/cluster_status.go @@ -0,0 +1,65 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewClusterStatus creates new cluster machine status resource. +func NewClusterStatus(ns string, id resource.ID) *ClusterStatus { + return typed.NewResource[ClusterStatusSpec, ClusterStatusExtension]( + resource.NewMetadata(ns, ClusterStatusType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.ClusterStatusSpec{}), + ) +} + +const ( + // ClusterStatusType is the type of the ClusterStatus resource. + // tsgen:ClusterStatusType + ClusterStatusType = resource.Type("ClusterStatuses.omni.sidero.dev") +) + +// ClusterStatus contains the summary for the cluster health, availability, number of nodes. +type ClusterStatus = typed.Resource[ClusterStatusSpec, ClusterStatusExtension] + +// ClusterStatusSpec wraps specs.ClusterStatusSpec. +type ClusterStatusSpec = protobuf.ResourceSpec[specs.ClusterStatusSpec, *specs.ClusterStatusSpec] + +// ClusterStatusExtension provides auxiliary methods for ClusterStatus resource. +type ClusterStatusExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (ClusterStatusExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: ClusterStatusType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{ + { + Name: "Available", + JSONPath: "{.available}", + }, + { + Name: "Phase", + JSONPath: "{.phase}", + }, + { + Name: "Machines", + JSONPath: "{.machines.total}", + }, + { + Name: "Healthy", + JSONPath: "{.machines.healthy}", + }, + }, + } +} diff --git a/client/pkg/omni/resources/omni/cluster_uuid.go b/client/pkg/omni/resources/omni/cluster_uuid.go new file mode 100644 index 00000000..7ea11f4c --- /dev/null +++ b/client/pkg/omni/resources/omni/cluster_uuid.go @@ -0,0 +1,53 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewClusterUUID creates new cluster UUID resource. +func NewClusterUUID(id resource.ID) *ClusterUUID { + return typed.NewResource[ClusterUUIDSpec, ClusterUUIDExtension]( + resource.NewMetadata(resources.DefaultNamespace, ClusterUUIDType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.ClusterUUID{}), + ) +} + +const ( + // ClusterUUIDType is the type of the Cluster UUID resource. + // tsgen:ClusterUUIDType + ClusterUUIDType = resource.Type("ClusterUUIDs.omni.sidero.dev") +) + +// ClusterUUID describes cluster UUID attached to cluster. +type ClusterUUID = typed.Resource[ClusterUUIDSpec, ClusterUUIDExtension] + +// ClusterUUIDSpec wraps specs.ClusterUUID. +type ClusterUUIDSpec = protobuf.ResourceSpec[specs.ClusterUUID, *specs.ClusterUUID] + +// ClusterUUIDExtension provides auxiliary methods for ClusterUUID resource. +type ClusterUUIDExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (ClusterUUIDExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: ClusterUUIDType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{ + { + Name: "UUID", + JSONPath: "{.uuid}", + }, + }, + } +} diff --git a/client/pkg/omni/resources/omni/config_patch.go b/client/pkg/omni/resources/omni/config_patch.go new file mode 100644 index 00000000..ff462ef5 --- /dev/null +++ b/client/pkg/omni/resources/omni/config_patch.go @@ -0,0 +1,148 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "fmt" + "strings" + + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + "github.com/hashicorp/go-multierror" + "github.com/siderolabs/gen/pair" + "github.com/siderolabs/talos/pkg/machinery/config/configloader" + talosrole "github.com/siderolabs/talos/pkg/machinery/role" + "gopkg.in/yaml.v3" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +var forbiddenFields = []string{ + "cluster.clusterName", + "cluster.id", + "cluster.controlPlane.endpoint", + "cluster.token", + "cluster.secret", + "cluster.aescbcEncryptionSecret", + "cluster.secretboxEncryptionSecret", + "machine.token", + "machine.ca", + "machine.type", + "machine.install.extensions", +} + +var forbiddenSliceElements = map[string]map[any]struct{}{ + "machine.features.kubernetesTalosAPIAccess.allowedRoles": { + string(talosrole.Admin): {}, + }, +} + +// NewConfigPatch creates new ConfigPatch resource. +func NewConfigPatch(ns string, id resource.ID, labels ...pair.Pair[string, string]) *ConfigPatch { + res := typed.NewResource[ConfigPatchSpec, ConfigPatchExtension]( + resource.NewMetadata(ns, ConfigPatchType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.ConfigPatchSpec{}), + ) + + for _, label := range labels { + res.Metadata().Labels().Set(label.F1, label.F2) + } + + return res +} + +const ( + // ConfigPatchType is the type of the ConfigPatch resource. + // tsgen:ConfigPatchType + ConfigPatchType = resource.Type("ConfigPatches.omni.sidero.dev") +) + +// ConfigPatch describes machine config patch. +type ConfigPatch = typed.Resource[ConfigPatchSpec, ConfigPatchExtension] + +// ConfigPatchSpec wraps specs.ConfigPatchSpec. +type ConfigPatchSpec = protobuf.ResourceSpec[specs.ConfigPatchSpec, *specs.ConfigPatchSpec] + +// ConfigPatchExtension provides auxiliary methods for ConfigPatch resource. +type ConfigPatchExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (ConfigPatchExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: ConfigPatchType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{}, + Sensitivity: meta.Sensitive, + } +} + +// ValidateConfigPatch parses the config patch data using Talos config loader, +// then validates that the config patch doesn't have fields that are controlled by omni. +func ValidateConfigPatch(data string) error { + _, err := configloader.NewFromBytes([]byte(data)) + if err != nil { + return err + } + + var config map[string]any + + err = yaml.Unmarshal([]byte(data), &config) + if err != nil { + return err + } + + var multiErr error + + for _, field := range forbiddenFields { + if _, ok := getField(config, field); ok { + multiErr = multierror.Append(multiErr, fmt.Errorf("overriding %q is not allowed in the config patch", field)) + } + } + + for field, forbiddenElementSet := range forbiddenSliceElements { + val, ok := getField(config, field) + if !ok { + continue + } + + slice, ok := val.([]any) + if !ok { + continue + } + + for _, element := range slice { + if _, ok = forbiddenElementSet[element]; ok { + multiErr = multierror.Append(multiErr, fmt.Errorf("element %q is not allowed in field %q", element, field)) + } + } + } + + return multiErr +} + +func getField(config map[string]any, field string) (any, bool) { + parts := strings.Split(field, ".") + + var obj any + + obj = config + for _, part := range parts { + current, ok := obj.(map[string]any) + if !ok { + return nil, false + } + + obj, ok = current[part] + if !ok { + return nil, false + } + } + + return obj, true +} diff --git a/client/pkg/omni/resources/omni/config_patch_test.go b/client/pkg/omni/resources/omni/config_patch_test.go new file mode 100644 index 00000000..74973dfd --- /dev/null +++ b/client/pkg/omni/resources/omni/config_patch_test.go @@ -0,0 +1,83 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni_test + +import ( + "strings" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/siderolabs/omni/client/pkg/omni/resources/omni" +) + +func TestValidateConfigPatchValidate(t *testing.T) { + for _, tt := range []struct { + name string + config string + expectedError string + }{ + { + name: "valid", + config: strings.TrimSpace(` +machine: + network: + hostname: abcd +`), + }, + { + name: "token", + config: strings.TrimSpace(` +machine: + token: aaa +`), + expectedError: "1 error occurred:\n\t* overriding \"machine.token\" is not allowed in the config patch\n\n", + }, + { + name: "several fields", + config: strings.TrimSpace(` +machine: + token: bab + ca: + crt: YWFhCg== +`), + expectedError: "2 errors occurred:\n\t* overriding \"machine.token\" is not allowed in the config patch\n\t* overriding \"machine.ca\" is not allowed in the config patch\n\n", + }, + { + name: "different configs", + config: strings.TrimSpace(` +machine: + ca: + crt: YWFhCg== +cluster: + name: default +`), + expectedError: "unknown keys found during decoding:\ncluster:\n name: default\n", + }, + { + name: "os admin talos API access", + config: strings.TrimSpace(` +machine: + features: + kubernetesTalosAPIAccess: + allowedRoles: + - os:reader + - os:admin + - os:operator +`), + expectedError: "1 error occurred:\n\t* element \"os:admin\" is not allowed in field \"machine.features.kubernetesTalosAPIAccess.allowedRoles\"\n\n", + }, + } { + t.Run(tt.name, func(t *testing.T) { + err := omni.ValidateConfigPatch(tt.config) + if tt.expectedError != "" { + require.Error(t, err, tt.expectedError) + require.EqualError(t, err, tt.expectedError) + } else { + require.NoError(t, err) + } + }) + } +} diff --git a/client/pkg/omni/resources/omni/control_plane_status.go b/client/pkg/omni/resources/omni/control_plane_status.go new file mode 100644 index 00000000..cba6378f --- /dev/null +++ b/client/pkg/omni/resources/omni/control_plane_status.go @@ -0,0 +1,48 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewControlPlaneStatus creates new ControlPlaneStatus resource. +func NewControlPlaneStatus(ns string, id resource.ID) *ControlPlaneStatus { + return typed.NewResource[ControlPlaneStatusSpec, ControlPlaneStatusExtension]( + resource.NewMetadata(ns, ControlPlaneStatusType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.ControlPlaneStatusSpec{}), + ) +} + +const ( + // ControlPlaneStatusType is the type of the ControlPlaneStatus resource. + // tsgen:ControlPlaneStatusType + ControlPlaneStatusType = resource.Type("ControlPlaneStatuses.omni.sidero.dev") +) + +// ControlPlaneStatus describes control plane machine set additional status. +type ControlPlaneStatus = typed.Resource[ControlPlaneStatusSpec, ControlPlaneStatusExtension] + +// ControlPlaneStatusSpec wraps specs.ControlPlaneStatusSpec. +type ControlPlaneStatusSpec = protobuf.ResourceSpec[specs.ControlPlaneStatusSpec, *specs.ControlPlaneStatusSpec] + +// ControlPlaneStatusExtension provides auxiliary methods for ControlPlaneStatus resource. +type ControlPlaneStatusExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (ControlPlaneStatusExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: ControlPlaneStatusType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{}, + } +} diff --git a/client/pkg/omni/resources/omni/etcd_audit_result.go b/client/pkg/omni/resources/omni/etcd_audit_result.go new file mode 100644 index 00000000..fd3fae33 --- /dev/null +++ b/client/pkg/omni/resources/omni/etcd_audit_result.go @@ -0,0 +1,45 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewEtcdAuditResult creates new etcd audit result. +func NewEtcdAuditResult(ns string, id resource.ID) *EtcdAuditResult { + return typed.NewResource[EtcdAuditResultSpec, EtcdAuditResultExtension]( + resource.NewMetadata(ns, EtcdAuditResultType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.EtcdAuditResultSpec{}), + ) +} + +// EtcdAuditResultType is the type of the EtcdAuditResult resource. +const EtcdAuditResultType = resource.Type("EtcdAuditResults.omni.sidero.dev") + +// EtcdAuditResult describes etcd backup encryption data. +type EtcdAuditResult = typed.Resource[EtcdAuditResultSpec, EtcdAuditResultExtension] + +// EtcdAuditResultSpec wraps specs.EtcdAuditResultSpec. +type EtcdAuditResultSpec = protobuf.ResourceSpec[specs.EtcdAuditResultSpec, *specs.EtcdAuditResultSpec] + +// EtcdAuditResultExtension provides auxiliary methods for EtcdAuditResult resource. +type EtcdAuditResultExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (EtcdAuditResultExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: EtcdAuditResultType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{}, + } +} diff --git a/client/pkg/omni/resources/omni/etcd_backup.go b/client/pkg/omni/resources/omni/etcd_backup.go new file mode 100644 index 00000000..ae108949 --- /dev/null +++ b/client/pkg/omni/resources/omni/etcd_backup.go @@ -0,0 +1,60 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "fmt" + "time" + + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewEtcdBackup creates new etcd backup info. +func NewEtcdBackup(clusterName string, t time.Time) *EtcdBackup { + return typed.NewResource[EtcdBackupSpec, EtcdBackupExtension]( + resource.NewMetadata(resources.ExternalNamespace, EtcdBackupType, fmt.Sprintf("%s-%d", clusterName, t.Unix()), resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.EtcdBackupSpec{}), + ) +} + +const ( + // EtcdBackupType is the type of the EtcdBackup resource. + // tsgen:EtcdBackupType + EtcdBackupType = resource.Type("EtcdBackups.omni.sidero.dev") +) + +// EtcdBackup describes etcd backup data. +type EtcdBackup = typed.Resource[EtcdBackupSpec, EtcdBackupExtension] + +// EtcdBackupSpec wraps specs.EtcdBackupSpec. +type EtcdBackupSpec = protobuf.ResourceSpec[specs.EtcdBackupSpec, *specs.EtcdBackupSpec] + +// EtcdBackupExtension provides auxiliary methods for EtcdBackup resource. +type EtcdBackupExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (EtcdBackupExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: EtcdBackupType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.ExternalNamespace, + PrintColumns: []meta.PrintColumn{ + { + Name: "Created At", + JSONPath: "{.createdat}", + }, + { + Name: "Snapshot", + JSONPath: "{.snapshot}", + }, + }, + } +} diff --git a/client/pkg/omni/resources/omni/etcd_backup_conf_status.go b/client/pkg/omni/resources/omni/etcd_backup_conf_status.go new file mode 100644 index 00000000..87ce365f --- /dev/null +++ b/client/pkg/omni/resources/omni/etcd_backup_conf_status.go @@ -0,0 +1,61 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewEtcdBackupStoreStatus creates new etcd backup configuration status info. +func NewEtcdBackupStoreStatus() *EtcdBackupStoreStatus { + return typed.NewResource[EtcdBackupStoreStatusSpec, EtcdBackupStoreStatusExtension]( + resource.NewMetadata(resources.EphemeralNamespace, EtcdBackupStoreStatusType, EtcdBackupStoreStatusID, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.EtcdBackupStoreStatusSpec{}), + ) +} + +const ( + // EtcdBackupStoreStatusID is the ID of the EtcdBackupStoreStatus resource. + // tsgen:EtcdBackupStoreStatusID + EtcdBackupStoreStatusID = resource.ID("etcdbackup-store-status") + + // EtcdBackupStoreStatusType is the type of the [EtcdBackupStoreStatus] resource. + // tsgen:EtcdBackupStoreStatusType + EtcdBackupStoreStatusType = resource.Type("EtcdBackupStoreStatuses.omni.sidero.dev") +) + +// EtcdBackupStoreStatus describes etcd backup status. +type EtcdBackupStoreStatus = typed.Resource[EtcdBackupStoreStatusSpec, EtcdBackupStoreStatusExtension] + +// EtcdBackupStoreStatusSpec wraps specs.EtcdBackupStoreStatusSpec. +type EtcdBackupStoreStatusSpec = protobuf.ResourceSpec[specs.EtcdBackupStoreStatusSpec, *specs.EtcdBackupStoreStatusSpec] + +// EtcdBackupStoreStatusExtension provides auxiliary methods for EtcdBackupStoreStatus resource. +type EtcdBackupStoreStatusExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (EtcdBackupStoreStatusExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: EtcdBackupStoreStatusType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.EphemeralNamespace, + PrintColumns: []meta.PrintColumn{ + { + Name: "Configuration Name", + JSONPath: "{.configurationname}", + }, + { + Name: "Configuration Error", + JSONPath: "{.configurationerror}", + }, + }, + } +} diff --git a/client/pkg/omni/resources/omni/etcd_backup_encryption.go b/client/pkg/omni/resources/omni/etcd_backup_encryption.go new file mode 100644 index 00000000..611b9f72 --- /dev/null +++ b/client/pkg/omni/resources/omni/etcd_backup_encryption.go @@ -0,0 +1,48 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewEtcdBackupEncryption creates new etcd backup encryption info. +func NewEtcdBackupEncryption(ns string, id resource.ID) *EtcdBackupEncryption { + return typed.NewResource[EtcdBackupEncryptionSpec, EtcdBackupEncryptionExtension]( + resource.NewMetadata(ns, EtcdBackupEncryptionType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.EtcdBackupEncryptionSpec{}), + ) +} + +const ( + // EtcdBackupEncryptionType is the type of the EtcdBackupEncryption resource. + // tsgen:EtcdBackupEncryptionType + EtcdBackupEncryptionType = resource.Type("EtcdBackupEncryptions.omni.sidero.dev") +) + +// EtcdBackupEncryption describes etcd backup encryption data. +type EtcdBackupEncryption = typed.Resource[EtcdBackupEncryptionSpec, EtcdBackupEncryptionExtension] + +// EtcdBackupEncryptionSpec wraps specs.EtcdBackupEncryptionSpec. +type EtcdBackupEncryptionSpec = protobuf.ResourceSpec[specs.EtcdBackupEncryptionSpec, *specs.EtcdBackupEncryptionSpec] + +// EtcdBackupEncryptionExtension provides auxiliary methods for EtcdBackupEncryption resource. +type EtcdBackupEncryptionExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (EtcdBackupEncryptionExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: EtcdBackupEncryptionType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{}, + } +} diff --git a/client/pkg/omni/resources/omni/etcd_backup_overall_status.go b/client/pkg/omni/resources/omni/etcd_backup_overall_status.go new file mode 100644 index 00000000..395e095c --- /dev/null +++ b/client/pkg/omni/resources/omni/etcd_backup_overall_status.go @@ -0,0 +1,77 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewEtcdBackupOverallStatus creates new etcd backup status info. +func NewEtcdBackupOverallStatus() *EtcdBackupOverallStatus { + return typed.NewResource[EtcdBackupOverallStatusSpec, EtcdBackupOverallStatusExtension]( + resource.NewMetadata(resources.DefaultNamespace, EtcdBackupOverallStatusType, EtcdBackupOverallStatusID, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.EtcdBackupOverallStatusSpec{}), + ) +} + +const ( + // EtcdBackupOverallStatusID is the ID of the EtcdBackupOverallStatus resource. + // tsgen:EtcdBackupOverallStatusID + EtcdBackupOverallStatusID = resource.ID("etcdbackup-overall-status") + + // EtcdBackupOverallStatusType is the type of the [EtcdBackupOverallStatus] resource. + // tsgen:EtcdBackupOverallStatusType + EtcdBackupOverallStatusType = resource.Type("EtcdBackupOverallStatuses.omni.sidero.dev") +) + +// EtcdBackupOverallStatus describes etcd backup status. +type EtcdBackupOverallStatus = typed.Resource[EtcdBackupOverallStatusSpec, EtcdBackupOverallStatusExtension] + +// EtcdBackupOverallStatusSpec wraps specs.EtcdBackupOverallStatusSpec. +type EtcdBackupOverallStatusSpec = protobuf.ResourceSpec[specs.EtcdBackupOverallStatusSpec, *specs.EtcdBackupOverallStatusSpec] + +// EtcdBackupOverallStatusExtension provides auxiliary methods for EtcdBackupOverallStatus resource. +type EtcdBackupOverallStatusExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (EtcdBackupOverallStatusExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: EtcdBackupOverallStatusType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{ + { + Name: "Configuration Name", + JSONPath: "{.configurationname}", + }, + { + Name: "Configuration Error", + JSONPath: "{.configurationerror}", + }, + { + Name: "Last Backup Status", + JSONPath: "{.lastbackupstatus.status}", + }, + { + Name: "Last Backup Error", + JSONPath: "{.lastbackupstatus.error}", + }, + { + Name: "Last Backup Time", + JSONPath: "{.lastbackupstatus.lastbackuptime}", + }, + { + Name: "Configuration Attempt", + JSONPath: "{.lastbackupstatus.lastbackupattempt}", + }, + }, + } +} diff --git a/client/pkg/omni/resources/omni/etcd_backup_status.go b/client/pkg/omni/resources/omni/etcd_backup_status.go new file mode 100644 index 00000000..8e29b7be --- /dev/null +++ b/client/pkg/omni/resources/omni/etcd_backup_status.go @@ -0,0 +1,65 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewEtcdBackupStatus creates new etcd backup status info. +func NewEtcdBackupStatus(id resource.ID) *EtcdBackupStatus { + return typed.NewResource[EtcdBackupStatusSpec, EtcdBackupStatusExtension]( + resource.NewMetadata(resources.DefaultNamespace, EtcdBackupStatusType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.EtcdBackupStatusSpec{}), + ) +} + +const ( + // EtcdBackupStatusType is the type of the EtcdBackupStatus resource. + // tsgen:EtcdBackupStatusType + EtcdBackupStatusType = resource.Type("EtcdBackupStatuses.omni.sidero.dev") +) + +// EtcdBackupStatus describes etcd backup status. +type EtcdBackupStatus = typed.Resource[EtcdBackupStatusSpec, EtcdBackupStatusExtension] + +// EtcdBackupStatusSpec wraps specs.EtcdBackupStatusSpec. +type EtcdBackupStatusSpec = protobuf.ResourceSpec[specs.EtcdBackupStatusSpec, *specs.EtcdBackupStatusSpec] + +// EtcdBackupStatusExtension provides auxiliary methods for EtcdBackupStatus resource. +type EtcdBackupStatusExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (EtcdBackupStatusExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: EtcdBackupStatusType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{ + { + Name: "Status", + JSONPath: "{.status}", + }, + { + Name: "Error", + JSONPath: "{.error}", + }, + { + Name: "Last Backup", + JSONPath: "{.lastbackuptime}", + }, + { + Name: "Last Backup Attempt", + JSONPath: "{.lastbackupattempt}", + }, + }, + } +} diff --git a/client/pkg/omni/resources/omni/etcd_manual_backup.go b/client/pkg/omni/resources/omni/etcd_manual_backup.go new file mode 100644 index 00000000..301b6b87 --- /dev/null +++ b/client/pkg/omni/resources/omni/etcd_manual_backup.go @@ -0,0 +1,53 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewEtcdManualBackup creates new etcd manual backup resource. +func NewEtcdManualBackup(id resource.ID) *EtcdManualBackup { + return typed.NewResource[EtcdManualBackupSpec, EtcdManualBackupExtension]( + resource.NewMetadata(resources.EphemeralNamespace, EtcdManualBackupType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.EtcdManualBackupSpec{}), + ) +} + +const ( + // EtcdManualBackupType is the type of the EtcdManualBackup resource. + // tsgen:EtcdManualBackupType + EtcdManualBackupType = resource.Type("EtcdManualBackups.omni.sidero.dev") +) + +// EtcdManualBackup describes requested etcd manual backup. +type EtcdManualBackup = typed.Resource[EtcdManualBackupSpec, EtcdManualBackupExtension] + +// EtcdManualBackupSpec wraps specs.EtcdManualBackupSpec. +type EtcdManualBackupSpec = protobuf.ResourceSpec[specs.EtcdManualBackupSpec, *specs.EtcdManualBackupSpec] + +// EtcdManualBackupExtension provides auxiliary methods for EtcdManualBackup resource. +type EtcdManualBackupExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (EtcdManualBackupExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: EtcdManualBackupType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.EphemeralNamespace, + PrintColumns: []meta.PrintColumn{ + { + Name: "Backup At", + JSONPath: "{.backupat}", + }, + }, + } +} diff --git a/client/pkg/omni/resources/omni/exposed_service.go b/client/pkg/omni/resources/omni/exposed_service.go new file mode 100644 index 00000000..a2e69b3c --- /dev/null +++ b/client/pkg/omni/resources/omni/exposed_service.go @@ -0,0 +1,57 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewExposedService creates new ExposedService resource. +func NewExposedService(ns string, id resource.ID) *ExposedService { + return typed.NewResource[ExposedServiceSpec, ExposedServiceExtension]( + resource.NewMetadata(ns, ExposedServiceType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.ExposedServiceSpec{}), + ) +} + +const ( + // ExposedServiceType is the type of the ExposedService resource. + // tsgen:ExposedServiceType + ExposedServiceType = resource.Type("ExposedServices.omni.sidero.dev") +) + +// ExposedService holds the information about an exposed service for workload cluster proxying feature. +type ExposedService = typed.Resource[ExposedServiceSpec, ExposedServiceExtension] + +// ExposedServiceSpec wraps specs.ExposedServiceSpec. +type ExposedServiceSpec = protobuf.ResourceSpec[specs.ExposedServiceSpec, *specs.ExposedServiceSpec] + +// ExposedServiceExtension provides auxiliary methods for ExposedService resource. +type ExposedServiceExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (ExposedServiceExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: ExposedServiceType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{ + { + Name: "Port", + JSONPath: "{.port}", + }, + { + Name: "Label", + JSONPath: "{.label}", + }, + }, + } +} diff --git a/client/pkg/omni/resources/omni/features_config.go b/client/pkg/omni/resources/omni/features_config.go new file mode 100644 index 00000000..97f92625 --- /dev/null +++ b/client/pkg/omni/resources/omni/features_config.go @@ -0,0 +1,60 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +const ( + // FeaturesConfigID is the resource ID under which the features configuration will be written to COSI state. + // tsgen:FeaturesConfigID + FeaturesConfigID = "features-config" +) + +// NewFeaturesConfig creates new FeaturesConfig state. +func NewFeaturesConfig(ns string, id resource.ID) *FeaturesConfig { + return typed.NewResource[FeaturesConfigSpec, FeaturesConfigExtension]( + resource.NewMetadata(ns, FeaturesConfigType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.FeaturesConfigSpec{}), + ) +} + +const ( + // FeaturesConfigType is the type of FeaturesConfig resource. + // + // tsgen:FeaturesConfigType + FeaturesConfigType = resource.Type("FeaturesConfigs.omni.sidero.dev") +) + +// FeaturesConfig resource describes the features that are enabled in Omni and their configuration. +type FeaturesConfig = typed.Resource[FeaturesConfigSpec, FeaturesConfigExtension] + +// FeaturesConfigSpec wraps specs.FeaturesConfigSpec. +type FeaturesConfigSpec = protobuf.ResourceSpec[specs.FeaturesConfigSpec, *specs.FeaturesConfigSpec] + +// FeaturesConfigExtension providers auxiliary methods for FeaturesConfig resource. +type FeaturesConfigExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (FeaturesConfigExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: FeaturesConfigType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{ + { + Name: "Workload Proxying", + JSONPath: "{.enableworkloadproxying}", + }, + }, + } +} diff --git a/client/pkg/omni/resources/omni/image_pull_request.go b/client/pkg/omni/resources/omni/image_pull_request.go new file mode 100644 index 00000000..289d07ed --- /dev/null +++ b/client/pkg/omni/resources/omni/image_pull_request.go @@ -0,0 +1,47 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewImagePullRequest creates a new ImagePullRequest state. +func NewImagePullRequest(ns, id string) *ImagePullRequest { + return typed.NewResource[ImagePullRequestSpec, ImagePullRequestExtension]( + resource.NewMetadata(ns, ImagePullRequestType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.ImagePullRequestSpec{}), + ) +} + +// ImagePullRequestType is the type of the ImagePullRequest resource. +// +// tsgen:ImagePullRequestType +const ImagePullRequestType = resource.Type("ImagePullRequests.omni.sidero.dev") + +// ImagePullRequest resource contains a request to pull a set of container images to a set of nodes. +type ImagePullRequest = typed.Resource[ImagePullRequestSpec, ImagePullRequestExtension] + +// ImagePullRequestSpec wraps specs.ImagePullRequestSpec. +type ImagePullRequestSpec = protobuf.ResourceSpec[specs.ImagePullRequestSpec, *specs.ImagePullRequestSpec] + +// ImagePullRequestExtension providers auxiliary methods for ImagePullRequest resource. +type ImagePullRequestExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (ImagePullRequestExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: ImagePullRequestType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{}, + } +} diff --git a/client/pkg/omni/resources/omni/image_pull_status.go b/client/pkg/omni/resources/omni/image_pull_status.go new file mode 100644 index 00000000..6f3bde18 --- /dev/null +++ b/client/pkg/omni/resources/omni/image_pull_status.go @@ -0,0 +1,72 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewImagePullStatus creates a new ImagePullStatus state. +func NewImagePullStatus(ns, id string) *ImagePullStatus { + return typed.NewResource[ImagePullStatusSpec, ImagePullStatusExtension]( + resource.NewMetadata(ns, ImagePullStatusType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.ImagePullStatusSpec{}), + ) +} + +// ImagePullStatusType is the type of the ImagePullStatus resource. +// +// tsgen:ImagePullStatusType +const ImagePullStatusType = resource.Type("ImagePullStatuses.omni.sidero.dev") + +// ImagePullStatus resource contains a request to pull a set of container images to a set of nodes. +type ImagePullStatus = typed.Resource[ImagePullStatusSpec, ImagePullStatusExtension] + +// ImagePullStatusSpec wraps specs.ImagePullStatusSpec. +type ImagePullStatusSpec = protobuf.ResourceSpec[specs.ImagePullStatusSpec, *specs.ImagePullStatusSpec] + +// ImagePullStatusExtension providers auxiliary methods for ImagePullStatus resource. +type ImagePullStatusExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (ImagePullStatusExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: ImagePullStatusType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{ + { + Name: "Processed", + JSONPath: "{.processedcount}", + }, + { + Name: "Total", + JSONPath: "{.totalcount}", + }, + { + Name: "Last Node", + JSONPath: "{.lastprocessednode}", + }, + { + Name: "Last Image", + JSONPath: "{.lastprocessedimage}", + }, + { + Name: "Last Error", + JSONPath: "{.lastprocessederror}", + }, + { + Name: "Request Version", + JSONPath: "{.requestversion}", + }, + }, + } +} diff --git a/client/pkg/omni/resources/omni/installation_media.go b/client/pkg/omni/resources/omni/installation_media.go new file mode 100644 index 00000000..5d1c8663 --- /dev/null +++ b/client/pkg/omni/resources/omni/installation_media.go @@ -0,0 +1,51 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewInstallationMedia creates new InstallationMedia state. +func NewInstallationMedia(ns, filename string) *InstallationMedia { + return typed.NewResource[InstallationMediaSpec, InstallationMediaExtension]( + resource.NewMetadata(ns, InstallationMediaType, filename, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.InstallationMediaSpec{}), + ) +} + +const ( + // InstallationMediaType is the type of InstallationMedia resource. + // + // tsgen:InstallationMediaType + InstallationMediaType = resource.Type("InstallationMedias.omni.sidero.dev") +) + +// InstallationMedia resource describes a Talos installation media that can be generated by the image factory. It also describes the necessary parameters to be passed to the image factory. +// +// InstallationMedia resource ID is a human-readable string without white-space that uniquely identifies the installation media. +type InstallationMedia = typed.Resource[InstallationMediaSpec, InstallationMediaExtension] + +// InstallationMediaSpec wraps specs.InstallationMediaSpec. +type InstallationMediaSpec = protobuf.ResourceSpec[specs.InstallationMediaSpec, *specs.InstallationMediaSpec] + +// InstallationMediaExtension providers auxiliary methods for InstallationMedia resource. +type InstallationMediaExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (InstallationMediaExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: InstallationMediaType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.EphemeralNamespace, + PrintColumns: []meta.PrintColumn{}, + } +} diff --git a/client/pkg/omni/resources/omni/kubeconfig.go b/client/pkg/omni/resources/omni/kubeconfig.go new file mode 100644 index 00000000..fbc3b8d8 --- /dev/null +++ b/client/pkg/omni/resources/omni/kubeconfig.go @@ -0,0 +1,47 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewKubeconfig creates new Kubeconfig resource. +func NewKubeconfig(ns resource.Namespace, id resource.ID) *Kubeconfig { + return typed.NewResource[KubeconfigSpec, KubeconfigExtension]( + resource.NewMetadata(ns, KubeconfigType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.KubeconfigSpec{}), + ) +} + +const ( + // KubeconfigType is the type of the Kubeconfig resource. + KubeconfigType = resource.Type("Kubeconfigs.omni.sidero.dev") +) + +// Kubeconfig describes client config for Kubernetes API. +type Kubeconfig = typed.Resource[KubeconfigSpec, KubeconfigExtension] + +// KubeconfigSpec wraps specs.KubeconfigSpec. +type KubeconfigSpec = protobuf.ResourceSpec[specs.KubeconfigSpec, *specs.KubeconfigSpec] + +// KubeconfigExtension provides auxiliary methods for Kubeconfig resource. +type KubeconfigExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (KubeconfigExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: KubeconfigType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{}, + } +} diff --git a/client/pkg/omni/resources/omni/kubernetes_status.go b/client/pkg/omni/resources/omni/kubernetes_status.go new file mode 100644 index 00000000..5654b716 --- /dev/null +++ b/client/pkg/omni/resources/omni/kubernetes_status.go @@ -0,0 +1,47 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewKubernetesStatus creates new Kubernetes component version/readiness state. +func NewKubernetesStatus(ns, id string) *KubernetesStatus { + return typed.NewResource[KubernetesStatusSpec, KubernetesStatusExtension]( + resource.NewMetadata(ns, KubernetesStatusType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.KubernetesStatusSpec{}), + ) +} + +// KubernetesStatusType is a resource type that contains the state of Kubernetes components in the cluster. +// +// tsgen:KubernetesStatusType +const KubernetesStatusType = resource.Type("KubernetesStatuses.omni.sidero.dev") + +// KubernetesStatus is a resource type that contains the state of Kubernetes components in the cluster. +type KubernetesStatus = typed.Resource[KubernetesStatusSpec, KubernetesStatusExtension] + +// KubernetesStatusSpec wraps specs.KubernetesStatusSpec. +type KubernetesStatusSpec = protobuf.ResourceSpec[specs.KubernetesStatusSpec, *specs.KubernetesStatusSpec] + +// KubernetesStatusExtension providers auxiliary methods for KubernetesStatus resource. +type KubernetesStatusExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (KubernetesStatusExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: KubernetesStatusType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{}, + } +} diff --git a/client/pkg/omni/resources/omni/kubernetes_upgrade_manifest_status.go b/client/pkg/omni/resources/omni/kubernetes_upgrade_manifest_status.go new file mode 100644 index 00000000..5ee02b1e --- /dev/null +++ b/client/pkg/omni/resources/omni/kubernetes_upgrade_manifest_status.go @@ -0,0 +1,47 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewKubernetesUpgradeManifestStatus creates new LoadBalancer state. +func NewKubernetesUpgradeManifestStatus(ns, id string) *KubernetesUpgradeManifestStatus { + return typed.NewResource[KubernetesUpgradeManifestStatusSpec, KubernetesUpgradeManifestStatusExtension]( + resource.NewMetadata(ns, KubernetesUpgradeManifestStatusType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.KubernetesUpgradeManifestStatusSpec{}), + ) +} + +// KubernetesUpgradeManifestStatusType is a resource type that contains the configuration of a load balancer. +// +// tsgen:KubernetesUpgradeManifestStatusType +const KubernetesUpgradeManifestStatusType = resource.Type("KubernetesUpgradeManifestStatuses.omni.sidero.dev") + +// KubernetesUpgradeManifestStatus is a resource type that contains the configuration of a load balancer. +type KubernetesUpgradeManifestStatus = typed.Resource[KubernetesUpgradeManifestStatusSpec, KubernetesUpgradeManifestStatusExtension] + +// KubernetesUpgradeManifestStatusSpec wraps specs.KubernetesUpgradeManifestStatusSpec. +type KubernetesUpgradeManifestStatusSpec = protobuf.ResourceSpec[specs.KubernetesUpgradeManifestStatusSpec, *specs.KubernetesUpgradeManifestStatusSpec] + +// KubernetesUpgradeManifestStatusExtension providers auxiliary methods for KubernetesUpgradeManifestStatus resource. +type KubernetesUpgradeManifestStatusExtension struct{} + +// ResourceDefinition implements typed.ResourceDefinition interface. +func (KubernetesUpgradeManifestStatusExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: KubernetesUpgradeManifestStatusType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{}, + } +} diff --git a/client/pkg/omni/resources/omni/kubernetes_upgrade_status.go b/client/pkg/omni/resources/omni/kubernetes_upgrade_status.go new file mode 100644 index 00000000..53a303fa --- /dev/null +++ b/client/pkg/omni/resources/omni/kubernetes_upgrade_status.go @@ -0,0 +1,47 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewKubernetesUpgradeStatus creates new LoadBalancer state. +func NewKubernetesUpgradeStatus(ns, id string) *KubernetesUpgradeStatus { + return typed.NewResource[KubernetesUpgradeStatusSpec, KubernetesUpgradeStatusExtension]( + resource.NewMetadata(ns, KubernetesUpgradeStatusType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.KubernetesUpgradeStatusSpec{}), + ) +} + +// KubernetesUpgradeStatusType is a resource type that contains the configuration of a load balancer. +// +// tsgen:KubernetesUpgradeStatusType +const KubernetesUpgradeStatusType = resource.Type("KubernetesUpgradeStatuses.omni.sidero.dev") + +// KubernetesUpgradeStatus is a resource type that contains the configuration of a load balancer. +type KubernetesUpgradeStatus = typed.Resource[KubernetesUpgradeStatusSpec, KubernetesUpgradeStatusExtension] + +// KubernetesUpgradeStatusSpec wraps specs.KubernetesUpgradeStatusSpec. +type KubernetesUpgradeStatusSpec = protobuf.ResourceSpec[specs.KubernetesUpgradeStatusSpec, *specs.KubernetesUpgradeStatusSpec] + +// KubernetesUpgradeStatusExtension providers auxiliary methods for KubernetesUpgradeStatus resource. +type KubernetesUpgradeStatusExtension struct{} + +// ResourceDefinition implements typed.ResourceDefinition interface. +func (KubernetesUpgradeStatusExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: KubernetesUpgradeStatusType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{}, + } +} diff --git a/client/pkg/omni/resources/omni/kubernetes_version.go b/client/pkg/omni/resources/omni/kubernetes_version.go new file mode 100644 index 00000000..8ddc459f --- /dev/null +++ b/client/pkg/omni/resources/omni/kubernetes_version.go @@ -0,0 +1,49 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// KubernetesVersionType is the type of KubernetesVersions resource. +// +// tsgen:KubernetesVersionType +const KubernetesVersionType = resource.Type("KubernetesVersions.omni.sidero.dev") + +// KubernetesVersion represents discovered Kubernetes versions to be installed. +type KubernetesVersion = typed.Resource[KubernetesVersionSpec, KubernetesVersionExtension] + +// NewKubernetesVersion creates new KubernetesVersion resource. +func NewKubernetesVersion(ns resource.Namespace, id resource.ID) *KubernetesVersion { + return typed.NewResource[KubernetesVersionSpec, KubernetesVersionExtension]( + resource.NewMetadata(ns, KubernetesVersionType, id, resource.VersionUndefined), + protobuf.NewResourceSpec( + &specs.KubernetesVersionSpec{}, + ), + ) +} + +// KubernetesVersionExtension provides auxiliary methods for KubernetesVersion. +type KubernetesVersionExtension struct{} + +// KubernetesVersionSpec wraps specs.KubernetesVersionSpec. +type KubernetesVersionSpec = protobuf.ResourceSpec[specs.KubernetesVersionSpec, *specs.KubernetesVersionSpec] + +// ResourceDefinition implements [typed.Extension] interface. +func (KubernetesVersionExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: KubernetesVersionType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{}, + } +} diff --git a/client/pkg/omni/resources/omni/labels.go b/client/pkg/omni/resources/omni/labels.go new file mode 100644 index 00000000..3f13622f --- /dev/null +++ b/client/pkg/omni/resources/omni/labels.go @@ -0,0 +1,149 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +// Package omni provides resources describing the Machines, Clusters, etc. +package omni + +const ( + // SystemLabelPrefix is the prefix of all labels which are managed by the COSI controllers. + // tsgen:SystemLabelPrefix. + SystemLabelPrefix = "omni.sidero.dev/" +) + +const ( + // Global Labels. + + // LabelControlPlaneRole indicates that the machine is a control plane. + // tsgen:LabelControlPlaneRole + LabelControlPlaneRole = SystemLabelPrefix + "role-controlplane" + + // LabelWorkerRole indicates that the machine is a worker. + // tsgen:LabelWorkerRole + LabelWorkerRole = SystemLabelPrefix + "role-worker" + + // LabelCluster defines the cluster relation label. + // tsgen:LabelCluster + LabelCluster = SystemLabelPrefix + LabelSuffixCluster + + // LabelClusterUUID defines the cluster UUID relation label. + // tsgen:LabelClusterUUID + LabelClusterUUID = SystemLabelPrefix + "cluster-uuid" + + // LabelHostname defines machine hostname. + // tsgen:LabelHostname + LabelHostname = SystemLabelPrefix + LabelSuffixHostname + + // LabelMachineSet defines the machine set relation label. + // tsgen:LabelMachineSet + LabelMachineSet = SystemLabelPrefix + "machine-set" + + // LabelClusterMachine defines the cluster machine relation label. + // tsgen:LabelClusterMachine + LabelClusterMachine = SystemLabelPrefix + "cluster-machine" + + // LabelMachine defines the machine relation label. + // tsgen:LabelMachine + LabelMachine = SystemLabelPrefix + "machine" + + // LabelSkipTeardown is the test label that configures machine set controller to skip teardown sequence for the cluster machine. + LabelSkipTeardown = SystemLabelPrefix + "machine-set-skip-teardown" + + // LabelSystemPatch marks the patch as the system patch, so it shouldn't be editable by the user. + // tsgen:LabelSystemPatch + LabelSystemPatch = SystemLabelPrefix + "system-patch" + + // LabelExposedServiceAlias is the alias of the exposed service. + // tsgen:LabelExposedServiceAlias + LabelExposedServiceAlias = SystemLabelPrefix + "exposed-service-alias" +) + +const ( + // LabelSuffixPlatform is the suffix of the platform label. + LabelSuffixPlatform = "platform" + // LabelSuffixArch is the suffix of the arch label. + LabelSuffixArch = "arch" + // LabelSuffixHostname is the suffix of the hostname label. + LabelSuffixHostname = "hostname" + // LabelSuffixCluster is the suffix of the cluster label. + LabelSuffixCluster = "cluster" +) + +const ( + // MachineStatus labels. + + // MachineStatusLabelConnected is set if the machine is connected. + // tsgen:MachineStatusLabelConnected + MachineStatusLabelConnected = SystemLabelPrefix + "connected" + + // MachineStatusLabelDisconnected is set if the machine is disconnected. + // tsgen:MachineStatusLabelDisconnected + MachineStatusLabelDisconnected = SystemLabelPrefix + "disconnected" + + // MachineStatusLabelInvalidState is set if Omni can access Talos apid, but has no access. + // tsgen:MachineStatusLabelInvalidState + MachineStatusLabelInvalidState = SystemLabelPrefix + "invalid-state" + + // MachineStatusLabelReportingEvents is set if the machine is reporting events. + // tsgen:MachineStatusLabelReportingEvents + MachineStatusLabelReportingEvents = SystemLabelPrefix + "reporting-events" + + // MachineStatusLabelAvailable is set if the machine is available to be added to a cluster. + // tsgen:MachineStatusLabelAvailable + MachineStatusLabelAvailable = SystemLabelPrefix + "available" + + // MachineStatusLabelArch describes the machine architecture. + // tsgen:MachineStatusLabelArch + MachineStatusLabelArch = SystemLabelPrefix + LabelSuffixArch + + // MachineStatusLabelCPU describes the machine CPU. + // tsgen:MachineStatusLabelCPU + MachineStatusLabelCPU = SystemLabelPrefix + "cpu" + + // MachineStatusLabelCores describes the number of machine cores. + // tsgen:MachineStatusLabelCores + MachineStatusLabelCores = SystemLabelPrefix + "cores" + + // MachineStatusLabelMem describes the total memory available on the machine. + // tsgen:MachineStatusLabelMem + MachineStatusLabelMem = SystemLabelPrefix + "mem" + + // MachineStatusLabelStorage describes the total storage capacity of the machine. + // tsgen:MachineStatusLabelStorage + MachineStatusLabelStorage = SystemLabelPrefix + "storage" + + // MachineStatusLabelNet describes the machine network adapters speed. + // tsgen:MachineStatusLabelNet + MachineStatusLabelNet = SystemLabelPrefix + "net" + + // MachineStatusLabelPlatform describes the machine platform. + // tsgen:MachineStatusLabelPlatform + MachineStatusLabelPlatform = SystemLabelPrefix + LabelSuffixPlatform + + // MachineStatusLabelRegion describes the machine region (for machines running in the clouds). + // tsgen:MachineStatusLabelRegion + MachineStatusLabelRegion = SystemLabelPrefix + "region" + + // MachineStatusLabelZone describes the machine zone (for machines running in the clouds). + // tsgen:MachineStatusLabelZone + MachineStatusLabelZone = SystemLabelPrefix + "zone" + + // MachineStatusLabelInstance describes the machine instance type (for machines running in the clouds). + // tsgen:MachineStatusLabelInstance + MachineStatusLabelInstance = SystemLabelPrefix + "instance" +) + +const ( + // ClusterMachineStatus labels. + + // ClusterMachineStatusLabelNodeName is set to the node name. + // tsgen:ClusterMachineStatusLabelNodeName + ClusterMachineStatusLabelNodeName = SystemLabelPrefix + "node-name" +) + +const ( + // Machine labels. + + // MachineAddressLabel is used for faster lookup of the machine by address. + MachineAddressLabel = SystemLabelPrefix + "address" +) diff --git a/client/pkg/omni/resources/omni/loadbalancer_config.go b/client/pkg/omni/resources/omni/loadbalancer_config.go new file mode 100644 index 00000000..0f862313 --- /dev/null +++ b/client/pkg/omni/resources/omni/loadbalancer_config.go @@ -0,0 +1,45 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewLoadBalancerConfig creates new LoadBalancer state. +func NewLoadBalancerConfig(ns, id string) *LoadBalancerConfig { + return typed.NewResource[LoadBalancerConfigSpec, LoadBalancerConfigExtension]( + resource.NewMetadata(ns, LoadBalancerConfigType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.LoadBalancerConfigSpec{}), + ) +} + +// LoadBalancerConfigType is a resource type that contains the configuration of a load balancer. +const LoadBalancerConfigType = resource.Type("LoadBalancerConfigs.omni.sidero.dev") + +// LoadBalancerConfig is a resource type that contains the configuration of a load balancer. +type LoadBalancerConfig = typed.Resource[LoadBalancerConfigSpec, LoadBalancerConfigExtension] + +// LoadBalancerConfigSpec wraps specs.LoadBalancerConfigSpec. +type LoadBalancerConfigSpec = protobuf.ResourceSpec[specs.LoadBalancerConfigSpec, *specs.LoadBalancerConfigSpec] + +// LoadBalancerConfigExtension providers auxiliary methods for LoadBalancerConfig resource. +type LoadBalancerConfigExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (LoadBalancerConfigExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: LoadBalancerConfigType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{}, + } +} diff --git a/client/pkg/omni/resources/omni/loadbalancer_status.go b/client/pkg/omni/resources/omni/loadbalancer_status.go new file mode 100644 index 00000000..55570b16 --- /dev/null +++ b/client/pkg/omni/resources/omni/loadbalancer_status.go @@ -0,0 +1,50 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewLoadBalancerStatus creates new LoadBalancerStatus state. +func NewLoadBalancerStatus(ns, id string) *LoadBalancerStatus { + return typed.NewResource[LoadBalancerStatusSpec, LoadBalancerStatusExtension]( + resource.NewMetadata(ns, LoadBalancerStatusType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.LoadBalancerStatusSpec{}), + ) +} + +// LoadBalancerStatusType is a resource type that reports the status of a load balancer. +const LoadBalancerStatusType = resource.Type("LoadBalancerStatuses.omni.sidero.dev") + +// LoadBalancerStatus is a resource that reports the status of a load balancer. +type LoadBalancerStatus = typed.Resource[LoadBalancerStatusSpec, LoadBalancerStatusExtension] + +// LoadBalancerStatusSpec wraps specs.LoadBalancerStatusSpec. +type LoadBalancerStatusSpec = protobuf.ResourceSpec[specs.LoadBalancerStatusSpec, *specs.LoadBalancerStatusSpec] + +// LoadBalancerStatusExtension providers auxiliary methods for LoadBalancerStatus resource. +type LoadBalancerStatusExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (LoadBalancerStatusExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: LoadBalancerStatusType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{ + { + Name: "Healthy", + JSONPath: "{.healthy}", + }, + }, + } +} diff --git a/client/pkg/omni/resources/omni/machine.go b/client/pkg/omni/resources/omni/machine.go new file mode 100644 index 00000000..99440fad --- /dev/null +++ b/client/pkg/omni/resources/omni/machine.go @@ -0,0 +1,91 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "strconv" + "strings" + + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewMachine creates new Machine state. +func NewMachine(ns, id string) *Machine { + return typed.NewResource[MachineSpec, MachineExtension]( + resource.NewMetadata(ns, MachineType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.MachineSpec{}), + ) +} + +// MachineType is the type of Machine resource. +// +// tsgen:MachineType +const MachineType = resource.Type("Machines.omni.sidero.dev") + +// Machine resource describes connected Talos server (bare-metal, VM, RPi, etc). +// +// Machine resource ID is a machine UUID. +type Machine = typed.Resource[MachineSpec, MachineExtension] + +// MachineSpec wraps specs.MachineSpec. +type MachineSpec = protobuf.ResourceSpec[specs.MachineSpec, *specs.MachineSpec] + +// MachineExtension providers auxiliary methods for Machine resource. +type MachineExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (MachineExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: MachineType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{ + { + Name: "Address", + JSONPath: "{.managementaddress}", + }, + { + Name: "Connected", + JSONPath: "{.connected}", + }, + { + Name: "Reboots", + JSONPath: "{.rebootcount}", + }, + }, + } +} + +// Make implements [typed.Maker] interface. +func (MachineExtension) Make(_ *resource.Metadata, spec *MachineSpec) any { + return (*machineAux)(spec) +} + +type machineAux MachineSpec + +func (m *machineAux) Match(searchFor string) bool { + val := m.Value + + return strings.Contains(val.ManagementAddress, searchFor) +} + +func (m *machineAux) Field(fieldName string) (string, bool) { + val := m.Value + + switch fieldName { + case "management_address": + return val.ManagementAddress, true + case "connected": + return strconv.FormatBool(val.Connected), true + default: + return "", false + } +} diff --git a/client/pkg/omni/resources/omni/machine_class.go b/client/pkg/omni/resources/omni/machine_class.go new file mode 100644 index 00000000..46fd8eb8 --- /dev/null +++ b/client/pkg/omni/resources/omni/machine_class.go @@ -0,0 +1,48 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewMachineClass creates new MachineClass resource. +func NewMachineClass(ns string, id resource.ID) *MachineClass { + return typed.NewResource[MachineClassSpec, MachineClassExtension]( + resource.NewMetadata(ns, MachineClassType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.MachineClassSpec{}), + ) +} + +const ( + // MachineClassType is the type of the MachineClass resource. + // tsgen:MachineClassType + MachineClassType = resource.Type("MachineClasses.omni.sidero.dev") +) + +// MachineClass describes machine set resource. +type MachineClass = typed.Resource[MachineClassSpec, MachineClassExtension] + +// MachineClassSpec wraps specs.MachineClassSpec. +type MachineClassSpec = protobuf.ResourceSpec[specs.MachineClassSpec, *specs.MachineClassSpec] + +// MachineClassExtension provides auxiliary methods for MachineClass resource. +type MachineClassExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (MachineClassExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: MachineClassType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{}, + } +} diff --git a/client/pkg/omni/resources/omni/machine_config_gen_options.go b/client/pkg/omni/resources/omni/machine_config_gen_options.go new file mode 100644 index 00000000..41e68940 --- /dev/null +++ b/client/pkg/omni/resources/omni/machine_config_gen_options.go @@ -0,0 +1,48 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewMachineConfigGenOptions creates new MachineConfigGenOptions resource. +func NewMachineConfigGenOptions(ns string, id resource.ID) *MachineConfigGenOptions { + return typed.NewResource[MachineConfigGenOptionsSpec, MachineConfigGenOptionsExtension]( + resource.NewMetadata(ns, MachineConfigGenOptionsType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.MachineConfigGenOptionsSpec{}), + ) +} + +const ( + // MachineConfigGenOptionsType is the type of the MachineConfigGenOptions resource. + // tsgen:MachineConfigGenOptionsType + MachineConfigGenOptionsType = resource.Type("MachineConfigGenOptions.omni.sidero.dev") +) + +// MachineConfigGenOptions describes machine config resource. +type MachineConfigGenOptions = typed.Resource[MachineConfigGenOptionsSpec, MachineConfigGenOptionsExtension] + +// MachineConfigGenOptionsSpec wraps specs.MachineConfigGenOptionsSpec. +type MachineConfigGenOptionsSpec = protobuf.ResourceSpec[specs.MachineConfigGenOptionsSpec, *specs.MachineConfigGenOptionsSpec] + +// MachineConfigGenOptionsExtension provides auxiliary methods for MachineConfigGenOptions resource. +type MachineConfigGenOptionsExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (MachineConfigGenOptionsExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: MachineConfigGenOptionsType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{}, + } +} diff --git a/client/pkg/omni/resources/omni/machine_labels.go b/client/pkg/omni/resources/omni/machine_labels.go new file mode 100644 index 00000000..01ade076 --- /dev/null +++ b/client/pkg/omni/resources/omni/machine_labels.go @@ -0,0 +1,48 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewMachineLabels creates new cluster machine status resource. +func NewMachineLabels(ns string, id resource.ID) *MachineLabels { + return typed.NewResource[MachineLabelsSpec, MachineLabelsExtension]( + resource.NewMetadata(ns, MachineLabelsType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.MachineLabelsSpec{}), + ) +} + +const ( + // MachineLabelsType is the type of the MachineLabels resource. + // tsgen:MachineLabelsType + MachineLabelsType = resource.Type("MachineLabels.omni.sidero.dev") +) + +// MachineLabels contains the summary for the cluster health, availability, number of nodes. +type MachineLabels = typed.Resource[MachineLabelsSpec, MachineLabelsExtension] + +// MachineLabelsSpec wraps specs.MachineLabelsSpec. +type MachineLabelsSpec = protobuf.ResourceSpec[specs.MachineLabelsSpec, *specs.MachineLabelsSpec] + +// MachineLabelsExtension provides auxiliary methods for MachineLabels resource. +type MachineLabelsExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (MachineLabelsExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: MachineLabelsType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{}, + } +} diff --git a/client/pkg/omni/resources/omni/machine_set.go b/client/pkg/omni/resources/omni/machine_set.go new file mode 100644 index 00000000..4de95135 --- /dev/null +++ b/client/pkg/omni/resources/omni/machine_set.go @@ -0,0 +1,75 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "fmt" + + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// ControlPlanesIDSuffix is the suffix for the MachineSet control planes of a cluster. +// +// tsgen:ControlPlanesIDSuffix +const ControlPlanesIDSuffix = "control-planes" + +// DefaultWorkersIDSuffix is the suffix for the MachineSet workers of a cluster. +// +// tsgen:DefaultWorkersIDSuffix +const DefaultWorkersIDSuffix = "workers" + +// ControlPlanesResourceID returns the name for the MachineSet control planes of a cluster. +func ControlPlanesResourceID(clusterName string) string { + return fmt.Sprintf("%s-%s", clusterName, ControlPlanesIDSuffix) +} + +// WorkersResourceID returns the name for the default MachineSet workers of a cluster. +func WorkersResourceID(clusterName string) string { + return fmt.Sprintf("%s-%s", clusterName, DefaultWorkersIDSuffix) +} + +// AdditionalWorkersResourceID returns the name for the additional MachineSet workers of a cluster. +func AdditionalWorkersResourceID(clusterName, name string) string { + return fmt.Sprintf("%s-%s", clusterName, name) +} + +// NewMachineSet creates new MachineSet resource. +func NewMachineSet(ns string, id resource.ID) *MachineSet { + return typed.NewResource[MachineSetSpec, MachineSetExtension]( + resource.NewMetadata(ns, MachineSetType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.MachineSetSpec{}), + ) +} + +const ( + // MachineSetType is the type of the MachineSet resource. + // tsgen:MachineSetType + MachineSetType = resource.Type("MachineSets.omni.sidero.dev") +) + +// MachineSet describes machine set resource. +type MachineSet = typed.Resource[MachineSetSpec, MachineSetExtension] + +// MachineSetSpec wraps specs.MachineSetSpec. +type MachineSetSpec = protobuf.ResourceSpec[specs.MachineSetSpec, *specs.MachineSetSpec] + +// MachineSetExtension provides auxiliary methods for MachineSet resource. +type MachineSetExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (MachineSetExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: MachineSetType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{}, + } +} diff --git a/client/pkg/omni/resources/omni/machine_set_destroy_status.go b/client/pkg/omni/resources/omni/machine_set_destroy_status.go new file mode 100644 index 00000000..695c9e8a --- /dev/null +++ b/client/pkg/omni/resources/omni/machine_set_destroy_status.go @@ -0,0 +1,53 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewMachineSetDestroyStatus creates new cluster destroy status. +func NewMachineSetDestroyStatus(ns string, id resource.ID) *MachineSetDestroyStatus { + return typed.NewResource[MachineSetDestroyStatusSpec, MachineSetDestroyStatusExtension]( + resource.NewMetadata(ns, MachineSetDestroyStatusType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.DestroyStatusSpec{}), + ) +} + +const ( + // MachineSetDestroyStatusType is the type of the MachineSetDestroyStatus resource. + // tsgen:MachineSetDestroyStatusType + MachineSetDestroyStatusType = resource.Type("MachineSetDestroyStatuses.omni.sidero.dev") +) + +// MachineSetDestroyStatus contains the state of machine set destroy for machine tsse in TearingDown phase. +type MachineSetDestroyStatus = typed.Resource[MachineSetDestroyStatusSpec, MachineSetDestroyStatusExtension] + +// MachineSetDestroyStatusSpec wraps specs.MachineSetDestroyStatusSpec. +type MachineSetDestroyStatusSpec = protobuf.ResourceSpec[specs.DestroyStatusSpec, *specs.DestroyStatusSpec] + +// MachineSetDestroyStatusExtension provides auxiliary methods for MachineSetDestroyStatus resource. +type MachineSetDestroyStatusExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (MachineSetDestroyStatusExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: MachineSetDestroyStatusType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.EphemeralNamespace, + PrintColumns: []meta.PrintColumn{ + { + Name: "Phase", + JSONPath: "{.phase}", + }, + }, + } +} diff --git a/client/pkg/omni/resources/omni/machine_set_node.go b/client/pkg/omni/resources/omni/machine_set_node.go new file mode 100644 index 00000000..4df5391d --- /dev/null +++ b/client/pkg/omni/resources/omni/machine_set_node.go @@ -0,0 +1,68 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewMachineSetNode creates new MachineSetNode resource. +func NewMachineSetNode(ns string, id resource.ID, owner resource.Resource) *MachineSetNode { + // this should never happen, simple sanity check + if owner.Metadata().Type() != MachineSetType { + panic("the owner of a machine set node must always be a machine set") + } + + res := typed.NewResource[MachineSetNodeSpec, MachineSetNodeExtension]( + resource.NewMetadata(ns, MachineSetNodeType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.MachineSetNodeSpec{}), + ) + + for _, label := range []string{ + LabelCluster, + LabelControlPlaneRole, + LabelWorkerRole, + } { + val, ok := owner.Metadata().Labels().Get(label) + if ok { + res.Metadata().Labels().Set(label, val) + } + } + + res.Metadata().Labels().Set(LabelMachineSet, owner.Metadata().ID()) + + return res +} + +const ( + // MachineSetNodeType is the type of the MachineSetNode resource. + // tsgen:MachineSetNodeType + MachineSetNodeType = resource.Type("MachineSetNodes.omni.sidero.dev") +) + +// MachineSetNode describes machine set node resource. +type MachineSetNode = typed.Resource[MachineSetNodeSpec, MachineSetNodeExtension] + +// MachineSetNodeSpec wraps specs.MachineSetNodeSpec. +type MachineSetNodeSpec = protobuf.ResourceSpec[specs.MachineSetNodeSpec, *specs.MachineSetNodeSpec] + +// MachineSetNodeExtension provides auxiliary methods for MachineSetNode resource. +type MachineSetNodeExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (MachineSetNodeExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: MachineSetNodeType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{}, + } +} diff --git a/client/pkg/omni/resources/omni/machine_set_status.go b/client/pkg/omni/resources/omni/machine_set_status.go new file mode 100644 index 00000000..ebc77371 --- /dev/null +++ b/client/pkg/omni/resources/omni/machine_set_status.go @@ -0,0 +1,48 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewMachineSetStatus creates new MachineSetStatus resource. +func NewMachineSetStatus(ns string, id resource.ID) *MachineSetStatus { + return typed.NewResource[MachineSetStatusSpec, MachineSetStatusExtension]( + resource.NewMetadata(ns, MachineSetStatusType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.MachineSetStatusSpec{}), + ) +} + +const ( + // MachineSetStatusType is the type of the MachineSetStatus resource. + // tsgen:MachineSetStatusType + MachineSetStatusType = resource.Type("MachineSetStatuses.omni.sidero.dev") +) + +// MachineSetStatus describes current machine set status. +type MachineSetStatus = typed.Resource[MachineSetStatusSpec, MachineSetStatusExtension] + +// MachineSetStatusSpec wraps specs.MachineSetStatusSpec. +type MachineSetStatusSpec = protobuf.ResourceSpec[specs.MachineSetStatusSpec, *specs.MachineSetStatusSpec] + +// MachineSetStatusExtension provides auxiliary methods for MachineSetStatus resource. +type MachineSetStatusExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (MachineSetStatusExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: MachineSetStatusType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{}, + } +} diff --git a/client/pkg/omni/resources/omni/machine_status.go b/client/pkg/omni/resources/omni/machine_status.go new file mode 100644 index 00000000..ca3d1ec9 --- /dev/null +++ b/client/pkg/omni/resources/omni/machine_status.go @@ -0,0 +1,222 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "fmt" + "strconv" + "strings" + + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewMachineStatus creates new MachineStatus state. +func NewMachineStatus(ns, id string) *MachineStatus { + return typed.NewResource[MachineStatusSpec, MachineStatusExtension]( + resource.NewMetadata(ns, MachineStatusType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.MachineStatusSpec{}), + ) +} + +// MachineStatusType is the type of MachineStatus resource. +// +// tsgen:MachineStatusType +const MachineStatusType = resource.Type("MachineStatuses.omni.sidero.dev") + +// MachineStatus resource contains current information about the Machine. +// +// MachineStatus contains node information like hostname, +// +// MachineStatus resource ID is a Machine UUID. +type MachineStatus = typed.Resource[MachineStatusSpec, MachineStatusExtension] + +// MachineStatusSpec wraps specs.MachineStatusSpec. +type MachineStatusSpec = protobuf.ResourceSpec[specs.MachineStatusSpec, *specs.MachineStatusSpec] + +// MachineStatusExtension providers auxiliary methods for MachineStatus resource. +type MachineStatusExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (MachineStatusExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: MachineStatusType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{}, + } +} + +// Make implements [typed.Maker] interface. +func (MachineStatusExtension) Make(_ *resource.Metadata, spec *MachineStatusSpec) any { + return (*machineStatusAux)(spec) +} + +type machineStatusAux MachineStatusSpec + +func (m *machineStatusAux) Match(searchFor string) bool { + val := m.Value + + if strings.Contains(val.GetNetwork().GetHostname(), searchFor) || + strings.Contains(val.GetPlatformMetadata().GetHostname(), searchFor) { + return true + } + + for _, link := range val.GetNetwork().GetNetworkLinks() { + if strings.Contains(link.GetHardwareAddress(), searchFor) { + return true + } + } + + return strings.Contains(val.GetCluster(), searchFor) +} + +func (m *machineStatusAux) Field(fieldName string) (string, bool) { + val := m.Value + + switch fieldName { + case LabelSuffixCluster: + return val.GetCluster(), true + case LabelSuffixHostname: + return val.GetNetwork().GetHostname(), true + case LabelSuffixPlatform: + return val.GetPlatformMetadata().GetPlatform(), true + case LabelSuffixArch: + return val.GetHardware().GetArch(), true + default: + return "", false + } +} + +func setLabel(labels *resource.Labels, key string, valueFunc func() string) { + if value := valueFunc(); value != "" { + labels.Set(key, value) + } else { + labels.Delete(key) + } +} + +// MachineStatusReconcileLabels builds a set of labels based on hardware/meta information. +func MachineStatusReconcileLabels(machineStatus *MachineStatus) { + labels := machineStatus.Metadata().Labels() + + setLabel(labels, MachineStatusLabelCores, func() string { + numCores := 0 + + for _, cpu := range machineStatus.TypedSpec().Value.GetHardware().GetProcessors() { + numCores += int(cpu.GetCoreCount()) + } + + if numCores > 0 { + return strconv.Itoa(numCores) + } + + return "" + }) + + setLabel(labels, MachineStatusLabelCPU, func() string { + cpuManufacturer := "" + + for _, cpu := range machineStatus.TypedSpec().Value.GetHardware().GetProcessors() { + if cpu.GetManufacturer() != "" { + cpuManufacturer = cpu.GetManufacturer() + } + } + + cpuManufacturer = strings.ToLower(strings.TrimSpace(cpuManufacturer)) + + switch { + case strings.HasPrefix(cpuManufacturer, "intel"): + return "intel" + case strings.HasPrefix(cpuManufacturer, "amd"): + return "amd" + default: + return cpuManufacturer + } + }) + + setLabel(labels, MachineStatusLabelArch, func() string { + return strings.ToLower(machineStatus.TypedSpec().Value.GetHardware().GetArch()) + }) + + setLabel(labels, MachineStatusLabelMem, func() string { + memMB := 0 + + for _, mem := range machineStatus.TypedSpec().Value.GetHardware().GetMemoryModules() { + memMB += int(mem.GetSizeMb()) + } + + if memMB >= 1024 { + return fmt.Sprintf("%dGiB", memMB/1024) + } + + return "" + }) + + setLabel(labels, MachineStatusLabelStorage, func() string { + storageSize := uint64(0) + + for _, blockDevice := range machineStatus.TypedSpec().Value.GetHardware().GetBlockdevices() { + storageSize += blockDevice.GetSize() + } + + if storageSize >= 1000*1000*1000 { + return fmt.Sprintf("%dGB", storageSize/(1000*1000*1000)) + } + + return "" + }) + + setLabel(labels, MachineStatusLabelNet, func() string { + netMbps := uint64(0) + + for _, net := range machineStatus.TypedSpec().Value.GetNetwork().GetNetworkLinks() { + if net.GetSpeedMbps() >= 10 && net.GetSpeedMbps() <= 100000 { + netMbps += uint64(net.GetSpeedMbps()) + } + } + + switch { + case netMbps >= 1000: + return fmt.Sprintf("%dGbps", netMbps/1000) + case netMbps > 0: + return fmt.Sprintf("%dMbps", netMbps) + default: + return "" + } + }) + + setLabel(labels, MachineStatusLabelPlatform, func() string { + return machineStatus.TypedSpec().Value.PlatformMetadata.GetPlatform() + }) + + setLabel(labels, MachineStatusLabelRegion, func() string { + return machineStatus.TypedSpec().Value.PlatformMetadata.GetRegion() + }) + + setLabel(labels, MachineStatusLabelZone, func() string { + return machineStatus.TypedSpec().Value.PlatformMetadata.GetZone() + }) + + setLabel(labels, MachineStatusLabelInstance, func() string { + return machineStatus.TypedSpec().Value.PlatformMetadata.GetInstanceType() + }) +} + +// GetMachineStatusSystemDisk looks up a system disk for the Talos machine. +func GetMachineStatusSystemDisk(res *MachineStatus) string { + for _, disk := range res.TypedSpec().Value.Hardware.Blockdevices { + if disk.SystemDisk { + return disk.LinuxName + } + } + + return "" +} diff --git a/client/pkg/omni/resources/omni/machine_status_link.go b/client/pkg/omni/resources/omni/machine_status_link.go new file mode 100644 index 00000000..5752498f --- /dev/null +++ b/client/pkg/omni/resources/omni/machine_status_link.go @@ -0,0 +1,108 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "fmt" + "strings" + + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewMachineStatusLink creates new MachineStatusLink resource. +func NewMachineStatusLink(ns string, id resource.ID) *MachineStatusLink { + return typed.NewResource[MachineStatusLinkSpec, MachineStatusLinkExtension]( + resource.NewMetadata(ns, MachineStatusLinkType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.MachineStatusLinkSpec{}), + ) +} + +// MachineStatusLink resource contains current information about the [MachineStatus] and [siderolink.LinkCounter] resources. +type MachineStatusLink = typed.Resource[MachineStatusLinkSpec, MachineStatusLinkExtension] + +// MachineStatusLinkSpec wraps specs.MachineStatusLinkSpec. +type MachineStatusLinkSpec = protobuf.ResourceSpec[specs.MachineStatusLinkSpec, *specs.MachineStatusLinkSpec] + +// MachineStatusLinkType is the type of MachineStatusLink resource. +// +// tsgen:MachineStatusLinkType +const MachineStatusLinkType = resource.Type("MachineStatusLinks.omni.sidero.dev") + +// MachineStatusLinkExtension providers auxiliary methods for MachineStatusLink resource. +type MachineStatusLinkExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (MachineStatusLinkExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: MachineStatusLinkType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.MetricsNamespace, + PrintColumns: []meta.PrintColumn{ + { + Name: "Bytes Received", + JSONPath: "{.siderolinkcounter.bytesreceived}", + }, + { + Name: "Bytes Sent", + JSONPath: "{.siderolinkcounter.bytessent}", + }, + { + Name: "Last Alive", + JSONPath: "{.siderolinkcounter.lastalive}", + }, + }, + } +} + +// Make implements [typed.Maker] interface. +func (MachineStatusLinkExtension) Make(_ *resource.Metadata, spec *MachineStatusLinkSpec) any { + return (*machineStatusLinkAux)(spec) +} + +type machineStatusLinkAux MachineStatusLinkSpec + +func (m *machineStatusLinkAux) Match(searchFor string) bool { + val := m.Value + + if strings.Contains(val.GetMessageStatus().GetNetwork().GetHostname(), searchFor) || + strings.Contains(val.GetMessageStatus().GetPlatformMetadata().GetHostname(), searchFor) { + return true + } + + for _, link := range val.GetMessageStatus().GetNetwork().GetNetworkLinks() { + if strings.Contains(link.GetHardwareAddress(), searchFor) { + return true + } + } + + return strings.Contains(val.GetMessageStatus().GetCluster(), searchFor) +} + +func (m *machineStatusLinkAux) Field(fieldName string) (string, bool) { + val := m.Value + + switch fieldName { + case "cluster": + return val.GetMessageStatus().GetCluster(), true + case "hostname": + return val.GetMessageStatus().GetNetwork().GetHostname(), true + case "platform": + return val.GetMessageStatus().GetPlatformMetadata().GetPlatform(), true + case "arch": + return val.GetMessageStatus().GetHardware().GetArch(), true + case "last_alive": + return fmt.Sprintf("%020d", val.GetSiderolinkCounter().GetLastAlive().GetSeconds()), true + case "machine_created_at": + return fmt.Sprintf("%020d", val.GetMachineCreatedAt()), true + default: + return "", false + } +} diff --git a/client/pkg/omni/resources/omni/machine_status_snapshot.go b/client/pkg/omni/resources/omni/machine_status_snapshot.go new file mode 100644 index 00000000..00473300 --- /dev/null +++ b/client/pkg/omni/resources/omni/machine_status_snapshot.go @@ -0,0 +1,49 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewMachineStatusSnapshot creates new MachineStatusSnapshot state. +func NewMachineStatusSnapshot(ns, id string) *MachineStatusSnapshot { + return typed.NewResource[MachineStatusSnapshotSpec, MachineStatusSnapshotExtension]( + resource.NewMetadata(ns, MachineStatusSnapshotType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.MachineStatusSnapshotSpec{}), + ) +} + +// MachineStatusSnapshotType is the type of MachineStatusSnapshot resource. +// +// tsgen:MachineStatusSnapshotType +const MachineStatusSnapshotType = resource.Type("MachineStatusSnapshots.omni.sidero.dev") + +// MachineStatusSnapshot resource contains snapshot of Talos MachineStatus resource. +// +// MachineStatusSnapshot resource ID is a Machine UUID. +type MachineStatusSnapshot = typed.Resource[MachineStatusSnapshotSpec, MachineStatusSnapshotExtension] + +// MachineStatusSnapshotSpec wraps specs.MachineStatusSnapshotSpec. +type MachineStatusSnapshotSpec = protobuf.ResourceSpec[specs.MachineStatusSnapshotSpec, *specs.MachineStatusSnapshotSpec] + +// MachineStatusSnapshotExtension providers auxiliary methods for MachineStatusSnapshot resource. +type MachineStatusSnapshotExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (MachineStatusSnapshotExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: MachineStatusSnapshotType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{}, + } +} diff --git a/client/pkg/omni/resources/omni/machine_status_test.go b/client/pkg/omni/resources/omni/machine_status_test.go new file mode 100644 index 00000000..ea23a73c --- /dev/null +++ b/client/pkg/omni/resources/omni/machine_status_test.go @@ -0,0 +1,169 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni_test + +import ( + "testing" + + "github.com/cosi-project/runtime/pkg/resource/typed" + "github.com/stretchr/testify/assert" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources/omni" + "github.com/siderolabs/omni/client/pkg/runtime" +) + +func TestMachineStatusReconcileLabels(t *testing.T) { + t.Parallel() + + for _, test := range []struct { //nolint:govet + name string + spec *specs.MachineStatusSpec + want map[string]string + }{ + { + name: "empty", + spec: &specs.MachineStatusSpec{}, + }, + { + name: "full", + spec: &specs.MachineStatusSpec{ + Hardware: &specs.MachineStatusSpec_HardwareStatus{ + Arch: "amd64", + Processors: []*specs.MachineStatusSpec_HardwareStatus_Processor{ + { + Manufacturer: "Intel", + CoreCount: 4, + }, + { + CoreCount: 2, + }, + }, + MemoryModules: []*specs.MachineStatusSpec_HardwareStatus_MemoryModule{ + { + SizeMb: 8192, + }, + { + SizeMb: 8192, + }, + }, + Blockdevices: []*specs.MachineStatusSpec_HardwareStatus_BlockDevice{ + { + Size: 1024 * 1024, + }, + { + Size: 200 * 1000 * 1000 * 1000, + }, + { + Size: 400 * 1000 * 1000 * 1000, + }, + }, + }, + Network: &specs.MachineStatusSpec_NetworkStatus{ + NetworkLinks: []*specs.MachineStatusSpec_NetworkStatus_NetworkLinkStatus{ + { + SpeedMbps: 43333333, + }, + { + SpeedMbps: 10 * 1024, + }, + { + SpeedMbps: 20 * 1024, + }, + }, + }, + PlatformMetadata: &specs.MachineStatusSpec_PlatformMetadata{ + Platform: "aws", + Region: "us-east-1", + Zone: "us-east-1a", + InstanceType: "c1.small", + }, + }, + want: map[string]string{ + omni.MachineStatusLabelArch: "amd64", + omni.MachineStatusLabelCPU: "intel", + omni.MachineStatusLabelCores: "6", + omni.MachineStatusLabelMem: "16GiB", + omni.MachineStatusLabelStorage: "600GB", + omni.MachineStatusLabelNet: "30Gbps", + omni.MachineStatusLabelPlatform: "aws", + omni.MachineStatusLabelRegion: "us-east-1", + omni.MachineStatusLabelZone: "us-east-1a", + omni.MachineStatusLabelInstance: "c1.small", + }, + }, + { + name: "full", + spec: &specs.MachineStatusSpec{ + Hardware: &specs.MachineStatusSpec_HardwareStatus{ + Arch: "amd64", + Processors: []*specs.MachineStatusSpec_HardwareStatus_Processor{ + { + Manufacturer: "Intel(R) Corporation", + CoreCount: 4, + }, + { + Manufacturer: "Intel(R) Corporation", + CoreCount: 2, + }, + }, + }, + Network: &specs.MachineStatusSpec_NetworkStatus{ + NetworkLinks: []*specs.MachineStatusSpec_NetworkStatus_NetworkLinkStatus{ + { + SpeedMbps: 1000, + }, + }, + }, + }, + want: map[string]string{ + omni.MachineStatusLabelArch: "amd64", + omni.MachineStatusLabelCores: "6", + omni.MachineStatusLabelCPU: "intel", + omni.MachineStatusLabelNet: "1Gbps", + }, + }, + } { + t.Run(test.name, func(t *testing.T) { + t.Parallel() + + ms := omni.NewMachineStatus("", "") + + ms.TypedSpec().Value = test.spec + + omni.MachineStatusReconcileLabels(ms) + + assert.Equal(t, test.want, ms.Metadata().Labels().Raw()) + }) + } +} + +func TestLookup(t *testing.T) { + ms := omni.NewMachineStatus("", "") + ms.TypedSpec().Value = &specs.MachineStatusSpec{ + Cluster: "random-cluster", + PlatformMetadata: &specs.MachineStatusSpec_PlatformMetadata{ + Platform: "aws", + Hostname: "myhostname", + Region: "us-west", + }, + Network: &specs.MachineStatusSpec_NetworkStatus{ + Hostname: "my-network-hostname", + NetworkLinks: []*specs.MachineStatusSpec_NetworkStatus_NetworkLinkStatus{ + { + HardwareAddress: "f2:64:e7:e0:0b:12", + }, + }, + }, + } + + ext, ok := typed.LookupExtension[runtime.Matcher](ms) + assert.True(t, ok) + assert.True(t, ext.Match("random-cluster")) + assert.True(t, ext.Match("myhostname")) + assert.True(t, ext.Match("my-network-hostname")) + assert.True(t, ext.Match("f2:64:e7:e0:0b:12")) + assert.False(t, ext.Match("random-cluster-2")) +} diff --git a/client/pkg/omni/resources/omni/omni.go b/client/pkg/omni/resources/omni/omni.go new file mode 100644 index 00000000..d1c97da6 --- /dev/null +++ b/client/pkg/omni/resources/omni/omni.go @@ -0,0 +1,70 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +// Package omni provides resources describing the Machines, Clusters, etc. +package omni + +import "github.com/siderolabs/omni/client/pkg/omni/resources/registry" + +func init() { + registry.MustRegisterResource(ClusterBootstrapStatusType, &ClusterBootstrapStatus{}) + registry.MustRegisterResource(ClusterConfigVersionType, &ClusterConfigVersion{}) + registry.MustRegisterResource(ClusterEndpointType, &ClusterEndpoint{}) + registry.MustRegisterResource(ClusterDestroyStatusType, &ClusterDestroyStatus{}) + registry.MustRegisterResource(ClusterType, &Cluster{}) + registry.MustRegisterResource(ClusterUUIDType, &ClusterUUID{}) + registry.MustRegisterResource(ClusterSecretsType, &ClusterSecrets{}) + registry.MustRegisterResource(ClusterStatusType, &ClusterStatus{}) + registry.MustRegisterResource(ClusterMachineType, &ClusterMachine{}) + registry.MustRegisterResource(ClusterMachineEncryptionKeyType, &ClusterMachineEncryptionKey{}) + registry.MustRegisterResource(ClusterMachineIdentityType, &ClusterMachineIdentity{}) + registry.MustRegisterResource(ClusterMachineStatusType, &ClusterMachineStatus{}) + registry.MustRegisterResource(ClusterMachineConfigType, &ClusterMachineConfig{}) + registry.MustRegisterResource(ClusterMachineConfigPatchesType, &ClusterMachineConfigPatches{}) + registry.MustRegisterResource(ClusterMachineConfigStatusType, &ClusterMachineConfigStatus{}) + registry.MustRegisterResource(ClusterMachineTalosVersionType, &ClusterMachineTalosVersion{}) + registry.MustRegisterResource(ClusterMachineTemplateType, &ClusterMachineTemplate{}) + registry.MustRegisterResource(ConfigPatchType, &ConfigPatch{}) + registry.MustRegisterResource(EtcdAuditResultType, &EtcdAuditResult{}) + registry.MustRegisterResource(EtcdBackupType, &EtcdBackup{}) + registry.MustRegisterResource(EtcdBackupS3ConfType, &EtcdBackupS3Conf{}) + registry.MustRegisterResource(EtcdBackupEncryptionType, &EtcdBackupEncryption{}) + registry.MustRegisterResource(EtcdBackupStatusType, &EtcdBackupStatus{}) + registry.MustRegisterResource(EtcdBackupOverallStatusType, &EtcdBackupOverallStatus{}) + registry.MustRegisterResource(EtcdBackupStoreStatusType, &EtcdBackupStoreStatus{}) + registry.MustRegisterResource(BackupDataType, &BackupData{}) + registry.MustRegisterResource(EtcdManualBackupType, &EtcdManualBackup{}) + registry.MustRegisterResource(ExposedServiceType, &ExposedService{}) + registry.MustRegisterResource(FeaturesConfigType, &FeaturesConfig{}) + registry.MustRegisterResource(ImagePullRequestType, &ImagePullRequest{}) + registry.MustRegisterResource(ImagePullStatusType, &ImagePullStatus{}) + registry.MustRegisterResource(InstallationMediaType, &InstallationMedia{}) + registry.MustRegisterResource(ControlPlaneStatusType, &ControlPlaneStatus{}) + registry.MustRegisterResource(KubeconfigType, &Kubeconfig{}) + registry.MustRegisterResource(KubernetesStatusType, &KubernetesStatus{}) + registry.MustRegisterResource(KubernetesUpgradeManifestStatusType, &KubernetesUpgradeManifestStatus{}) + registry.MustRegisterResource(KubernetesUpgradeStatusType, &KubernetesUpgradeStatus{}) + registry.MustRegisterResource(KubernetesVersionType, &KubernetesVersion{}) + registry.MustRegisterResource(MachineLabelsType, &MachineLabels{}) + registry.MustRegisterResource(MachineType, &Machine{}) + registry.MustRegisterResource(MachineClassType, &MachineClass{}) + registry.MustRegisterResource(MachineConfigGenOptionsType, &MachineConfigGenOptions{}) + registry.MustRegisterResource(MachineSetType, &MachineSet{}) + registry.MustRegisterResource(MachineSetDestroyStatusType, &MachineSetDestroyStatus{}) + registry.MustRegisterResource(MachineSetNodeType, &MachineSetNode{}) + registry.MustRegisterResource(MachineSetStatusType, &MachineSetStatus{}) + registry.MustRegisterResource(MachineStatusType, &MachineStatus{}) + registry.MustRegisterResource(MachineStatusSnapshotType, &MachineStatusSnapshot{}) + registry.MustRegisterResource(MachineStatusLinkType, &MachineStatusLink{}) + registry.MustRegisterResource(LoadBalancerConfigType, &LoadBalancerConfig{}) + registry.MustRegisterResource(LoadBalancerStatusType, &LoadBalancerStatus{}) + registry.MustRegisterResource(OngoingTaskType, &OngoingTask{}) + registry.MustRegisterResource(RedactedClusterMachineConfigType, &RedactedClusterMachineConfig{}) + registry.MustRegisterResource(SchematicType, &Schematic{}) + registry.MustRegisterResource(SchematicConfigurationType, &SchematicConfiguration{}) + registry.MustRegisterResource(TalosConfigType, &TalosConfig{}) + registry.MustRegisterResource(TalosExtensionsType, &TalosExtensions{}) + registry.MustRegisterResource(TalosVersionType, &TalosVersion{}) + registry.MustRegisterResource(TalosUpgradeStatusType, &TalosUpgradeStatus{}) +} diff --git a/client/pkg/omni/resources/omni/ongoing_task.go b/client/pkg/omni/resources/omni/ongoing_task.go new file mode 100644 index 00000000..b1b92775 --- /dev/null +++ b/client/pkg/omni/resources/omni/ongoing_task.go @@ -0,0 +1,52 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewOngoingTask creates new OngoingTask state. +func NewOngoingTask(ns, id string) *OngoingTask { + return typed.NewResource[OngoingTaskSpec, OngoingTaskExtension]( + resource.NewMetadata(ns, OngoingTaskType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.OngoingTaskSpec{}), + ) +} + +// OngoingTaskType is the type of OngoingTask resource. +// +// tsgen:OngoingTaskType +const OngoingTaskType = resource.Type("OngoingTasks.omni.sidero.dev") + +// OngoingTask resource describes an ongoing background task. +type OngoingTask = typed.Resource[OngoingTaskSpec, OngoingTaskExtension] + +// OngoingTaskSpec wraps specs.OngoingTaskSpec. +type OngoingTaskSpec = protobuf.ResourceSpec[specs.OngoingTaskSpec, *specs.OngoingTaskSpec] + +// OngoingTaskExtension providers auxiliary methods for OngoingTask resource. +type OngoingTaskExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (OngoingTaskExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: OngoingTaskType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{ + { + Name: "Title", + JSONPath: "{.title}", + }, + }, + } +} diff --git a/client/pkg/omni/resources/omni/redacted_cluster_machine_config.go b/client/pkg/omni/resources/omni/redacted_cluster_machine_config.go new file mode 100644 index 00000000..45560cc4 --- /dev/null +++ b/client/pkg/omni/resources/omni/redacted_cluster_machine_config.go @@ -0,0 +1,48 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewRedactedClusterMachineConfig creates new redacted cluster machine config resource. +func NewRedactedClusterMachineConfig(ns string, id resource.ID) *RedactedClusterMachineConfig { + return typed.NewResource[RedactedClusterMachineConfigSpec, RedactedClusterMachineConfigExtension]( + resource.NewMetadata(ns, RedactedClusterMachineConfigType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.RedactedClusterMachineConfigSpec{}), + ) +} + +const ( + // RedactedClusterMachineConfigType is the type of the RedactedClusterMachineConfig resource. + // tsgen:RedactedClusterMachineConfigType + RedactedClusterMachineConfigType = resource.Type("RedactedClusterMachineConfigs.omni.sidero.dev") +) + +// RedactedClusterMachineConfig is the redacted version of the final machine config. +type RedactedClusterMachineConfig = typed.Resource[RedactedClusterMachineConfigSpec, RedactedClusterMachineConfigExtension] + +// RedactedClusterMachineConfigSpec wraps specs.RedactedClusterMachineConfigSpec. +type RedactedClusterMachineConfigSpec = protobuf.ResourceSpec[specs.RedactedClusterMachineConfigSpec, *specs.RedactedClusterMachineConfigSpec] + +// RedactedClusterMachineConfigExtension provides auxiliary methods for RedactedClusterMachineConfig resource. +type RedactedClusterMachineConfigExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (RedactedClusterMachineConfigExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: RedactedClusterMachineConfigType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{}, + } +} diff --git a/client/pkg/omni/resources/omni/schematic.go b/client/pkg/omni/resources/omni/schematic.go new file mode 100644 index 00000000..ba329e5f --- /dev/null +++ b/client/pkg/omni/resources/omni/schematic.go @@ -0,0 +1,48 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewSchematic creates new schematic resource. +func NewSchematic(ns string, id resource.ID) *Schematic { + return typed.NewResource[SchematicSpec, SchematicExtension]( + resource.NewMetadata(ns, SchematicType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.SchematicSpec{}), + ) +} + +const ( + // SchematicType is the type of the Schematic resource. + // tsgen:SchematicType + SchematicType = resource.Type("Schematics.omni.sidero.dev") +) + +// Schematic describes previosly generated image factory schematic. +type Schematic = typed.Resource[SchematicSpec, SchematicExtension] + +// SchematicSpec wraps specs.SchematicSpec. +type SchematicSpec = protobuf.ResourceSpec[specs.SchematicSpec, *specs.SchematicSpec] + +// SchematicExtension provides auxiliary methods for Schematic resource. +type SchematicExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (SchematicExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: SchematicType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{}, + } +} diff --git a/client/pkg/omni/resources/omni/schematic_configuration.go b/client/pkg/omni/resources/omni/schematic_configuration.go new file mode 100644 index 00000000..4a0bc8a9 --- /dev/null +++ b/client/pkg/omni/resources/omni/schematic_configuration.go @@ -0,0 +1,48 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewSchematicConfiguration creates new schematic configuration resource. +func NewSchematicConfiguration(ns string, id resource.ID) *SchematicConfiguration { + return typed.NewResource[SchematicConfigurationSpec, SchematicConfigurationExtension]( + resource.NewMetadata(ns, SchematicConfigurationType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.SchematicConfigurationSpec{}), + ) +} + +const ( + // SchematicConfigurationType is the type of the SchematicConfiguration resource. + // tsgen:SchematicConfigurationType + SchematicConfigurationType = resource.Type("SchematicConfigurations.omni.sidero.dev") +) + +// SchematicConfiguration describes desired machine schematic for the particular machine, machine set or cluster. +type SchematicConfiguration = typed.Resource[SchematicConfigurationSpec, SchematicConfigurationExtension] + +// SchematicConfigurationSpec wraps specs.SchematicConfigurationSpec. +type SchematicConfigurationSpec = protobuf.ResourceSpec[specs.SchematicConfigurationSpec, *specs.SchematicConfigurationSpec] + +// SchematicConfigurationExtension provides auxiliary methods for SchematicConfiguration resource. +type SchematicConfigurationExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (SchematicConfigurationExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: SchematicConfigurationType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{}, + } +} diff --git a/client/pkg/omni/resources/omni/secrets.go b/client/pkg/omni/resources/omni/secrets.go new file mode 100644 index 00000000..ba972d6c --- /dev/null +++ b/client/pkg/omni/resources/omni/secrets.go @@ -0,0 +1,67 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "encoding/json" + "time" + + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + "github.com/siderolabs/talos/pkg/machinery/config/generate/secrets" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewClusterSecrets creates new ClusterSecrets state. +func NewClusterSecrets(ns string, id resource.ID) *ClusterSecrets { + return typed.NewResource[ClusterSecretsSpec, ClusterSecretsExtension]( + resource.NewMetadata(ns, ClusterSecretsType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.ClusterSecretsSpec{}), + ) +} + +// ClusterSecretsType is the type of ClusterSecrets resource. +// +// tsgen:ClusterSecretsType +const ClusterSecretsType = resource.Type("ClusterSecrets.omni.sidero.dev") + +// ClusterSecrets resource describes cluster secrets. +// +// ClusterSecrets resource ID is a cluster ID. +type ClusterSecrets = typed.Resource[ClusterSecretsSpec, ClusterSecretsExtension] + +// ClusterSecretsSpec wraps specs.ClusterSecretsSpec. +type ClusterSecretsSpec = protobuf.ResourceSpec[specs.ClusterSecretsSpec, *specs.ClusterSecretsSpec] + +// ClusterSecretsExtension providers auxiliary methods for ClusterSecrets resource. +type ClusterSecretsExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (ClusterSecretsExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: ClusterSecretsType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{}, + } +} + +// ToSecretsBundle decodes the resource into generate.SecretsBundle resource. +func ToSecretsBundle(clusterSecrets *ClusterSecrets) (*secrets.Bundle, error) { + secretBundle := &secrets.Bundle{} + + err := json.Unmarshal(clusterSecrets.TypedSpec().Value.Data, secretBundle) + if err != nil { + return nil, err + } + + secretBundle.Clock = secrets.NewFixedClock(time.Now()) + + return secretBundle, err +} diff --git a/client/pkg/omni/resources/omni/talos_extensions.go b/client/pkg/omni/resources/omni/talos_extensions.go new file mode 100644 index 00000000..33c44592 --- /dev/null +++ b/client/pkg/omni/resources/omni/talos_extensions.go @@ -0,0 +1,47 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewTalosExtensions creates new Kubernetes component version/readiness state. +func NewTalosExtensions(ns, id string) *TalosExtensions { + return typed.NewResource[TalosExtensionsSpec, TalosExtensionsExtension]( + resource.NewMetadata(ns, TalosExtensionsType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.TalosExtensionsSpec{}), + ) +} + +// TalosExtensionsType is resource type that contains all available extensions for a Talos version. +// +// tsgen:TalosExtensionsType +const TalosExtensionsType = resource.Type("TalosExtensions.omni.sidero.dev") + +// TalosExtensions is resource type that contains all available extensions for a Talos version. +type TalosExtensions = typed.Resource[TalosExtensionsSpec, TalosExtensionsExtension] + +// TalosExtensionsSpec wraps specs.TalosExtensionsSpec. +type TalosExtensionsSpec = protobuf.ResourceSpec[specs.TalosExtensionsSpec, *specs.TalosExtensionsSpec] + +// TalosExtensionsExtension providers auxiliary methods for TalosExtensions resource. +type TalosExtensionsExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (TalosExtensionsExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: TalosExtensionsType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{}, + } +} diff --git a/client/pkg/omni/resources/omni/talos_upgrade_status.go b/client/pkg/omni/resources/omni/talos_upgrade_status.go new file mode 100644 index 00000000..cbdeb989 --- /dev/null +++ b/client/pkg/omni/resources/omni/talos_upgrade_status.go @@ -0,0 +1,47 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewTalosUpgradeStatus creates new LoadBalancer state. +func NewTalosUpgradeStatus(ns, id string) *TalosUpgradeStatus { + return typed.NewResource[TalosUpgradeStatusSpec, TalosUpgradeStatusExtension]( + resource.NewMetadata(ns, TalosUpgradeStatusType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.TalosUpgradeStatusSpec{}), + ) +} + +// TalosUpgradeStatusType is a resource type that contains the current state of the machine set Talos upgrade. +// +// tsgen:TalosUpgradeStatusType +const TalosUpgradeStatusType = resource.Type("TalosUpgradeStatuses.omni.sidero.dev") + +// TalosUpgradeStatus is a resource type that contains the configuration of a load balancer. +type TalosUpgradeStatus = typed.Resource[TalosUpgradeStatusSpec, TalosUpgradeStatusExtension] + +// TalosUpgradeStatusSpec wraps specs.TalosUpgradeStatusSpec. +type TalosUpgradeStatusSpec = protobuf.ResourceSpec[specs.TalosUpgradeStatusSpec, *specs.TalosUpgradeStatusSpec] + +// TalosUpgradeStatusExtension providers auxiliary methods for TalosUpgradeStatus resource. +type TalosUpgradeStatusExtension struct{} + +// ResourceDefinition implements typed.ResourceDefinition interface. +func (TalosUpgradeStatusExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: TalosUpgradeStatusType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{}, + } +} diff --git a/client/pkg/omni/resources/omni/talos_version.go b/client/pkg/omni/resources/omni/talos_version.go new file mode 100644 index 00000000..08246af3 --- /dev/null +++ b/client/pkg/omni/resources/omni/talos_version.go @@ -0,0 +1,53 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewTalosVersion creates new cluster resource. +func NewTalosVersion(ns string, id resource.ID) *TalosVersion { + return typed.NewResource[TalosVersionSpec, TalosVersionExtension]( + resource.NewMetadata(ns, TalosVersionType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.TalosVersionSpec{}), + ) +} + +const ( + // TalosVersionType is the type of the TalosVersion resource. + // tsgen:TalosVersionType + TalosVersionType = resource.Type("TalosVersions.omni.sidero.dev") +) + +// TalosVersion describes available Talos version. +type TalosVersion = typed.Resource[TalosVersionSpec, TalosVersionExtension] + +// TalosVersionSpec wraps specs.TalosVersionSpec. +type TalosVersionSpec = protobuf.ResourceSpec[specs.TalosVersionSpec, *specs.TalosVersionSpec] + +// TalosVersionExtension provides auxiliary methods for TalosVersion resource. +type TalosVersionExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (TalosVersionExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: TalosVersionType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{ + { + Name: "Kubernetes Versions", + JSONPath: "{.compatiblekubernetesversions}", + }, + }, + } +} diff --git a/client/pkg/omni/resources/omni/talosconfig.go b/client/pkg/omni/resources/omni/talosconfig.go new file mode 100644 index 00000000..f2f791aa --- /dev/null +++ b/client/pkg/omni/resources/omni/talosconfig.go @@ -0,0 +1,67 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omni + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + clientconfig "github.com/siderolabs/talos/pkg/machinery/client/config" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewTalosConfig creates new Talos config resource. +func NewTalosConfig(ns resource.Namespace, id resource.ID) *TalosConfig { + return typed.NewResource[TalosConfigSpec, TalosConfigExtension]( + resource.NewMetadata(ns, TalosConfigType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.TalosConfigSpec{}), + ) +} + +const ( + // TalosConfigType is the type of the TalosConfig resource. + TalosConfigType = resource.Type("TalosConfigs.omni.sidero.dev") +) + +// TalosConfig describes client config for Talos API. +type TalosConfig = typed.Resource[TalosConfigSpec, TalosConfigExtension] + +// TalosConfigSpec wraps specs.TalosConfigSpec. +type TalosConfigSpec = protobuf.ResourceSpec[specs.TalosConfigSpec, *specs.TalosConfigSpec] + +// TalosConfigExtension provides auxiliary methods for TalosConfig resource. +type TalosConfigExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (TalosConfigExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: TalosConfigType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + PrintColumns: []meta.PrintColumn{}, + } +} + +// NewTalosClientConfig creates talos config.Config from TalosConfig resource. +func NewTalosClientConfig(in *TalosConfig, endpoints ...string) *clientconfig.Config { + spec := in.TypedSpec().Value + + config := &clientconfig.Config{ + Context: in.Metadata().ID(), + Contexts: map[string]*clientconfig.Context{ + in.Metadata().ID(): { + Endpoints: endpoints, + CA: spec.Ca, + Crt: spec.Crt, + Key: spec.Key, + }, + }, + } + + return config +} diff --git a/client/pkg/omni/resources/registry/registry.go b/client/pkg/omni/resources/registry/registry.go new file mode 100644 index 00000000..8fad6179 --- /dev/null +++ b/client/pkg/omni/resources/registry/registry.go @@ -0,0 +1,34 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +// Package registry specifies the list of resources to be registered in the state. +package registry + +import ( + "fmt" + + "github.com/cosi-project/runtime/pkg/controller/generic" + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" +) + +// Resources defines all resources added to the resource definitions. +var Resources []generic.ResourceWithRD + +// MustRegisterResource adds resource to the registry, registers it's protobuf decoders/encoders. +func MustRegisterResource[T any, R interface { + protobuf.Res[T] + meta.ResourceDefinitionProvider +}]( + resourceType resource.Type, + r R, +) { + Resources = append(Resources, r) + + err := protobuf.RegisterResource(resourceType, r) + if err != nil { + panic(fmt.Errorf("failed to register resource %T: %w", r, err)) + } +} diff --git a/client/pkg/omni/resources/resources.go b/client/pkg/omni/resources/resources.go new file mode 100644 index 00000000..1e9beb1e --- /dev/null +++ b/client/pkg/omni/resources/resources.go @@ -0,0 +1,44 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +// Package resources defines various internal Omni resources. +package resources + +import "github.com/cosi-project/runtime/pkg/resource" + +// DefaultNamespace is the default namespace for all resources. +// +// DefaultNamespace has persistence enabled. +// +// tsgen:DefaultNamespace +const DefaultNamespace resource.Namespace = "default" + +// EphemeralNamespace is the namespace for resources which are not persisted. +// +// EphemeralNamespace has no persistence. +// +// tsgen:EphemeralNamespace +const EphemeralNamespace resource.Namespace = "ephemeral" + +// MetricsNamespace is the namespace for resources that store metrics, such as counters. +// It is backed by the secondary storage which is optimized for frequently updated data and has relaxed consistency guarantees. +// +// tsgen:MetricsNamespace +const MetricsNamespace resource.Namespace = "metrics" + +// VirtualNamespace is the namespace where resources are virtual (synthetic), +// i.e. they behave like resources but not actual resources. For example, a resource whose contents change +// based on the requester user's identity. +// +// VirtualNamespace has no persistence. +// +// tsgen:VirtualNamespace +const VirtualNamespace resource.Namespace = "virtual" + +// ExternalNamespace is the namespace where resources are external +// +// ExternalNamespace has no persistence. +// +// tsgen:ExternalNamespace +const ExternalNamespace resource.Namespace = "external" diff --git a/client/pkg/omni/resources/siderolink/config.go b/client/pkg/omni/resources/siderolink/config.go new file mode 100644 index 00000000..e04d2743 --- /dev/null +++ b/client/pkg/omni/resources/siderolink/config.go @@ -0,0 +1,55 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package siderolink + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" +) + +const ( + // ConfigType is the type of Config resource. + // + // tsgen:ConfigType + ConfigType = resource.Type("Configs.omni.sidero.dev") + // ConfigID is the config resource name. + // + // tsgen:ConfigID + ConfigID = resource.ID("siderolink-config") +) + +// NewConfig creates new Config resource. +func NewConfig(ns string) *Config { + return typed.NewResource[ConfigSpec, ConfigExtension]( + resource.NewMetadata(ns, ConfigType, ConfigID, resource.VersionUndefined), + protobuf.NewResourceSpec( + &specs.SiderolinkConfigSpec{}, + ), + ) +} + +// Config resource keeps connected nodes state. +type Config = typed.Resource[ConfigSpec, ConfigExtension] + +// ConfigSpec wraps specs.SiderolinkConfigSpec. +type ConfigSpec = protobuf.ResourceSpec[specs.SiderolinkConfigSpec, *specs.SiderolinkConfigSpec] + +// ConfigExtension providers auxiliary methods for Config resource. +type ConfigExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (ConfigExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: ConfigType, + Aliases: []resource.Type{}, + DefaultNamespace: Namespace, + PrintColumns: []meta.PrintColumn{}, + Sensitivity: meta.Sensitive, + } +} diff --git a/client/pkg/omni/resources/siderolink/connection_params.go b/client/pkg/omni/resources/siderolink/connection_params.go new file mode 100644 index 00000000..0b326a45 --- /dev/null +++ b/client/pkg/omni/resources/siderolink/connection_params.go @@ -0,0 +1,61 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package siderolink + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" +) + +// NewConnectionParams creates new ConnectionParams state. +func NewConnectionParams(ns, id string) *ConnectionParams { + return typed.NewResource[ConnectionParamsSpec, ConnectionParamsExtension]( + resource.NewMetadata(ns, ConnectionParamsType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.ConnectionParamsSpec{}), + ) +} + +// ConnectionParamsType is the type of ConnectionParams resource. +// +// tsgen:ConnectionParamsType +const ConnectionParamsType = resource.Type("ConnectionParams.omni.sidero.dev") + +// ConnectionParams resource keeps generated kernel arguments as a resource. +// +// ConnectionParams resource ID is a machine UUID. +type ConnectionParams = typed.Resource[ConnectionParamsSpec, ConnectionParamsExtension] + +// ConnectionParamsSpec wraps specs.ConnectionParamsSpec. +type ConnectionParamsSpec = protobuf.ResourceSpec[specs.ConnectionParamsSpec, *specs.ConnectionParamsSpec] + +// ConnectionParamsExtension providers auxiliary methods for ConnectionParams resource. +type ConnectionParamsExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (ConnectionParamsExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: ConnectionParamsType, + Aliases: []resource.Type{}, + DefaultNamespace: Namespace, + PrintColumns: []meta.PrintColumn{ + { + Name: "JoinToken", + JSONPath: "{.jointoken}", + }, + { + Name: "API", + JSONPath: "{.apiendpoint}", + }, + { + Name: "Wireguard", + JSONPath: "{.wireguardendpoint}", + }, + }, + } +} diff --git a/client/pkg/omni/resources/siderolink/link.go b/client/pkg/omni/resources/siderolink/link.go new file mode 100644 index 00000000..e007812d --- /dev/null +++ b/client/pkg/omni/resources/siderolink/link.go @@ -0,0 +1,57 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package siderolink + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" +) + +// NewLink creates new Link state. +func NewLink(ns, id string, spec *specs.SiderolinkSpec) *Link { + return typed.NewResource[LinkSpec, LinkExtension]( + resource.NewMetadata(ns, LinkType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(spec), + ) +} + +// LinkType is the type of Link resource. +// +// tsgen:SiderolinkResourceType +const LinkType = resource.Type("Links.omni.sidero.dev") + +// Link resource keeps connected nodes state. +// +// Link resource ID is a machine UUID. +type Link = typed.Resource[LinkSpec, LinkExtension] + +// LinkSpec wraps specs.SiderolinkSpec. +type LinkSpec = protobuf.ResourceSpec[specs.SiderolinkSpec, *specs.SiderolinkSpec] + +// LinkExtension providers auxiliary methods for Link resource. +type LinkExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (LinkExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: LinkType, + Aliases: []resource.Type{}, + DefaultNamespace: Namespace, + PrintColumns: []meta.PrintColumn{ + { + Name: "Connected", + JSONPath: "{.connected}", + }, + { + Name: "LastEndpoint", + JSONPath: "{.lastendpoint}", + }, + }, + } +} diff --git a/client/pkg/omni/resources/siderolink/linkcounter.go b/client/pkg/omni/resources/siderolink/linkcounter.go new file mode 100644 index 00000000..615f4334 --- /dev/null +++ b/client/pkg/omni/resources/siderolink/linkcounter.go @@ -0,0 +1,55 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package siderolink + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" +) + +// NOTE: This resources is not used anymore, but still used in the migration code. + +// NewDeprecatedLinkCounter creates new LinkCounter state. +func NewDeprecatedLinkCounter(ns, id string) *DeprecatedLinkCounter { + return typed.NewResource[DeprecatedLinkCounterSpec, DeprecatedLinkCounterExtension]( + resource.NewMetadata(ns, DeprecatedLinkCounterType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.SiderolinkCounterSpec{}), + ) +} + +// DeprecatedLinkCounterType is the type of LinkCounter resource. +const DeprecatedLinkCounterType = resource.Type("LinkCounters.omni.sidero.dev") + +// DeprecatedLinkCounter resource was removed, but still used only in the migration code. +type DeprecatedLinkCounter = typed.Resource[DeprecatedLinkCounterSpec, DeprecatedLinkCounterExtension] + +// DeprecatedLinkCounterSpec wraps specs.SiderolinkSpec. +type DeprecatedLinkCounterSpec = protobuf.ResourceSpec[specs.SiderolinkCounterSpec, *specs.SiderolinkCounterSpec] + +// DeprecatedLinkCounterExtension providers auxiliary methods for LinkCounter resource. +type DeprecatedLinkCounterExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (DeprecatedLinkCounterExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: DeprecatedLinkCounterType, + Aliases: []resource.Type{}, + DefaultNamespace: CounterNamespace, + PrintColumns: []meta.PrintColumn{ + { + Name: "RX", + JSONPath: "{.bytesreceived}", + }, + { + Name: "TX", + JSONPath: "{.bytessent}", + }, + }, + } +} diff --git a/client/pkg/omni/resources/siderolink/siderolink.go b/client/pkg/omni/resources/siderolink/siderolink.go new file mode 100644 index 00000000..9e455298 --- /dev/null +++ b/client/pkg/omni/resources/siderolink/siderolink.go @@ -0,0 +1,28 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +// Package siderolink contains SideroLink controller resources. +package siderolink + +import ( + "github.com/siderolabs/omni/client/pkg/omni/resources" + "github.com/siderolabs/omni/client/pkg/omni/resources/registry" +) + +// Namespace is the default namespace for the SideroLink resources. +const Namespace = resources.DefaultNamespace + +// CounterNamespace is the default namespace for the SideroLink counter resources. +// +// tsgen:SiderolinkCounterNamespace +const CounterNamespace = resources.MetricsNamespace + +func init() { + registry.MustRegisterResource(ConnectionParamsType, &ConnectionParams{}) + registry.MustRegisterResource(ConfigType, &Config{}) + registry.MustRegisterResource(LinkType, &Link{}) + + // NOTE: this resource is not used anymore, but still used in the migration code. + registry.MustRegisterResource(DeprecatedLinkCounterType, &DeprecatedLinkCounter{}) +} diff --git a/client/pkg/omni/resources/system/cert_refresh_tick.go b/client/pkg/omni/resources/system/cert_refresh_tick.go new file mode 100644 index 00000000..19399706 --- /dev/null +++ b/client/pkg/omni/resources/system/cert_refresh_tick.go @@ -0,0 +1,44 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package system + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewCertRefreshTick creates new CertRefreshTick state. +func NewCertRefreshTick(ns, id string) *CertRefreshTick { + return typed.NewResource[CertRefreshTickSpec, CertRefreshTickExtension]( + resource.NewMetadata(ns, CertRefreshTickType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.CertRefreshTickSpec{}), + ) +} + +// CertRefreshTickType is the type of CertRefreshTick resource. +const CertRefreshTickType = resource.Type("CertRefreshTicks.system.sidero.dev") + +// CertRefreshTick resource is created when it's time to refresh the certificates. +type CertRefreshTick = typed.Resource[CertRefreshTickSpec, CertRefreshTickExtension] + +// CertRefreshTickSpec wraps specs.CertRefreshTickSpec. +type CertRefreshTickSpec = protobuf.ResourceSpec[specs.CertRefreshTickSpec, *specs.CertRefreshTickSpec] + +// CertRefreshTickExtension providers auxiliary methods for CertRefreshTick resource. +type CertRefreshTickExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (CertRefreshTickExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: CertRefreshTickType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.EphemeralNamespace, + } +} diff --git a/client/pkg/omni/resources/system/dbversion.go b/client/pkg/omni/resources/system/dbversion.go new file mode 100644 index 00000000..00967398 --- /dev/null +++ b/client/pkg/omni/resources/system/dbversion.go @@ -0,0 +1,48 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package system + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewDBVersion creates new DBVersion state. +func NewDBVersion(ns, id string) *DBVersion { + return typed.NewResource[DBVersionSpec, DBVersionExtension]( + resource.NewMetadata(ns, DBVersionType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.DBVersionSpec{}), + ) +} + +const ( + // DBVersionType is the type of DBVersion resource. + DBVersionType = resource.Type("DBVersions.system.sidero.dev") + // DBVersionID is the single resource id. + DBVersionID = resource.ID("current") +) + +// DBVersion resource describes current DB version (migrations state). +type DBVersion = typed.Resource[DBVersionSpec, DBVersionExtension] + +// DBVersionSpec wraps specs.DBVersionSpec. +type DBVersionSpec = protobuf.ResourceSpec[specs.DBVersionSpec, *specs.DBVersionSpec] + +// DBVersionExtension providers auxiliary methods for DBVersion resource. +type DBVersionExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (DBVersionExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: DBVersionType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.DefaultNamespace, + } +} diff --git a/client/pkg/omni/resources/system/system.go b/client/pkg/omni/resources/system/system.go new file mode 100644 index 00000000..dd593492 --- /dev/null +++ b/client/pkg/omni/resources/system/system.go @@ -0,0 +1,14 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +// Package system provides resources related to the DB state itself. +package system + +import "github.com/siderolabs/omni/client/pkg/omni/resources/registry" + +func init() { + registry.MustRegisterResource(CertRefreshTickType, &CertRefreshTick{}) + registry.MustRegisterResource(DBVersionType, &DBVersion{}) + registry.MustRegisterResource(SysVersionType, &SysVersion{}) +} diff --git a/client/pkg/omni/resources/system/sysversion.go b/client/pkg/omni/resources/system/sysversion.go new file mode 100644 index 00000000..f22101f8 --- /dev/null +++ b/client/pkg/omni/resources/system/sysversion.go @@ -0,0 +1,52 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package system + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewSysVersion creates new SysVersion state. +func NewSysVersion(ns, id string) *SysVersion { + return typed.NewResource[SysVersionSpec, SysVersionExtension]( + resource.NewMetadata(ns, SysVersionType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.SysVersionSpec{}), + ) +} + +const ( + // SysVersionType is the type of SysVersion resource. + // + // tsgen:SysVersionType + SysVersionType = resource.Type("SysVersions.system.sidero.dev") + // SysVersionID is the single resource id. + // + // tsgen:SysVersionID + SysVersionID = resource.ID("current") +) + +// SysVersion resource describes current DB SysVersion (migrations state). +type SysVersion = typed.Resource[SysVersionSpec, SysVersionExtension] + +// SysVersionSpec wraps specs.SysVersionSpec. +type SysVersionSpec = protobuf.ResourceSpec[specs.SysVersionSpec, *specs.SysVersionSpec] + +// SysVersionExtension providers auxiliary methods for SysVersion resource. +type SysVersionExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (SysVersionExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: SysVersionType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.EphemeralNamespace, + } +} diff --git a/client/pkg/omni/resources/virtual/cluster_permissions.go b/client/pkg/omni/resources/virtual/cluster_permissions.go new file mode 100644 index 00000000..714198bd --- /dev/null +++ b/client/pkg/omni/resources/virtual/cluster_permissions.go @@ -0,0 +1,49 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package virtual + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewClusterPermissions creates a new ClusterPermissions resource. +func NewClusterPermissions(id resource.ID) *ClusterPermissions { + return typed.NewResource[ClusterPermissionsSpec, ClusterPermissionsExtension]( + resource.NewMetadata(resources.VirtualNamespace, ClusterPermissionsType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.ClusterPermissionsSpec{}), + ) +} + +const ( + // ClusterPermissionsType is the type of ClusterPermissions resource. + // + // tsgen:ClusterPermissionsType + ClusterPermissionsType = resource.Type("ClusterPermissions.omni.sidero.dev") +) + +// ClusterPermissions resource describes a user's set of permissions on a cluster. +type ClusterPermissions = typed.Resource[ClusterPermissionsSpec, ClusterPermissionsExtension] + +// ClusterPermissionsSpec wraps specs.ClusterPermissionsSpec. +type ClusterPermissionsSpec = protobuf.ResourceSpec[specs.ClusterPermissionsSpec, *specs.ClusterPermissionsSpec] + +// ClusterPermissionsExtension providers auxiliary methods for ClusterPermissions resource. +type ClusterPermissionsExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (ClusterPermissionsExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: ClusterPermissionsType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.VirtualNamespace, + PrintColumns: []meta.PrintColumn{}, + } +} diff --git a/client/pkg/omni/resources/virtual/current_user.go b/client/pkg/omni/resources/virtual/current_user.go new file mode 100644 index 00000000..357bc132 --- /dev/null +++ b/client/pkg/omni/resources/virtual/current_user.go @@ -0,0 +1,63 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package virtual + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// CurrentUserID is the default and the only allowed ID for CurrentUser resource. +// +// tsgen:CurrentUserID +const CurrentUserID = "current" + +// NewCurrentUser creates a new CurrentUser resource. +func NewCurrentUser() *CurrentUser { + return typed.NewResource[CurrentUserSpec, CurrentUserExtension]( + resource.NewMetadata(resources.VirtualNamespace, CurrentUserType, CurrentUserID, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.CurrentUserSpec{}), + ) +} + +const ( + // CurrentUserType is the type of CurrentUser resource. + // + // tsgen:CurrentUserType + CurrentUserType = resource.Type("CurrentUsers.omni.sidero.dev") +) + +// CurrentUser resource describes a user current user. +type CurrentUser = typed.Resource[CurrentUserSpec, CurrentUserExtension] + +// CurrentUserSpec wraps specs.CurrentUserSpec. +type CurrentUserSpec = protobuf.ResourceSpec[specs.CurrentUserSpec, *specs.CurrentUserSpec] + +// CurrentUserExtension providers auxiliary methods for CurrentUser resource. +type CurrentUserExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (CurrentUserExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: CurrentUserType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.VirtualNamespace, + PrintColumns: []meta.PrintColumn{ + { + Name: "Identity", + JSONPath: "{.identity}", + }, + { + Name: "Role", + JSONPath: "{.role}", + }, + }, + } +} diff --git a/client/pkg/omni/resources/virtual/kubernetes_usage.go b/client/pkg/omni/resources/virtual/kubernetes_usage.go new file mode 100644 index 00000000..a48b559d --- /dev/null +++ b/client/pkg/omni/resources/virtual/kubernetes_usage.go @@ -0,0 +1,47 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package virtual + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +// NewKubernetesUsage creates new Kubernetes usage resource. +func NewKubernetesUsage(ns, id string) *KubernetesUsage { + return typed.NewResource[KubernetesUsageSpec, KubernetesUsageExtension]( + resource.NewMetadata(ns, KubernetesUsageType, id, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.KubernetesUsageSpec{}), + ) +} + +// KubernetesUsageType is a resource type that contains kubernetes resource usage info. +// +// tsgen:KubernetesUsageType +const KubernetesUsageType = resource.Type("KubernetesUsages.omni.sidero.dev") + +// KubernetesUsage is a resource type that contains the state of Kubernetes components in the cluster. +type KubernetesUsage = typed.Resource[KubernetesUsageSpec, KubernetesUsageExtension] + +// KubernetesUsageSpec wraps specs.KubernetesUsageSpec. +type KubernetesUsageSpec = protobuf.ResourceSpec[specs.KubernetesUsageSpec, *specs.KubernetesUsageSpec] + +// KubernetesUsageExtension providers auxiliary methods for KubernetesUsage resource. +type KubernetesUsageExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (KubernetesUsageExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: KubernetesUsageType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.VirtualNamespace, + PrintColumns: []meta.PrintColumn{}, + } +} diff --git a/client/pkg/omni/resources/virtual/permissions.go b/client/pkg/omni/resources/virtual/permissions.go new file mode 100644 index 00000000..fb70eb3a --- /dev/null +++ b/client/pkg/omni/resources/virtual/permissions.go @@ -0,0 +1,56 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package virtual + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" +) + +const ( + // PermissionsID is the ID of Permissions resource. + // + // tsgen:PermissionsID + PermissionsID resource.ID = "permissions" +) + +// NewPermissions creates a new Permissions resource. +func NewPermissions() *Permissions { + return typed.NewResource[PermissionsSpec, PermissionsExtension]( + resource.NewMetadata(resources.VirtualNamespace, PermissionsType, PermissionsID, resource.VersionUndefined), + protobuf.NewResourceSpec(&specs.PermissionsSpec{}), + ) +} + +const ( + // PermissionsType is the type of Permissions resource. + // + // tsgen:PermissionsType + PermissionsType = resource.Type("Permissions.omni.sidero.dev") +) + +// Permissions resource describes a user's global set of permissions. +type Permissions = typed.Resource[PermissionsSpec, PermissionsExtension] + +// PermissionsSpec wraps specs.PermissionsSpec. +type PermissionsSpec = protobuf.ResourceSpec[specs.PermissionsSpec, *specs.PermissionsSpec] + +// PermissionsExtension providers auxiliary methods for Permissions resource. +type PermissionsExtension struct{} + +// ResourceDefinition implements [typed.Extension] interface. +func (PermissionsExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: PermissionsType, + Aliases: []resource.Type{}, + DefaultNamespace: resources.VirtualNamespace, + PrintColumns: []meta.PrintColumn{}, + } +} diff --git a/client/pkg/omni/resources/virtual/virtual.go b/client/pkg/omni/resources/virtual/virtual.go new file mode 100644 index 00000000..532df54a --- /dev/null +++ b/client/pkg/omni/resources/virtual/virtual.go @@ -0,0 +1,15 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +// Package virtual contains virtual resources. +package virtual + +import "github.com/siderolabs/omni/client/pkg/omni/resources/registry" + +func init() { + registry.MustRegisterResource(CurrentUserType, &CurrentUser{}) + registry.MustRegisterResource(ClusterPermissionsType, &ClusterPermissions{}) + registry.MustRegisterResource(KubernetesUsageType, &KubernetesUsage{}) + registry.MustRegisterResource(PermissionsType, &Permissions{}) +} diff --git a/client/pkg/omnictl/apply.go b/client/pkg/omnictl/apply.go new file mode 100644 index 00000000..3c57bb6b --- /dev/null +++ b/client/pkg/omnictl/apply.go @@ -0,0 +1,176 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omnictl + +import ( + "bytes" + "context" + "errors" + "fmt" + "io" + "os" + + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/state" + "github.com/sergi/go-diff/diffmatchpatch" + "github.com/siderolabs/gen/ensure" + "github.com/spf13/cobra" + "gopkg.in/yaml.v3" + + "github.com/siderolabs/omni/client/pkg/client" + "github.com/siderolabs/omni/client/pkg/omnictl/internal/access" +) + +var applyCmdFlags struct { + resFile string + options options +} + +// applyCmd represents apply config command. +var applyCmd = &cobra.Command{ + Use: "apply", + Short: "Create or update resource using YAML file as an input", + Args: cobra.NoArgs, + RunE: func(*cobra.Command, []string) error { + yamlRaw, err := os.ReadFile(applyCmdFlags.resFile) + if err != nil { + return fmt.Errorf("failed to read resource yaml file %q: %w", applyCmdFlags.resFile, err) + } + + if applyCmdFlags.options.dryRun { + applyCmdFlags.options.verbose = true + } + + return access.WithClient(applyConfig(yamlRaw)) + }, +} + +func applyConfig(yamlRaw []byte) func(ctx context.Context, client *client.Client) error { + return func(ctx context.Context, client *client.Client) error { + st := client.Omni().State() + dec := yaml.NewDecoder(bytes.NewReader(yamlRaw)) + + var resources []resource.Resource + + for { + var res protobuf.YAMLResource + + err := dec.Decode(&res) + if errors.Is(err, io.EOF) { + break + } + + if err != nil { + return err + } + + resources = append(resources, res.Resource()) + } + + for _, res := range resources { + got, err := st.Get(ctx, res.Metadata()) + if err != nil && !state.IsNotFoundError(err) { + return fmt.Errorf("failed to get resource '%s' '%s': %w", res.Metadata().ID(), res.Metadata().Type(), err) + } + + if state.IsNotFoundError(err) { + err = createResource(ctx, st, res, applyCmdFlags.options) + if err != nil { + return err + } + + continue + } + + err = updateResource(ctx, st, got, res, applyCmdFlags.options) + if err != nil { + return fmt.Errorf("failed to update resource '%s' '%s': %w", res.Metadata().ID(), res.Metadata().Type(), err) + } + } + + return nil + } +} + +type options struct { + dryRun bool + verbose bool +} + +func createResource(ctx context.Context, st state.State, res resource.Resource, opts options) error { + if opts.verbose { + out, err := marshalResource(res) + if err != nil { + return err + } + + fmt.Printf("Creating resource '%s'\n\n%s\n\n", res.Metadata().ID(), out) + } + + if opts.dryRun { + return nil + } + + if err := st.Create(ctx, res); err != nil { + return fmt.Errorf("failed to create resource '%s' '%s': %w", res.Metadata().ID(), res.Metadata().Type(), err) + } + + return nil +} + +func updateResource(ctx context.Context, st state.State, got resource.Resource, res resource.Resource, opts options) error { + if opts.verbose { + outGot, err := marshalResource(got) + if err != nil { + return err + } + + outRes, err := marshalResource(res) + if err != nil { + return err + } + + dmp := diffmatchpatch.New() + diffs := dmp.DiffMain(outGot, outRes, false) + + fmt.Printf("Updating resource '%s'\n\n%s\n\n", res.Metadata().ID(), dmp.DiffPrettyText(diffs)) + } + + if opts.dryRun { + return nil + } + + res.Metadata().SetVersion(got.Metadata().Version()) + + if err := st.Update(ctx, res); err != nil { + return fmt.Errorf("failed to update resource '%s' '%s': %w", res.Metadata().ID(), res.Metadata().Type(), err) + } + + return nil +} + +func marshalResource(res resource.Resource) (string, error) { + yamlRes, err := resource.MarshalYAML(res) + if err != nil { + return "", fmt.Errorf("failed to marshal resource '%s' '%s': %w", res.Metadata().ID(), res.Metadata().Type(), err) + } + + out, err := yaml.Marshal(yamlRes) + if err != nil { + return "", fmt.Errorf("failed to marshal resource '%s' '%s': %w", res.Metadata().ID(), res.Metadata().Type(), err) + } + + return string(out), nil +} + +func init() { + applyCmd.PersistentFlags().StringVarP(&applyCmdFlags.resFile, "file", "f", "", "Resource file to load and apply") + applyCmd.PersistentFlags().BoolVarP(&applyCmdFlags.options.verbose, "verbose", "v", false, "Verbose output") + applyCmd.PersistentFlags().BoolVarP(&applyCmdFlags.options.dryRun, "dry-run", "d", false, "Dry run, implies verbose") + ensure.NoError(applyCmd.MarkPersistentFlagRequired("file")) + + RootCmd.AddCommand(applyCmd) +} diff --git a/client/pkg/omnictl/cluster.go b/client/pkg/omnictl/cluster.go new file mode 100644 index 00000000..6e2a575c --- /dev/null +++ b/client/pkg/omnictl/cluster.go @@ -0,0 +1,11 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omnictl + +import "github.com/siderolabs/omni/client/pkg/omnictl/cluster" + +func init() { + RootCmd.AddCommand(cluster.RootCmd()) +} diff --git a/client/pkg/omnictl/cluster/cluster.go b/client/pkg/omnictl/cluster/cluster.go new file mode 100644 index 00000000..81aca4a5 --- /dev/null +++ b/client/pkg/omnictl/cluster/cluster.go @@ -0,0 +1,32 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +// Package cluster contains commands related to cluster operations. +package cluster + +import ( + "github.com/spf13/cobra" + + "github.com/siderolabs/omni/client/pkg/omnictl/cluster/kubernetes" + "github.com/siderolabs/omni/client/pkg/omnictl/cluster/template" +) + +// clusterCmd represents the cluster sub-command. +var clusterCmd = &cobra.Command{ + Use: "cluster", + Aliases: []string{"c"}, + Short: "Cluster-related subcommands.", + Long: `Commands to destroy clusters and manage cluster templates.`, + Example: "", +} + +// RootCmd exposes root cluster command. +func RootCmd() *cobra.Command { + return clusterCmd +} + +func init() { + clusterCmd.AddCommand(template.RootCmd()) + clusterCmd.AddCommand(kubernetes.RootCmd()) +} diff --git a/client/pkg/omnictl/cluster/delete.go b/client/pkg/omnictl/cluster/delete.go new file mode 100644 index 00000000..53f35844 --- /dev/null +++ b/client/pkg/omnictl/cluster/delete.go @@ -0,0 +1,45 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package cluster + +import ( + "context" + "os" + + "github.com/spf13/cobra" + + "github.com/siderolabs/omni/client/pkg/client" + "github.com/siderolabs/omni/client/pkg/omnictl/internal/access" + "github.com/siderolabs/omni/client/pkg/template/operations" +) + +var deleteCmdFlags struct { + options operations.SyncOptions +} + +// deleteCmd represents the cluster delete command. +var deleteCmd = &cobra.Command{ + Use: "delete cluster-name", + Short: "Delete all cluster resources.", + Long: `Delete all resources related to the cluster. The command waits for the cluster to be fully destroyed.`, + Example: "", + Args: cobra.ExactArgs(1), + RunE: func(_ *cobra.Command, args []string) error { + return access.WithClient(deleteImpl(args[0])) + }, +} + +func deleteImpl(clusterName string) func(ctx context.Context, client *client.Client) error { + return func(ctx context.Context, client *client.Client) error { + return operations.DeleteCluster(ctx, clusterName, os.Stdout, client.Omni().State(), deleteCmdFlags.options) + } +} + +func init() { + deleteCmd.PersistentFlags().BoolVarP(&deleteCmdFlags.options.Verbose, "verbose", "v", false, "verbose output (show diff for each resource)") + deleteCmd.PersistentFlags().BoolVarP(&deleteCmdFlags.options.DryRun, "dry-run", "d", false, "dry run") + deleteCmd.PersistentFlags().BoolVar(&deleteCmdFlags.options.DestroyMachines, "destroy-disconnected-machines", false, "removes all disconnected machines which are part of the cluster from Omni") + clusterCmd.AddCommand(deleteCmd) +} diff --git a/client/pkg/omnictl/cluster/kubernetes/kubernetes.go b/client/pkg/omnictl/cluster/kubernetes/kubernetes.go new file mode 100644 index 00000000..fd561b43 --- /dev/null +++ b/client/pkg/omnictl/cluster/kubernetes/kubernetes.go @@ -0,0 +1,24 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +// Package kubernetes contains commands related to cluster Kubernetes operations. +package kubernetes + +import ( + "github.com/spf13/cobra" +) + +// kubernetesCmd represents the kubernetes sub-command. +var kubernetesCmd = &cobra.Command{ + Use: "kubernetes", + Aliases: []string{"k"}, + Short: "Cluster Kubernetes management subcommands.", + Long: `Commands to render, validate, manage cluster templates.`, + Example: "", +} + +// RootCmd exports kubernetesCmd. +func RootCmd() *cobra.Command { + return kubernetesCmd +} diff --git a/client/pkg/omnictl/cluster/kubernetes/manifest-sync.go b/client/pkg/omnictl/cluster/kubernetes/manifest-sync.go new file mode 100644 index 00000000..d3155e7c --- /dev/null +++ b/client/pkg/omnictl/cluster/kubernetes/manifest-sync.go @@ -0,0 +1,68 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package kubernetes + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + + "github.com/siderolabs/omni/client/api/omni/management" + "github.com/siderolabs/omni/client/pkg/client" + "github.com/siderolabs/omni/client/pkg/omnictl/internal/access" +) + +var manifestSyncCmdFlags struct { + dryRun bool +} + +// manifestSyncCmd represents the cluster kubernetes manifest-sync command. +var manifestSyncCmd = &cobra.Command{ + Use: "manifest-sync cluster-name", + Short: "Sync Kubernetes bootstrap manifests from Talos controlplane nodes to Kubernetes API.", + Long: `Sync Kubernetes bootstrap manifests from Talos controlplane nodes to Kubernetes API. +Bootstrap manifests might be updated with Talos version update, Kubernetes upgrade, and config patching. +Talos never updates or deletes Kubernetes manifests, so this command fills the gap to keep manifests up-to-date.`, + Example: "", + Args: cobra.ExactArgs(1), + RunE: func(_ *cobra.Command, args []string) error { + return access.WithClient(manifestSync(args[0])) + }, +} + +func manifestSync(clusterName string) func(ctx context.Context, client *client.Client) error { + return func(ctx context.Context, client *client.Client) error { + handler := func(resp *management.KubernetesSyncManifestResponse) error { + switch resp.ResponseType { + case management.KubernetesSyncManifestResponse_UNKNOWN: + case management.KubernetesSyncManifestResponse_MANIFEST: + fmt.Printf(" > processing manifest %s\n", resp.Path) + + switch { + case resp.Skipped: + fmt.Println(" < no changes") + case manifestSyncCmdFlags.dryRun: + fmt.Println(resp.Diff) + fmt.Println(" < dry run, change skipped") + case !manifestSyncCmdFlags.dryRun: + fmt.Println(resp.Diff) + fmt.Println(" < applied successfully") + } + case management.KubernetesSyncManifestResponse_ROLLOUT: + fmt.Printf(" > waiting for %s\n", resp.Path) + } + + return nil + } + + return client.Management().WithCluster(clusterName).KubernetesSyncManifests(ctx, manifestSyncCmdFlags.dryRun, handler) + } +} + +func init() { + manifestSyncCmd.Flags().BoolVar(&manifestSyncCmdFlags.dryRun, "dry-run", true, "don't actually sync manifests, just print what would be done") + kubernetesCmd.AddCommand(manifestSyncCmd) +} diff --git a/client/pkg/omnictl/cluster/kubernetes/upgrade-pre-checks.go b/client/pkg/omnictl/cluster/kubernetes/upgrade-pre-checks.go new file mode 100644 index 00000000..868aae37 --- /dev/null +++ b/client/pkg/omnictl/cluster/kubernetes/upgrade-pre-checks.go @@ -0,0 +1,43 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package kubernetes + +import ( + "context" + + "github.com/siderolabs/gen/ensure" + "github.com/spf13/cobra" + + "github.com/siderolabs/omni/client/pkg/client" + "github.com/siderolabs/omni/client/pkg/omnictl/internal/access" +) + +var upgradePreChecksCmdFlags struct { + toVersion string +} + +// upgradePreChecksCmd represents the cluster kubernetes upgrade-pre-checks command. +var upgradePreChecksCmd = &cobra.Command{ + Use: "upgrade-pre-checks cluster-name", + Short: "Run Kubernetes upgrade pre-checks for the cluster.", + Long: `Verify that upgrading Kubernetes version is available for the cluster: version compatibility, deprecated APIs, etc.`, + Example: "", + Args: cobra.ExactArgs(1), + RunE: func(_ *cobra.Command, args []string) error { + return access.WithClient(upgradePreChecks(args[0])) + }, +} + +func upgradePreChecks(clusterName string) func(ctx context.Context, client *client.Client) error { + return func(ctx context.Context, client *client.Client) error { + return client.Management().WithCluster(clusterName).KubernetesUpgradePreChecks(ctx, upgradePreChecksCmdFlags.toVersion) + } +} + +func init() { + upgradePreChecksCmd.Flags().StringVar(&upgradePreChecksCmdFlags.toVersion, "to", "", "target Kubernetes version for the planned upgrade") + ensure.NoError(upgradePreChecksCmd.MarkFlagRequired("to")) + kubernetesCmd.AddCommand(upgradePreChecksCmd) +} diff --git a/client/pkg/omnictl/cluster/machine.go b/client/pkg/omnictl/cluster/machine.go new file mode 100644 index 00000000..afbc7406 --- /dev/null +++ b/client/pkg/omnictl/cluster/machine.go @@ -0,0 +1,79 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package cluster + +import ( + "context" + "fmt" + + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/safe" + "github.com/cosi-project/runtime/pkg/state" + "github.com/spf13/cobra" + + "github.com/siderolabs/omni/client/pkg/client" + "github.com/siderolabs/omni/client/pkg/omni/resources" + "github.com/siderolabs/omni/client/pkg/omni/resources/omni" + "github.com/siderolabs/omni/client/pkg/omnictl/internal/access" +) + +var lockCmd = &cobra.Command{ + Use: "lock machine-id", + Short: "Lock the machine", + Long: `When locked, no config updates, upgrades and downgrades will be performed on the machine.`, + Args: cobra.ExactArgs(1), + RunE: func(_ *cobra.Command, args []string) error { + return access.WithClient(setLocked(args[0], true)) + }, +} + +var unlockCmd = &cobra.Command{ + Use: "unlock machine-id", + Short: "Unlock the machine", + Long: `Removes locked annotation from the machine.`, + Args: cobra.ExactArgs(1), + RunE: func(_ *cobra.Command, args []string) error { + return access.WithClient(setLocked(args[0], false)) + }, +} + +func setLocked(machineID resource.ID, lock bool) func(context.Context, *client.Client) error { + return func(ctx context.Context, client *client.Client) error { + st := client.Omni().State() + + machineSetNode, err := safe.StateGet[*omni.MachineSetNode](ctx, st, resource.NewMetadata(resources.DefaultNamespace, omni.MachineSetNodeType, machineID, resource.VersionUndefined)) + if err != nil { + if state.IsNotFoundError(err) { + fmt.Printf("no machine set nodes with id %q found", machineID) + } + } + + _, err = safe.StateUpdateWithConflicts(ctx, st, machineSetNode.Metadata(), func(res *omni.MachineSetNode) error { + if lock { + res.Metadata().Annotations().Set(omni.MachineLocked, "") + } else { + res.Metadata().Annotations().Delete(omni.MachineLocked) + } + + return nil + }) + + return err + } +} + +// machineCmd represents the cluster machine commands. +var machineCmd = &cobra.Command{ + Use: "machine", + Short: "Machine related commands.", + Long: `Commands to manage cluster machines.`, + Example: "", +} + +func init() { + machineCmd.AddCommand(lockCmd) + machineCmd.AddCommand(unlockCmd) + clusterCmd.AddCommand(machineCmd) +} diff --git a/client/pkg/omnictl/cluster/status.go b/client/pkg/omnictl/cluster/status.go new file mode 100644 index 00000000..764d92da --- /dev/null +++ b/client/pkg/omnictl/cluster/status.go @@ -0,0 +1,57 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package cluster + +import ( + "context" + "os" + "time" + + "github.com/spf13/cobra" + + "github.com/siderolabs/omni/client/pkg/client" + "github.com/siderolabs/omni/client/pkg/omnictl/internal/access" + "github.com/siderolabs/omni/client/pkg/template/operations" +) + +var statusCmdFlags struct { + options operations.StatusOptions + wait time.Duration +} + +// statusCmd represents the cluster status command. +var statusCmd = &cobra.Command{ + Use: "status cluster-name", + Short: "Show cluster status, wait for the cluster to be ready.", + Long: `Shows current cluster status, if the terminal supports it, watch the status as it updates. The command waits for the cluster to be ready by default.`, + Example: "", + Args: cobra.ExactArgs(1), + RunE: func(_ *cobra.Command, args []string) error { + return access.WithClient(status(args[0])) + }, +} + +func status(clusterName string) func(ctx context.Context, client *client.Client) error { + return func(ctx context.Context, client *client.Client) error { + if statusCmdFlags.wait > 0 { + var cancel context.CancelFunc + + ctx, cancel = context.WithTimeout(ctx, statusCmdFlags.wait) + defer cancel() + + statusCmdFlags.options.Wait = true + } else { + statusCmdFlags.options.Wait = false + } + + return operations.StatusCluster(ctx, clusterName, os.Stdout, client.Omni().State(), statusCmdFlags.options) + } +} + +func init() { + statusCmd.PersistentFlags().BoolVarP(&statusCmdFlags.options.Quiet, "quiet", "q", false, "suppress output") + statusCmd.PersistentFlags().DurationVarP(&statusCmdFlags.wait, "wait", "w", 5*time.Minute, "wait timeout, if zero, report current status and exit") + clusterCmd.AddCommand(statusCmd) +} diff --git a/client/pkg/omnictl/cluster/template/delete.go b/client/pkg/omnictl/cluster/template/delete.go new file mode 100644 index 00000000..7725d2db --- /dev/null +++ b/client/pkg/omnictl/cluster/template/delete.go @@ -0,0 +1,51 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package template + +import ( + "context" + "os" + + "github.com/spf13/cobra" + + "github.com/siderolabs/omni/client/pkg/client" + "github.com/siderolabs/omni/client/pkg/omnictl/internal/access" + "github.com/siderolabs/omni/client/pkg/template/operations" +) + +var deleteCmdFlags struct { + options operations.SyncOptions +} + +// deleteCmd represents the template delete command. +var deleteCmd = &cobra.Command{ + Use: "delete", + Short: "Delete all cluster template resources from Omni.", + Long: `Delete all resources related to the cluster template. This command requires API access.`, + Example: "", + Args: cobra.NoArgs, + RunE: func(*cobra.Command, []string) error { + return access.WithClient(deleteImpl) + }, +} + +func deleteImpl(ctx context.Context, client *client.Client) error { + f, err := os.Open(cmdFlags.TemplatePath) + if err != nil { + return err + } + + defer f.Close() //nolint:errcheck + + return operations.DeleteTemplate(ctx, f, os.Stdout, client.Omni().State(), deleteCmdFlags.options) +} + +func init() { + addRequiredFileFlag(deleteCmd) + deleteCmd.PersistentFlags().BoolVarP(&deleteCmdFlags.options.Verbose, "verbose", "v", false, "verbose output (show diff for each resource)") + deleteCmd.PersistentFlags().BoolVarP(&deleteCmdFlags.options.DryRun, "dry-run", "d", false, "dry run") + deleteCmd.PersistentFlags().BoolVar(&deleteCmdFlags.options.DestroyMachines, "destroy-disconnected-machines", false, "removes all disconnected machines which are part of the cluster from Omni") + templateCmd.AddCommand(deleteCmd) +} diff --git a/client/pkg/omnictl/cluster/template/diff.go b/client/pkg/omnictl/cluster/template/diff.go new file mode 100644 index 00000000..58c6b5e4 --- /dev/null +++ b/client/pkg/omnictl/cluster/template/diff.go @@ -0,0 +1,44 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package template + +import ( + "context" + "os" + + "github.com/spf13/cobra" + + "github.com/siderolabs/omni/client/pkg/client" + "github.com/siderolabs/omni/client/pkg/omnictl/internal/access" + "github.com/siderolabs/omni/client/pkg/template/operations" +) + +// diffCmd represents the template diff command. +var diffCmd = &cobra.Command{ + Use: "diff", + Short: "Show diff in resources if the template is synced.", + Long: `Query existing resources for the cluster and compare them with the resources generated from the template. This command requires API access.`, + Example: "", + Args: cobra.NoArgs, + RunE: func(*cobra.Command, []string) error { + return access.WithClient(diff) + }, +} + +func diff(ctx context.Context, client *client.Client) error { + f, err := os.Open(cmdFlags.TemplatePath) + if err != nil { + return err + } + + defer f.Close() //nolint:errcheck + + return operations.DiffTemplate(ctx, f, os.Stdout, client.Omni().State()) +} + +func init() { + addRequiredFileFlag(diffCmd) + templateCmd.AddCommand(diffCmd) +} diff --git a/client/pkg/omnictl/cluster/template/export.go b/client/pkg/omnictl/cluster/template/export.go new file mode 100644 index 00000000..4b4f6072 --- /dev/null +++ b/client/pkg/omnictl/cluster/template/export.go @@ -0,0 +1,70 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package template + +import ( + "context" + "errors" + "fmt" + "os" + + "github.com/siderolabs/gen/ensure" + "github.com/spf13/cobra" + + "github.com/siderolabs/omni/client/pkg/client" + "github.com/siderolabs/omni/client/pkg/omnictl/internal/access" + "github.com/siderolabs/omni/client/pkg/template/operations" +) + +var exportCmdFlags struct { + cluster string + output string + force bool +} + +// exportCmd represents the template export command. +var exportCmd = &cobra.Command{ + Use: "export cluster-name", + Short: "Export a cluster template from an existing cluster on Omni.", + Long: `Export a cluster template from an existing cluster on Omni. This command requires API access.`, + Args: cobra.NoArgs, + RunE: func(*cobra.Command, []string) error { + return access.WithClient(export) + }, +} + +func export(ctx context.Context, client *client.Client) (err error) { + output := os.Stdout + + if exportCmdFlags.output != "" { + var openErr error + + flags := os.O_WRONLY | os.O_CREATE | os.O_EXCL + if exportCmdFlags.force { + flags = os.O_WRONLY | os.O_CREATE | os.O_TRUNC + } + + output, openErr = os.OpenFile(exportCmdFlags.output, flags, 0o644) + if openErr != nil { + return fmt.Errorf("failed to open output file: %w", openErr) + } + + defer func() { err = errors.Join(err, output.Close()) }() + } + + _, err = operations.ExportTemplate(ctx, client.Omni().State(), exportCmdFlags.cluster, output) + + return err +} + +func init() { + exportCmd.Flags().StringVarP(&exportCmdFlags.cluster, "cluster", "c", "", "cluster name") + exportCmd.Flags().StringVarP(&exportCmdFlags.output, "output", "o", "", "output file (default: stdout)") + exportCmd.Flags().BoolVarP(&exportCmdFlags.force, "force", "f", false, "overwrite output file if it exists") + + ensure.NoError(exportCmd.MarkFlagRequired("cluster")) + + templateCmd.AddCommand(exportCmd) +} diff --git a/client/pkg/omnictl/cluster/template/render.go b/client/pkg/omnictl/cluster/template/render.go new file mode 100644 index 00000000..5beef44a --- /dev/null +++ b/client/pkg/omnictl/cluster/template/render.go @@ -0,0 +1,41 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package template + +import ( + "os" + + "github.com/spf13/cobra" + + "github.com/siderolabs/omni/client/pkg/template/operations" +) + +// renderCmd represents the template render command. +var renderCmd = &cobra.Command{ + Use: "render", + Short: "Render a cluster template to a set of resources.", + Long: `Validate template contents, convert to resources and output resources to stdout as YAML. This command is offline (doesn't access API).`, + Example: "", + Args: cobra.NoArgs, + RunE: func(*cobra.Command, []string) error { + return render() + }, +} + +func render() error { + f, err := os.Open(cmdFlags.TemplatePath) + if err != nil { + return err + } + + defer f.Close() //nolint:errcheck + + return operations.RenderTemplate(f, os.Stdout) +} + +func init() { + addRequiredFileFlag(renderCmd) + templateCmd.AddCommand(renderCmd) +} diff --git a/client/pkg/omnictl/cluster/template/status.go b/client/pkg/omnictl/cluster/template/status.go new file mode 100644 index 00000000..f57daf34 --- /dev/null +++ b/client/pkg/omnictl/cluster/template/status.go @@ -0,0 +1,63 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package template + +import ( + "context" + "os" + "time" + + "github.com/spf13/cobra" + + "github.com/siderolabs/omni/client/pkg/client" + "github.com/siderolabs/omni/client/pkg/omnictl/internal/access" + "github.com/siderolabs/omni/client/pkg/template/operations" +) + +var statusCmdFlags struct { + options operations.StatusOptions + wait time.Duration +} + +// statusCmd represents the cluster status command. +var statusCmd = &cobra.Command{ + Use: "status", + Short: "Show template cluster status, wait for the cluster to be ready.", + Long: `Shows current cluster status, if the terminal supports it, watch the status as it updates. The command waits for the cluster to be ready by default.`, + Example: "", + Args: cobra.NoArgs, + RunE: func(*cobra.Command, []string) error { + return access.WithClient(status) + }, +} + +func status(ctx context.Context, client *client.Client) error { + f, err := os.Open(cmdFlags.TemplatePath) + if err != nil { + return err + } + + defer f.Close() //nolint:errcheck + + if statusCmdFlags.wait > 0 { + var cancel context.CancelFunc + + ctx, cancel = context.WithTimeout(ctx, statusCmdFlags.wait) + defer cancel() + + statusCmdFlags.options.Wait = true + } else { + statusCmdFlags.options.Wait = false + } + + return operations.StatusTemplate(ctx, f, os.Stdout, client.Omni().State(), statusCmdFlags.options) +} + +func init() { + addRequiredFileFlag(statusCmd) + statusCmd.PersistentFlags().BoolVarP(&statusCmdFlags.options.Quiet, "quiet", "q", false, "suppress output") + statusCmd.PersistentFlags().DurationVarP(&statusCmdFlags.wait, "wait", "w", 5*time.Minute, "wait timeout, if zero, report current status and exit") + templateCmd.AddCommand(statusCmd) +} diff --git a/client/pkg/omnictl/cluster/template/sync.go b/client/pkg/omnictl/cluster/template/sync.go new file mode 100644 index 00000000..fbefefb8 --- /dev/null +++ b/client/pkg/omnictl/cluster/template/sync.go @@ -0,0 +1,50 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package template + +import ( + "context" + "os" + + "github.com/spf13/cobra" + + "github.com/siderolabs/omni/client/pkg/client" + "github.com/siderolabs/omni/client/pkg/omnictl/internal/access" + "github.com/siderolabs/omni/client/pkg/template/operations" +) + +var syncCmdFlags struct { + options operations.SyncOptions +} + +// syncCmd represents the template sync command. +var syncCmd = &cobra.Command{ + Use: "sync", + Short: "Apply template to the Omni.", + Long: `Query existing resources for the cluster and compare them with the resources generated from the template, create/update/delete resources as needed. This command requires API access.`, + Example: "", + Args: cobra.NoArgs, + RunE: func(*cobra.Command, []string) error { + return access.WithClient(sync) + }, +} + +func sync(ctx context.Context, client *client.Client) error { + f, err := os.Open(cmdFlags.TemplatePath) + if err != nil { + return err + } + + defer f.Close() //nolint:errcheck + + return operations.SyncTemplate(ctx, f, os.Stdout, client.Omni().State(), syncCmdFlags.options) +} + +func init() { + addRequiredFileFlag(syncCmd) + syncCmd.PersistentFlags().BoolVarP(&syncCmdFlags.options.Verbose, "verbose", "v", false, "verbose output (show diff for each resource)") + syncCmd.PersistentFlags().BoolVarP(&syncCmdFlags.options.DryRun, "dry-run", "d", false, "dry run") + templateCmd.AddCommand(syncCmd) +} diff --git a/client/pkg/omnictl/cluster/template/template.go b/client/pkg/omnictl/cluster/template/template.go new file mode 100644 index 00000000..5783bada --- /dev/null +++ b/client/pkg/omnictl/cluster/template/template.go @@ -0,0 +1,36 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +// Package template contains commands related to cluster template operations. +package template + +import ( + "github.com/siderolabs/gen/ensure" + "github.com/spf13/cobra" +) + +// cmdFlags contains shared cluster template flags. +var cmdFlags struct { + // Path to the cluster template file. + TemplatePath string +} + +// templateCmd represents the template sub-command. +var templateCmd = &cobra.Command{ + Use: "template", + Aliases: []string{"t"}, + Short: "Cluster template management subcommands.", + Long: `Commands to render, validate, manage cluster templates.`, + Example: "", +} + +// RootCmd exports templateCmd. +func RootCmd() *cobra.Command { + return templateCmd +} + +func addRequiredFileFlag(cmd *cobra.Command) { + cmd.PersistentFlags().StringVarP(&cmdFlags.TemplatePath, "file", "f", "", "path to the cluster template file.") + ensure.NoError(cmd.MarkPersistentFlagRequired("file")) +} diff --git a/client/pkg/omnictl/cluster/template/validate.go b/client/pkg/omnictl/cluster/template/validate.go new file mode 100644 index 00000000..5f22f634 --- /dev/null +++ b/client/pkg/omnictl/cluster/template/validate.go @@ -0,0 +1,41 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package template + +import ( + "os" + + "github.com/spf13/cobra" + + "github.com/siderolabs/omni/client/pkg/template/operations" +) + +// validateCmd represents the template validate command. +var validateCmd = &cobra.Command{ + Use: "validate", + Short: "Validate a cluster template.", + Long: `Validate that template contains valid structures, and there are no other warnings. This command is offline (doesn't access API).`, + Example: "", + Args: cobra.NoArgs, + RunE: func(*cobra.Command, []string) error { + return validate() + }, +} + +func validate() error { + f, err := os.Open(cmdFlags.TemplatePath) + if err != nil { + return err + } + + defer f.Close() //nolint:errcheck + + return operations.ValidateTemplate(f) +} + +func init() { + addRequiredFileFlag(validateCmd) + templateCmd.AddCommand(validateCmd) +} diff --git a/client/pkg/omnictl/common.go b/client/pkg/omnictl/common.go new file mode 100644 index 00000000..78ec8b75 --- /dev/null +++ b/client/pkg/omnictl/common.go @@ -0,0 +1,58 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +// Package omnictl ... +package omnictl + +import ( + "context" + "fmt" + "strings" + + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/safe" + "github.com/cosi-project/runtime/pkg/state" +) + +func resolveResourceType(ctx context.Context, st state.State, resourceType string) (*meta.ResourceDefinition, error) { + rds, err := safe.StateListAll[*meta.ResourceDefinition](ctx, st) + if err != nil { + return nil, err + } + + var matched []*meta.ResourceDefinition + + for it := rds.Iterator(); it.Next(); { + if strings.EqualFold(it.Value().Metadata().ID(), resourceType) { + matched = append(matched, it.Value()) + + continue + } + + spec := it.Value().TypedSpec() + + for _, alias := range spec.AllAliases { + if strings.EqualFold(alias, resourceType) { + matched = append(matched, it.Value()) + + break + } + } + } + + switch { + case len(matched) == 1: + return matched[0], nil + case len(matched) > 1: + matchedTypes := make([]string, 0, len(matched)) + + for _, rd := range matched { + matchedTypes = append(matchedTypes, rd.Metadata().ID()) + } + + return nil, fmt.Errorf("resource type %q is ambiguous: %v", resourceType, matchedTypes) + default: + return nil, fmt.Errorf("resource %q is not registered", resourceType) + } +} diff --git a/client/pkg/omnictl/config.go b/client/pkg/omnictl/config.go new file mode 100644 index 00000000..08397f6f --- /dev/null +++ b/client/pkg/omnictl/config.go @@ -0,0 +1,318 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omnictl + +import ( + "bytes" + "fmt" + "os" + "slices" + "strings" + "text/tabwriter" + "text/template" + + "github.com/siderolabs/gen/maps" + "github.com/spf13/cobra" + + "github.com/siderolabs/omni/client/pkg/omnictl/config" + "github.com/siderolabs/omni/client/pkg/omnictl/internal/access" +) + +// configCmd represents the config command. +var configCmd = &cobra.Command{ + Use: "config", + Short: "Manage the client configuration file (omniconfig)", + Long: ``, +} + +// configURLCmd represents the `config url` command. +var configURLCmd = &cobra.Command{ + Use: "url <url>", + Short: "Set the URL for the current context", + Long: ``, + Args: cobra.ExactArgs(1), + RunE: func(_ *cobra.Command, args []string) error { + conf, err := config.Init(access.CmdFlags.Omniconfig, false) + if err != nil { + return err + } + + context, err := conf.GetContext(access.CmdFlags.Context) + if err != nil { + return err + } + + context.URL = args[0] + + return conf.Save() + }, +} + +// configIdentityCmd represents the `config identity` command. +var configIdentityCmd = &cobra.Command{ + Use: "identity <identity>", + Short: "Set the auth identity for the current context", + Long: ``, + Args: cobra.ExactArgs(1), + RunE: func(_ *cobra.Command, args []string) error { + conf, err := config.Init(access.CmdFlags.Omniconfig, false) + if err != nil { + return err + } + + context, err := conf.GetContext(access.CmdFlags.Context) + if err != nil { + return err + } + + context.Auth.SideroV1.Identity = args[0] + + return conf.Save() + }, +} + +// configContextCmd represents the `config context` command. +var configContextCmd = &cobra.Command{ + Use: "context <context>", + Short: "Set the current context", + Aliases: []string{"use-context"}, + Long: ``, + Args: cobra.ExactArgs(1), + RunE: func(_ *cobra.Command, args []string) error { + conf, err := config.Init(access.CmdFlags.Omniconfig, false) + if err != nil { + return err + } + + context := args[0] + + conf.Context = context + + return conf.Save() + }, + ValidArgsFunction: CompleteConfigContext, +} + +// configAddCmdFlags represents the `config add` command flags. +var configAddCmdFlags struct { + url string + httpURL string + identity string +} + +// configAddCmd represents the `config add` command. +var configAddCmd = &cobra.Command{ + Use: "add <context>", + Short: "Add a new context", + Long: ``, + Args: cobra.ExactArgs(1), + RunE: func(_ *cobra.Command, args []string) error { + conf, err := config.Init(access.CmdFlags.Omniconfig, true) + if err != nil { + return err + } + + name := args[0] + + _, alreadyExists := conf.Contexts[name] + if alreadyExists { + return fmt.Errorf("context %s already exists", name) + } + + newContext := config.Context{ + URL: configAddCmdFlags.url, + Auth: config.Auth{ + SideroV1: config.SideroV1{ + Identity: configAddCmdFlags.identity, + }, + }, + } + + conf.Contexts[name] = &newContext + + return conf.Save() + }, +} + +// configGetContextsCmd represents the `config contexts` command. +var configGetContextsCmd = &cobra.Command{ + Use: "contexts", + Short: "List defined contexts", + Aliases: []string{"get-contexts"}, + Long: ``, + RunE: func(*cobra.Command, []string) error { + conf, err := config.Init(access.CmdFlags.Omniconfig, false) + if err != nil { + return err + } + + keys := maps.Keys(conf.Contexts) + slices.Sort(keys) + + w := tabwriter.NewWriter(os.Stdout, 0, 0, 3, ' ', 0) + defer w.Flush() //nolint:errcheck + + _, err = fmt.Fprintln(w, "CURRENT\tNAME\tURL") + if err != nil { + return err + } + + for _, name := range keys { + context := conf.Contexts[name] + + var current string + + if name == conf.Context { + current = "*" + } + + _, err = fmt.Fprintf(w, "%s\t%s\t%s\n", current, name, context.URL) + if err != nil { + return err + } + } + + return nil + }, +} + +// configMergeCmd represents the `config merge` command. +var configMergeCmd = &cobra.Command{ + Use: "merge <from>", + Short: "Merge additional contexts from another client configuration file", + Long: "Contexts with the same name are renamed while merging configs.", + Args: cobra.ExactArgs(1), + RunE: func(_ *cobra.Command, args []string) error { + conf, err := config.Init(access.CmdFlags.Omniconfig, true) + if err != nil { + return err + } + + renames, err := conf.Merge(args[0]) + if err != nil { + return err + } + + for _, rename := range renames { + fmt.Printf("renamed omniconfig context %s\n", rename.String()) + } + + return conf.Save() + }, +} + +// configNewCmdFlags represents the `config new` command flags. +var configNewCmdFlags struct { + url string + httpURL string + identity string +} + +// configNewCmd represents the `config new` command. +var configNewCmd = &cobra.Command{ + Use: "new [<path>]", + Short: "Generate a new client configuration file", + Args: cobra.RangeArgs(0, 1), + RunE: func(_ *cobra.Command, args []string) error { + path := "" + if len(args) > 0 { + path = args[0] + } + + conf, err := config.Init(path, true) + if err != nil { + return err + } + + context, err := conf.GetContext(access.CmdFlags.Context) + if err != nil { + return err + } + + context.URL = configNewCmdFlags.url + context.Auth.SideroV1.Identity = configNewCmdFlags.identity + + return conf.Save() + }, +} + +// configInfoCmdTemplate represents the `config info` command output template. +var configInfoCmdTemplate = template.Must(template.New("configInfoCmdTemplate"). + Option("missingkey=error"). + Parse(strings.TrimSpace(` +Current context: {{ .Context }} +URL: {{ .APIURL }} +Identity: {{ .Identity }} +`))) + +// configInfoCmd represents the `config info` command. +var configInfoCmd = &cobra.Command{ + Use: "info", + Short: "Show information about the current context", + Args: cobra.NoArgs, + RunE: func(*cobra.Command, []string) error { + conf, err := config.Init(access.CmdFlags.Omniconfig, false) + if err != nil { + return err + } + + var result string + + context, err := conf.GetContext(access.CmdFlags.Context) + if err != nil { + return err + } + + var buf bytes.Buffer + err = configInfoCmdTemplate.Execute(&buf, map[string]string{ + "Context": conf.Context, + "APIURL": context.URL, + "Identity": context.Auth.SideroV1.Identity, + }) + if err != nil { + return err + } + + result = buf.String() + "\n" + + fmt.Print(result) + + return nil + }, +} + +// CompleteConfigContext represents tab completion for `--context` argument and `config context` command. +func CompleteConfigContext(_ *cobra.Command, _ []string, _ string) ([]string, cobra.ShellCompDirective) { + conf, err := config.Init(access.CmdFlags.Omniconfig, false) + if err != nil { + return nil, 0 + } + + contextNames := maps.Keys(conf.Contexts) + slices.Sort(contextNames) + + return contextNames, cobra.ShellCompDirectiveNoFileComp +} + +func init() { + configCmd.AddCommand( + configURLCmd, + configIdentityCmd, + configContextCmd, + configAddCmd, + configGetContextsCmd, + configMergeCmd, + configNewCmd, + configInfoCmd, + ) + + configAddCmd.Flags().StringVar(&configAddCmdFlags.url, "url", config.DefaultContext.URL, "URL of the server") + configAddCmd.Flags().StringVar(&configAddCmdFlags.identity, "identity", "", "identity to use for authentication") + + configNewCmd.Flags().StringVar(&configNewCmdFlags.url, "url", config.DefaultContext.URL, "URL of the server") + configNewCmd.Flags().StringVar(&configNewCmdFlags.identity, "identity", "", "identity to use for authentication") + + RootCmd.AddCommand(configCmd) +} diff --git a/client/pkg/omnictl/config/config.go b/client/pkg/omnictl/config/config.go new file mode 100644 index 00000000..0c49d122 --- /dev/null +++ b/client/pkg/omnictl/config/config.go @@ -0,0 +1,196 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +// Package config implements the config file logic. +package config + +import ( + "fmt" + "os" + + "github.com/adrg/xdg" + "gopkg.in/yaml.v3" +) + +const ( + // OmniConfigEnvVar is the environment variable to override the default config path. + OmniConfigEnvVar = "OMNICONFIG" + + relativePath = "omni/config" + defaultContextName = "default" +) + +var ( + // DefaultContext is the context with the default values. + DefaultContext = Context{ + URL: "grpc://127.0.0.1:8080", + } + + defaultConfig = Config{ + Context: defaultContextName, + Contexts: map[string]*Context{ + defaultContextName: &DefaultContext, + }, + } + + current *Config +) + +// Init initializes the Current config and returns it. +func Init(path string, create bool) (*Config, error) { + conf, err := load(path) + + if os.IsNotExist(err) { + if !create { + return nil, err + } + + defaultConfig.Path = path + + err := defaultConfig.Save() + if err != nil { + return nil, err + } + + conf = &defaultConfig + } + + current = conf + + return current, nil +} + +// load the config from the given explicit path or defaults to the known default config paths. +func load(path string) (*Config, error) { + var err error + + if path == "" { + path, err = defaultPath() + if err != nil { + return nil, err + } + } + + bytes, err := os.ReadFile(path) + if err != nil { + return nil, err + } + + var config Config + + err = yaml.Unmarshal(bytes, &config) + if err != nil { + return nil, err + } + + config.Path = path + + return &config, nil +} + +// Save saves the config to the path it is configured to, or defaults to the known default config paths. +// It modifies the Path to point to the saved file. +func (c *Config) Save() error { + var err error + + path := c.Path + if path == "" { + path, err = defaultPath() + if err != nil { + return err + } + } + + bytes, err := yaml.Marshal(c) + if err != nil { + return err + } + + err = os.WriteFile(path, bytes, 0o600) + if err != nil { + return err + } + + c.Path = path + + return err +} + +// Current returns the currently targeted config. +func Current() (*Config, error) { + if current == nil { + return nil, fmt.Errorf("config not initialized") + } + + return current, nil +} + +// GetContext returns the context with the given name. If empty, it will return the selected context in the config file. +func (c *Config) GetContext(name string) (*Context, error) { + if name == "" { + name = c.Context + } + + context, ok := c.Contexts[name] + if !ok { + return nil, fmt.Errorf("context not found: %s", name) + } + + return context, nil +} + +// Merge in additional contexts from another Config. +// +// Current context is overridden from passed in config. +func (c *Config) Merge(additionalConfigPath string) ([]Rename, error) { + if additionalConfigPath == "" { + return nil, fmt.Errorf("additional config path is empty") + } + + cfg, err := load(additionalConfigPath) + if err != nil { + return nil, err + } + + mappedContexts := map[string]string{} + + var renames []Rename + + for name, ctx := range cfg.Contexts { + mergedName := name + + if _, exists := c.Contexts[mergedName]; exists { + for i := 1; ; i++ { + mergedName = fmt.Sprintf("%s-%d", name, i) + + if _, ctxExists := c.Contexts[mergedName]; !ctxExists { + break + } + } + } + + mappedContexts[name] = mergedName + + if name != mergedName { + renames = append(renames, Rename{name, mergedName}) + } + + c.Contexts[mergedName] = ctx + } + + if cfg.Context != "" { + c.Context = mappedContexts[cfg.Context] + } + + return renames, nil +} + +func defaultPath() (string, error) { + path := os.Getenv(OmniConfigEnvVar) + if path != "" { + return path, nil + } + + return xdg.ConfigFile(relativePath) +} diff --git a/client/pkg/omnictl/config/rename.go b/client/pkg/omnictl/config/rename.go new file mode 100644 index 00000000..f8d6c77f --- /dev/null +++ b/client/pkg/omnictl/config/rename.go @@ -0,0 +1,18 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package config + +import "fmt" + +// Rename describes context rename during merge. +type Rename struct { + From string + To string +} + +// String converts to "from" -> "to". +func (r *Rename) String() string { + return fmt.Sprintf("%s -> %s", r.From, r.To) +} diff --git a/client/pkg/omnictl/config/types.go b/client/pkg/omnictl/config/types.go new file mode 100644 index 00000000..a899d1e6 --- /dev/null +++ b/client/pkg/omnictl/config/types.go @@ -0,0 +1,33 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package config + +// Config represents the omni configuration. +type Config struct { + Contexts map[string]*Context `yaml:"contexts"` + Context string `yaml:"context"` + Path string `yaml:"-"` +} + +// Context represents a context in the config. +type Context struct { + URL string `yaml:"url"` + Auth Auth `yaml:"auth,omitempty"` +} + +// Auth contains the authentication configuration for a context. +type Auth struct { + // Deprecated: basic auth is not supported, and setting this field has no effect. + Basic string `yaml:"basic,omitempty"` + SideroV1 SideroV1 `yaml:"siderov1,omitempty"` +} + +// SideroV1 is the auth configuration v1. +type SideroV1 struct { + Identity string `yaml:"identity,omitempty"` +} + +// PlaceholderURL is a placeholder url. +const PlaceholderURL = "<placeholder_url>" diff --git a/client/pkg/omnictl/delete.go b/client/pkg/omnictl/delete.go new file mode 100644 index 00000000..95465803 --- /dev/null +++ b/client/pkg/omnictl/delete.go @@ -0,0 +1,162 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omnictl + +import ( + "context" + "fmt" + + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/state" + "github.com/spf13/cobra" + + "github.com/siderolabs/omni/client/pkg/client" + "github.com/siderolabs/omni/client/pkg/cosi/labels" + "github.com/siderolabs/omni/client/pkg/omni/resources" + "github.com/siderolabs/omni/client/pkg/omnictl/internal/access" +) + +var deleteCmdFlags struct { + namespace string + selector string + all bool +} + +// deleteCmd represents the delete (resources) command. +var deleteCmd = &cobra.Command{ + Use: "delete <type> [<id>]", + Aliases: []string{"d"}, + Short: "Delete a specific resource by ID or all resources of the type.", + Long: `Similar to 'kubectl delete', 'omnictl delete' initiates resource deletion and waits for the operation to complete.`, + Example: "", + Args: cobra.RangeArgs(1, 2), + RunE: func(cmd *cobra.Command, args []string) error { + return access.WithClient(deleteResources(cmd, args)) + }, +} + +//nolint:gocognit,gocyclo,cyclop +func deleteResources(cmd *cobra.Command, args []string) func(ctx context.Context, client *client.Client) error { + return func(ctx context.Context, client *client.Client) error { + st := client.Omni().State() + + resourceType := resource.Type(args[0]) //nolint:unconvert + + rd, err := resolveResourceType(ctx, st, resourceType) + if err != nil { + return err + } + + if !cmd.Flags().Lookup("namespace").Changed { + deleteCmdFlags.namespace = rd.TypedSpec().DefaultNamespace + } + + var resourceIDs []resource.ID + + if len(args) > 1 { + resourceIDs = []resource.ID{args[1]} + } else { + var listOpts []state.ListOption + + if !deleteCmdFlags.all && deleteCmdFlags.selector == "" { + return fmt.Errorf("either resource ID or one of --all or --selector flags must be specified") + } + + if deleteCmdFlags.selector != "" { + var query *resource.LabelQuery + + query, err = labels.ParseQuery(deleteCmdFlags.selector) + if err != nil { + return err + } + + listOpts = append(listOpts, state.WithLabelQuery(resource.RawLabelQuery(*query))) + } + + var list resource.List + + list, err = st.List(ctx, resource.NewMetadata(deleteCmdFlags.namespace, rd.TypedSpec().Type, "", resource.VersionUndefined), listOpts...) + if err != nil { + return err + } + + resourceIDs = make([]resource.ID, 0, len(list.Items)) + + for _, item := range list.Items { + resourceIDs = append(resourceIDs, item.Metadata().ID()) + } + } + + // teardown all resources + for _, resourceID := range resourceIDs { + _, err = st.Teardown(ctx, resource.NewMetadata(deleteCmdFlags.namespace, rd.TypedSpec().Type, resourceID, resource.VersionUndefined)) + if err != nil { + return err + } + + fmt.Printf("torn down %s %s\n", rd.TypedSpec().Type, resourceID) + } + + // set up a watch for all resources of kind + watchCh := make(chan state.Event) + + for _, resourceID := range resourceIDs { + err = st.Watch(ctx, resource.NewMetadata(deleteCmdFlags.namespace, rd.TypedSpec().Type, resourceID, resource.VersionUndefined), watchCh) + if err != nil { + return err + } + } + + resourceIDsLeft := map[resource.ID]struct{}{} + + for _, resourceID := range resourceIDs { + resourceIDsLeft[resourceID] = struct{}{} + } + + // until some resources are not deleted yet... + for len(resourceIDsLeft) > 0 { + var event state.Event + + select { + case <-ctx.Done(): + return ctx.Err() + case event = <-watchCh: + } + + switch event.Type { + case state.Destroyed: + delete(resourceIDsLeft, event.Resource.Metadata().ID()) + case state.Created, state.Updated: + if _, ours := resourceIDsLeft[event.Resource.Metadata().ID()]; !ours { + continue + } + + if event.Resource.Metadata().Phase() == resource.PhaseTearingDown && event.Resource.Metadata().Finalizers().Empty() { + if err = st.Destroy(ctx, event.Resource.Metadata()); err != nil && !state.IsNotFoundError(err) { + return err + } + + fmt.Printf("destroyed %s %s\n", rd.TypedSpec().Type, event.Resource.Metadata().ID()) + } + case state.Bootstrapped: + // ignore + case state.Errored: + return fmt.Errorf("error watching for resource deletion: %w", event.Error) + } + } + + return nil + } +} + +func init() { + deleteCmd.PersistentFlags().StringVarP(&deleteCmdFlags.namespace, "namespace", "n", resources.DefaultNamespace, "The resource namespace.") + deleteCmd.PersistentFlags().BoolVar(&deleteCmdFlags.all, "all", false, "Delete all resources of the type.") + deleteCmd.PersistentFlags().StringVarP(&deleteCmdFlags.selector, "selector", "l", "", "Selector (label query) to filter on, supports '=' and '==' (e.g. -l key1=value1,key2=value2)") + + deleteCmd.MarkFlagsMutuallyExclusive("all", "selector") + + RootCmd.AddCommand(deleteCmd) +} diff --git a/client/pkg/omnictl/docs.go b/client/pkg/omnictl/docs.go new file mode 100644 index 00000000..2ccaab0a --- /dev/null +++ b/client/pkg/omnictl/docs.go @@ -0,0 +1,86 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omnictl + +import ( + "fmt" + "io" + "os" + "path" + "path/filepath" + "strings" + + "github.com/spf13/cobra" + "github.com/spf13/cobra/doc" +) + +func frontmatter(title, description string) string { + frontmatter := "---\n" + + frontmatter += "title: " + title + "\n" + frontmatter += "description: " + description + "\n" + + frontmatter += "---\n\n" + + return frontmatter + "<!-- markdownlint-disable -->\n\n" +} + +func linkHandler(name string) string { + base := strings.TrimSuffix(name, path.Ext(name)) + + base = strings.ReplaceAll(base, "_", "-") + + return "#" + strings.ToLower(base) +} + +// docsCmd represents the docs command. +var docsCmd = &cobra.Command{ + Use: "docs <output> [flags]", + Short: "Generate documentation for the CLI", + Long: ``, + Args: cobra.ExactArgs(1), + Hidden: true, + RunE: func(_ *cobra.Command, args []string) error { + dir := args[0] + + filename := filepath.Join(dir, "cli.md") + f, err := os.Create(filename) + if err != nil { + return err + } + //nolint:errcheck + defer f.Close() + + if _, err = f.WriteString(frontmatter("omnictl CLI", "omnictl CLI tool reference.")); err != nil { + return err + } + + if err = GenMarkdownReference(RootCmd, f, linkHandler); err != nil { + return fmt.Errorf("failed to generate docs: %w", err) + } + + return nil + }, +} + +// GenMarkdownReference is the same as GenMarkdownTree, but +// with custom filePrepender and linkHandler. +func GenMarkdownReference(cmd *cobra.Command, w io.Writer, linkHandler func(string) string) error { + for _, c := range cmd.Commands() { + if !c.IsAvailableCommand() || c.IsAdditionalHelpTopicCommand() { + continue + } + + if err := GenMarkdownReference(c, w, linkHandler); err != nil { + return err + } + } + + return doc.GenMarkdownCustom(cmd, w, linkHandler) +} + +func init() { + RootCmd.AddCommand(docsCmd) +} diff --git a/client/pkg/omnictl/download.go b/client/pkg/omnictl/download.go new file mode 100644 index 00000000..6c6acdb9 --- /dev/null +++ b/client/pkg/omnictl/download.go @@ -0,0 +1,585 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omnictl + +import ( + "context" + "encoding/json" + "fmt" + "io" + "mime" + "net/http" + "net/url" + "os" + "path/filepath" + "strings" + + "github.com/cosi-project/runtime/pkg/safe" + "github.com/siderolabs/gen/xslices" + "github.com/siderolabs/go-api-signature/pkg/message" + pgpclient "github.com/siderolabs/go-api-signature/pkg/pgp/client" + "github.com/siderolabs/go-api-signature/pkg/serviceaccount" + "github.com/spf13/cobra" + + "github.com/siderolabs/omni/client/api/omni/management" + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/client" + "github.com/siderolabs/omni/client/pkg/constants" + "github.com/siderolabs/omni/client/pkg/meta" + "github.com/siderolabs/omni/client/pkg/omni/resources" + "github.com/siderolabs/omni/client/pkg/omni/resources/omni" + "github.com/siderolabs/omni/client/pkg/omnictl/config" + "github.com/siderolabs/omni/client/pkg/omnictl/internal/access" +) + +// downloadFlags represents the `download` command flags. +type downloadFlags struct { + architecture string + + output string + talosVersion string + labels []string + extraKernelArgs []string + extensions []string + pxe bool + secureBoot bool +} + +var downloadCmdFlags downloadFlags + +func init() { + downloadCmd.Flags().BoolVar(&downloadCmdFlags.pxe, "pxe", false, "Print PXE URL and exit") + downloadCmd.Flags().BoolVar(&downloadCmdFlags.secureBoot, "secureboot", false, "Download SecureBoot enabled installation media") + downloadCmd.Flags().StringVar(&downloadCmdFlags.architecture, "arch", "amd64", "Image architecture to download (amd64, arm64)") + downloadCmd.Flags().StringVar(&downloadCmdFlags.output, "output", ".", "Output file or directory, defaults to current working directory") + downloadCmd.Flags().StringVar(&downloadCmdFlags.talosVersion, "talos-version", constants.DefaultTalosVersion, "Output file or directory, defaults to current working directory") + downloadCmd.Flags().StringArrayVar(&downloadCmdFlags.labels, "initial-labels", nil, "Bake initial labels into the generated installation media") + downloadCmd.Flags().StringArrayVar(&downloadCmdFlags.extraKernelArgs, "extra-kernel-args", nil, "Add extra kernel args to the generated installation media") + downloadCmd.Flags().StringArrayVar(&downloadCmdFlags.extensions, "extensions", nil, "Generate installation media with extensions pre-installed") + + RootCmd.AddCommand(downloadCmd) +} + +// downloadCmd represents the download command. +var downloadCmd = &cobra.Command{ + Use: "download <image name>", + Short: "Download installer media", + Long: `This command downloads installer media from the server + +It accepts one argument, which is the name of the image to download. Name can be one of the following: + + * iso - downloads the latest ISO image + * AWS AMI (amd64), Vultr (arm64), Raspberry Pi 4 Model B - full image name + * oracle, aws, vmware - platform name + * rpi_generic, rockpi_4c, rock64 - board name + +To get the full list of available images, look at the output of the following command: + omnictl get installationmedia -o yaml + +The download command tries to match the passed string in this order: + + * name + * profile + +By default it will download amd64 image if there are multiple images available for the same name. + +For example, to download the latest ISO image for arm64, run: + + omnictl download iso --arch amd64 + +To download the latest Vultr image, run: + + omnictl download "vultr" + +To download the latest Radxa ROCK PI 4 image, run: + + omnictl download "rpi_generic" +`, + Args: cobra.ExactArgs(1), + RunE: func(_ *cobra.Command, args []string) error { + return access.WithClient(func(ctx context.Context, client *client.Client) error { + if args[0] == "" { + return fmt.Errorf("image name is required") + } + + output, err := filepath.Abs(downloadCmdFlags.output) + if err != nil { + return err + } + + err = makePath(output) + if err != nil { + return err + } + + image, err := findImage(ctx, client, args[0], downloadCmdFlags.architecture) + if err != nil { + return err + } + + return downloadImageTo(ctx, client, image, output) + }) + }, + ValidArgsFunction: downloadCompletion, +} + +func findImage(ctx context.Context, client *client.Client, name, arch string) (*omni.InstallationMedia, error) { + result, err := filterMedia(ctx, client, func(val *omni.InstallationMedia) (*omni.InstallationMedia, bool) { + spec := val.TypedSpec().Value + + if strings.EqualFold(name, "iso") { + return val, strings.Contains(strings.ToLower(spec.Name), strings.ToLower(name)) + } + + return val, strings.EqualFold(spec.Name, name) || + strings.EqualFold(spec.Profile, name) + }) + if err != nil { + return nil, err + } + + if len(result) > 1 { + result = xslices.FilterInPlace(result, func(val *omni.InstallationMedia) bool { + return val.TypedSpec().Value.Architecture == arch + }) + } + + if len(result) == 0 { + return nil, fmt.Errorf("no image found for %q", name) + } else if len(result) > 1 { + names := xslices.Map(result, func(val *omni.InstallationMedia) string { + return val.Metadata().ID() + }) + + return nil, fmt.Errorf("multiple images found:\n %s", strings.Join(names, "\n ")) + } + + return result[0], nil +} + +func createSchematic(ctx context.Context, client *client.Client) (*management.CreateSchematicResponse, error) { + metaValues := map[uint32]string{} + + var extensions []string + + if downloadCmdFlags.labels != nil { + labels, err := getMachineLabels() + if err != nil { + return nil, fmt.Errorf("failed to gen image labels: %w", err) + } + + metaValues[meta.LabelsMeta] = string(labels) + } + + var err error + + if downloadCmdFlags.extensions != nil { + extensions, err = getExtensions(ctx, client) + if err != nil { + return nil, fmt.Errorf("failed to lookup extensions: %w", err) + } + } + + resp, err := client.Management().CreateSchematic(ctx, &management.CreateSchematicRequest{ + MetaValues: metaValues, + ExtraKernelArgs: downloadCmdFlags.extraKernelArgs, + Extensions: extensions, + }) + if err != nil { + return nil, fmt.Errorf("failed to create schematic: %w", err) + } + + return resp, nil +} + +func downloadImageTo(ctx context.Context, client *client.Client, media *omni.InstallationMedia, output string) error { + schematicResp, err := createSchematic(ctx, client) + if err != nil { + return err + } + + if media.TypedSpec().Value.NoSecureBoot && downloadCmdFlags.secureBoot { + return fmt.Errorf("%q doesn't support secure boot", media.TypedSpec().Value.Name) + } + + if downloadCmdFlags.pxe { + var u *url.URL + + u, err = url.Parse(schematicResp.PxeUrl) + if err != nil { + return err + } + + url := u.JoinPath(downloadCmdFlags.talosVersion, media.TypedSpec().Value.SrcFilePrefix).String() + + if downloadCmdFlags.secureBoot { + url += "-secureboot" + } + + fmt.Println(url) + + return nil + } + + req, err := createRequest(ctx, client, schematicResp.SchematicId, media) + if err != nil { + return err + } + + err = signRequest(req) + if err != nil { + return err + } + + httpTransport := http.DefaultTransport + + if access.CmdFlags.InsecureSkipTLSVerify { + defaultTransport, ok := http.DefaultTransport.(*http.Transport) + if !ok { + return fmt.Errorf("unexpected default transport type: %T", http.DefaultTransport) + } + + defaultTransportClone := defaultTransport.Clone() + defaultTransportClone.TLSClientConfig.InsecureSkipVerify = true + + httpTransport = defaultTransportClone + } + + httpClient := &http.Client{ + Transport: httpTransport, + } + + fmt.Println("Generating the image...") + + resp, err := httpClient.Do(req) + if err != nil { + return err + } + + defer checkCloser(resp.Body) + + if resp.StatusCode >= http.StatusBadRequest { + var message []byte + + message, err = io.ReadAll(resp.Body) + if err != nil { + return err + } + + return fmt.Errorf("failed to download the installation media, error code: %d, message: %s", resp.StatusCode, message) + } + + dest := output + + if filepath.Ext(output) == "" { + disposition := resp.Header.Get("Content-Disposition") + + if disposition == "" { + return fmt.Errorf("no content disposition header in the server response") + } + + var params map[string]string + + _, params, err = mime.ParseMediaType(disposition) + if err != nil { + return fmt.Errorf("failed to parse content disposition header: %w", err) + } + + filename, ok := params["filename"] + if !ok { + return fmt.Errorf("failed to auto-detect filename from the response headers, filename is not present in the content disposition header") + } + + dest = filepath.Join(output, filename) + } + + fmt.Printf("Downloading %s to %s\n", media.Metadata().ID(), dest) + + err = downloadResponseTo(dest, resp) + if err != nil { + return err + } + + fmt.Printf("Downloaded %s to %s\n", media.Metadata().ID(), dest) + + return nil +} + +func filterMedia[T any](ctx context.Context, client *client.Client, check func(value *omni.InstallationMedia) (T, bool)) ([]T, error) { + media, err := safe.StateListAll[*omni.InstallationMedia]( + ctx, + client.Omni().State(), + ) + if err != nil { + return nil, err + } + + var result []T + + for it := media.Iterator(); it.Next(); { + if val, ok := check(it.Value()); ok { + result = append(result, val) + } + } + + return result, nil +} + +func createRequest(ctx context.Context, client *client.Client, schematic string, image *omni.InstallationMedia) (*http.Request, error) { + u, err := url.Parse(client.Endpoint()) + if err != nil { + return nil, err + } + + u.Scheme = "https" + + u.Path, err = url.JoinPath(u.Path, "image", schematic, downloadCmdFlags.talosVersion, image.Metadata().ID()) + if err != nil { + return nil, err + } + + if downloadCmdFlags.secureBoot { + query := u.Query() + query.Add(constants.SecureBoot, "true") + + u.RawQuery = query.Encode() + } + + req, err := http.NewRequestWithContext(ctx, http.MethodGet, u.String(), nil) + if err != nil { + return nil, err + } + + return req, err +} + +func signRequest(req *http.Request) error { + identity, signer, err := getSigner() + if err != nil { + return err + } + + msg, err := message.NewHTTP(req) + if err != nil { + return err + } + + return msg.Sign(identity, signer) +} + +// getSigner returns the identity and the signer to use for signing the request. +// +// It can be a service account or a user key. +func getSigner() (identity string, signer message.Signer, err error) { + envKey, valueBase64 := serviceaccount.GetFromEnv() + if envKey != "" { + sa, saErr := serviceaccount.Decode(valueBase64) + if saErr != nil { + return "", nil, saErr + } + + return sa.Name, sa.Key, nil + } + + contextName, configCtx, err := currentConfigCtx() + if err != nil { + return "", nil, err + } + + provider := pgpclient.NewKeyProvider("omni/keys") + + key, keyErr := provider.ReadValidKey(contextName, configCtx.Auth.SideroV1.Identity) + if keyErr != nil { + return "", nil, fmt.Errorf("failed to read key: %w", err) + } + + return configCtx.Auth.SideroV1.Identity, key, nil +} + +func getMachineLabels() ([]byte, error) { + labels := map[string]string{} + + for _, l := range downloadCmdFlags.labels { + parts := strings.Split(l, "=") + if len(parts) > 2 { + return nil, fmt.Errorf("malformed label %s", l) + } + + value := "" + + if len(parts) > 1 { + value = parts[1] + } + + labels[parts[0]] = value + } + + return json.Marshal(labels) +} + +func getExtensions(ctx context.Context, client *client.Client) ([]string, error) { + extensions, err := safe.StateGet[*omni.TalosExtensions]( + ctx, + client.Omni().State(), + omni.NewTalosExtensions(resources.DefaultNamespace, strings.TrimLeft(downloadCmdFlags.talosVersion, "v")).Metadata(), + ) + if err != nil { + return nil, fmt.Errorf("failed to get extensions for talos version %q: %w", downloadCmdFlags.talosVersion, err) + } + + result := make([]string, 0, len(downloadCmdFlags.extensions)) + + for _, extension := range downloadCmdFlags.extensions { + items := xslices.Map(extensions.TypedSpec().Value.Items, func(e *specs.TalosExtensionsSpec_Info) string { + return e.Name + }) + + items = xslices.FilterInPlace(items, func(item string) bool { + if strings.Contains(item, extension) { + fmt.Printf("Install Extension: %s\n", item) + + return true + } + + return false + }) + + if len(items) == 0 { + return nil, fmt.Errorf("failed to find extension with name %q for talos version %q", extension, downloadCmdFlags.talosVersion) + } + + result = append(result, items...) + } + + return result, nil +} + +func currentConfigCtx() (name string, ctx *config.Context, err error) { + conf, err := config.Current() + if err != nil { + return "", nil, err + } + + contextName := conf.Context + if access.CmdFlags.Context != "" { + contextName = access.CmdFlags.Context + } + + configCtx, err := conf.GetContext(contextName) + if err != nil { + return "", nil, err + } + + return contextName, configCtx, nil +} + +func downloadResponseTo(dest string, resp *http.Response) error { + f, err := os.Create(dest) + if err != nil { + return err + } + + defer checkCloser(f) + + _, err = io.Copy(f, resp.Body) + + return err +} + +func checkCloser(c io.Closer) { + if err := c.Close(); err != nil { + fmt.Printf("error closing: %v", err) + } +} + +func downloadCompletion(_ *cobra.Command, _ []string, toComplete string) ([]string, cobra.ShellCompDirective) { + var results []string + + err := access.WithClient( + func(ctx context.Context, client *client.Client) error { + res, err := filterMedia(ctx, client, func(value *omni.InstallationMedia) (string, bool) { + spec := value.TypedSpec().Value + if downloadCmdFlags.architecture != spec.Architecture { + return "", false + } + + name := spec.Name + if toComplete == "" || strings.Contains(name, toComplete) { + return name, true + } + + return "", false + }) + if err != nil { + return err + } + + results = res + + return nil + }, + ) + if err != nil { + return nil, cobra.ShellCompDirectiveError + } + + return dedupInplace(results), cobra.ShellCompDirectiveNoFileComp +} + +func dedupInplace(results []string) []string { + seen := make(map[string]struct{}, len(results)) + j := 0 + + for _, r := range results { + if _, ok := seen[r]; !ok { + seen[r] = struct{}{} + results[j] = r + j++ + } + } + + return results[:j] +} + +func makePath(path string) error { + if filepath.Ext(path) != "" { + ok, err := checkPath(path) + if err != nil { + return err + } + + if ok { + return fmt.Errorf("destination %s already exists", path) + } + + path = filepath.Dir(path) + } + + ok, err := checkPath(path) + if err != nil { + return err + } + + if !ok { + if dirErr := os.MkdirAll(path, 0o755); dirErr != nil { + return err + } + } + + return nil +} + +func checkPath(path string) (bool, error) { + _, err := os.Stat(path) + + switch { + case os.IsNotExist(err): + return false, nil + case err != nil: + return false, err + default: + return true, nil + } +} diff --git a/client/pkg/omnictl/get.go b/client/pkg/omnictl/get.go new file mode 100644 index 00000000..678e3c56 --- /dev/null +++ b/client/pkg/omnictl/get.go @@ -0,0 +1,237 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omnictl + +import ( + "context" + "fmt" + "regexp" + + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/state" + "github.com/spf13/cobra" + + "github.com/siderolabs/omni/client/pkg/client" + "github.com/siderolabs/omni/client/pkg/cosi/labels" + "github.com/siderolabs/omni/client/pkg/omni/resources" + "github.com/siderolabs/omni/client/pkg/omnictl/internal/access" + "github.com/siderolabs/omni/client/pkg/omnictl/output" +) + +var getCmdFlags struct { + namespace string + output string + selector string + idRegexp string + watch bool +} + +// getCmd represents the get (resources) command. +var getCmd = &cobra.Command{ + Use: "get <type> [<id>]", + Aliases: []string{"g"}, + Short: "Get a specific resource or list of resources.", + Long: `Similar to 'kubectl get', 'omnictl get' returns a set of resources from the OS. +To get a list of all available resource definitions, issue 'omnictl get rd'`, + Example: "", + Args: cobra.RangeArgs(1, 2), + RunE: func(cmd *cobra.Command, args []string) error { + return access.WithClient(getResources(cmd, args)) + }, +} + +//nolint:gocognit,gocyclo,cyclop,maintidx +func getResources(cmd *cobra.Command, args []string) func(ctx context.Context, client *client.Client) error { + return func(ctx context.Context, client *client.Client) error { + st := client.Omni().State() + + var ( + resourceType = resource.Type(args[0]) //nolint:unconvert + resourceID resource.ID + ) + + if len(args) > 1 { + resourceID = args[1] + } + + rd, err := resolveResourceType(ctx, st, resourceType) + if err != nil { + return err + } + + if !cmd.Flags().Lookup("namespace").Changed { + getCmdFlags.namespace = rd.TypedSpec().DefaultNamespace + } + + var labelQuery []resource.LabelQueryOption + + if getCmdFlags.selector != "" { + if resourceID != "" { + return fmt.Errorf("cannot specify both resource ID and selector") + } + + var query *resource.LabelQuery + + query, err = labels.ParseQuery(getCmdFlags.selector) + if err != nil { + return err + } + + labelQuery = append(labelQuery, resource.RawLabelQuery(*query)) + } + + var idQuery []resource.IDQueryOption + + if getCmdFlags.idRegexp != "" { + if resourceID != "" { + return fmt.Errorf("cannot specify both resource ID and ID regexp") + } + + var idRegexp *regexp.Regexp + + idRegexp, err = regexp.Compile(getCmdFlags.idRegexp) + if err != nil { + return fmt.Errorf("invalid ID regexp: %w", err) + } + + idQuery = append(idQuery, resource.IDRegexpMatch(idRegexp)) + } + + out, err := output.NewWriter(getCmdFlags.output) + if err != nil { + return err + } + + defer out.Flush() //nolint:errcheck + + if err = out.WriteHeader(rd, getCmdFlags.watch); err != nil { + return err + } + + md := resource.NewMetadata(getCmdFlags.namespace, rd.TypedSpec().Type, resourceID, resource.VersionUndefined) + + switch { + case resourceID == "" && !getCmdFlags.watch: + items, err := st.List(ctx, md, + state.WithLabelQuery(labelQuery...), + state.WithIDQuery(idQuery...), + ) + if err != nil { + return err + } + + for _, item := range items.Items { + if err = out.WriteResource(item, state.EventType(0)); err != nil { + return err + } + } + case resourceID == "" && getCmdFlags.watch: + watchCh := make(chan state.Event) + + err := st.WatchKind(ctx, md, watchCh, + state.WithBootstrapContents(true), + state.WatchWithLabelQuery(labelQuery...), + state.WatchWithIDQuery(idQuery...), + ) + if err != nil { + return err + } + + bootstrapped := false + + watchLoopKind: + for { + select { + case e := <-watchCh: + if e.Type == state.Errored { + return fmt.Errorf("watch error: %w", e.Error) + } + + if e.Type == state.Bootstrapped { + bootstrapped = true + + if err = out.Flush(); err != nil { + return err + } + + continue + } + + if e.Resource == nil { + continue + } + + if err = out.WriteResource(e.Resource, e.Type); err != nil { + return err + } + + if bootstrapped { + if err = out.Flush(); err != nil { + return err + } + } + case <-ctx.Done(): + break watchLoopKind + } + } + case resourceID != "" && !getCmdFlags.watch: + res, err := st.Get(ctx, md) + if err != nil { + return err + } + + if err = out.WriteResource(res, state.EventType(0)); err != nil { + return err + } + case resourceID != "" && getCmdFlags.watch: + watchCh := make(chan state.Event) + + err := st.Watch(ctx, md, watchCh) + if err != nil { + return err + } + + watchLoop: + for { + select { + case e := <-watchCh: + if e.Type == state.Errored { + return fmt.Errorf("watch error: %w", e.Error) + } + + if e.Resource == nil { + continue + } + + if err = out.WriteResource(e.Resource, e.Type); err != nil { + return err + } + + if err = out.Flush(); err != nil { + return err + } + case <-ctx.Done(): + break watchLoop + } + } + } + + return nil + } +} + +func init() { + getCmd.PersistentFlags().StringVarP(&getCmdFlags.namespace, "namespace", "n", resources.DefaultNamespace, "The resource namespace.") + getCmd.PersistentFlags().BoolVarP(&getCmdFlags.watch, "watch", "w", false, "Watch the resource state.") + getCmd.PersistentFlags().StringVarP(&getCmdFlags.output, "output", "o", "table", "Output format (json, table, yaml, jsonpath).") + getCmd.PersistentFlags().StringVarP(&getCmdFlags.selector, "selector", "l", "", "Selector (label query) to filter on, supports '=' and '==' (e.g. -l key1=value1,key2=value2)") + getCmd.PersistentFlags().StringVar(&getCmdFlags.idRegexp, "id-match-regexp", "", "Match resource ID against a regular expression.") + + if err := getCmd.RegisterFlagCompletionFunc("output", output.CompleteOutputArg); err != nil { + panic(err) + } + + RootCmd.AddCommand(getCmd) +} diff --git a/client/pkg/omnictl/internal/access/access.go b/client/pkg/omnictl/internal/access/access.go new file mode 100644 index 00000000..00b5d4bd --- /dev/null +++ b/client/pkg/omnictl/internal/access/access.go @@ -0,0 +1,6 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +// Package access contains commands related to API access for the CLI. +package access diff --git a/client/pkg/omnictl/internal/access/client.go b/client/pkg/omnictl/internal/access/client.go new file mode 100644 index 00000000..bbdbe8fa --- /dev/null +++ b/client/pkg/omnictl/internal/access/client.go @@ -0,0 +1,139 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package access + +import ( + "context" + "fmt" + "os" + + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/safe" + "github.com/cosi-project/runtime/pkg/state" + + "github.com/siderolabs/omni/client/pkg/client" + "github.com/siderolabs/omni/client/pkg/omni/resources" + "github.com/siderolabs/omni/client/pkg/omni/resources/system" + "github.com/siderolabs/omni/client/pkg/omnictl/config" + "github.com/siderolabs/omni/client/pkg/version" +) + +const ( + // EndpointEnvVar is the name of the environment variable that contains the Omni endpoint. + EndpointEnvVar = "OMNI_ENDPOINT" +) + +type clientOptions struct { + skipAuth bool +} + +// ClientOption is a functional option for the client. +type ClientOption func(*clientOptions) + +// WithSkipAuth configures the client to skip the authentication interception. +func WithSkipAuth(skipAuth bool) ClientOption { + return func(o *clientOptions) { + o.skipAuth = skipAuth + } +} + +// WithClient initializes the Omni API client. +func WithClient(f func(ctx context.Context, client *client.Client) error, clientOpts ...ClientOption) error { + _, err := config.Init(CmdFlags.Omniconfig, true) + if err != nil { + return err + } + + cliOpts := clientOptions{} + + for _, opt := range clientOpts { + opt(&cliOpts) + } + + return WithContext(func(ctx context.Context) error { + opts := []client.Option{ + client.WithInsecureSkipTLSVerify(CmdFlags.InsecureSkipTLSVerify), + } + + conf, err := config.Current() + if err != nil { + return err + } + + contextName := conf.Context + if CmdFlags.Context != "" { + contextName = CmdFlags.Context + } + + configCtx, err := conf.GetContext(CmdFlags.Context) + if err != nil { + return err + } + + if configCtx.Auth.Basic != "" { //nolint:staticcheck + fmt.Fprintf(os.Stderr, "[WARN] basic auth is deprecated and has no effect\n") + } + + opts = append(opts, client.WithUserAccount(contextName, configCtx.Auth.SideroV1.Identity)) + + if configCtx.URL == config.PlaceholderURL { + return fmt.Errorf("context %q has not been configured, you will need to set it manually", contextName) + } + + url := configCtx.URL + + endpointEnv := os.Getenv(EndpointEnvVar) + if endpointEnv != "" { + url = endpointEnv + } + + client, err := client.New(ctx, url, opts...) + if err != nil { + return err + } + + if !cliOpts.skipAuth { + // bootstrap the client, and perform auth/re-auth if needed via the unary call + // stream interceptor can't catch the auth error, as it comes async + _, err = client.Omni().State().Get(ctx, resource.NewMetadata(resources.EphemeralNamespace, system.SysVersionType, system.SysVersionID, resource.VersionUndefined)) + if err != nil { + return err + } + } + + if err = checkVersion(ctx, client.Omni().State()); err != nil { + return err + } + + return f(ctx, client) + }) +} + +func checkVersion(ctx context.Context, state state.State) error { + if version.API == 0 && !version.SuppressVersionWarning { + fmt.Println(`[WARN] github.com/siderolabs/omni/client/pkg/version.API is not set, client-server version validation is disabled. +If you want to enable the version validation and disable this warning, set github.com/siderolabs/omni/client/pkg/version.SuppressVersionWarning to true.`) + + return nil + } + + sysVersion, err := safe.StateGet[*system.SysVersion](ctx, state, system.NewSysVersion(resources.EphemeralNamespace, system.SysVersionID).Metadata()) + if err != nil { + return err + } + + if sysVersion.TypedSpec().Value.BackendApiVersion == 0 { // API versions are not supported (yet) on backend, i.e., the client is newer than the backend + return fmt.Errorf("server API does not support API versions, i.e., the server is older than the client, "+ + "please upgrade the server to have the same API version as the client: client API version %v, "+ + "client version %v, server version %v", version.API, version.Tag, sysVersion.TypedSpec().Value.BackendVersion) + } + + // compare the API versions + if sysVersion.TypedSpec().Value.BackendApiVersion != version.API { + return fmt.Errorf("client API version mismatch: backend API version %v, client API version %v", sysVersion.TypedSpec().Value.BackendApiVersion, version.API) + } + + return nil +} diff --git a/client/pkg/omnictl/internal/access/context.go b/client/pkg/omnictl/internal/access/context.go new file mode 100644 index 00000000..ab3c77cd --- /dev/null +++ b/client/pkg/omnictl/internal/access/context.go @@ -0,0 +1,19 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package access + +import ( + "context" + "os" + "os/signal" +) + +// WithContext wraps with CLI context. +func WithContext(f func(ctx context.Context) error) error { + ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt) + defer stop() + + return f(ctx) +} diff --git a/client/pkg/omnictl/internal/access/flags.go b/client/pkg/omnictl/internal/access/flags.go new file mode 100644 index 00000000..e9b9d1c0 --- /dev/null +++ b/client/pkg/omnictl/internal/access/flags.go @@ -0,0 +1,12 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package access + +// CmdFlags contains the common CLI flags. +var CmdFlags struct { + Omniconfig string + Context string + InsecureSkipTLSVerify bool +} diff --git a/client/pkg/omnictl/kubeconfig.go b/client/pkg/omnictl/kubeconfig.go new file mode 100644 index 00000000..e4226053 --- /dev/null +++ b/client/pkg/omnictl/kubeconfig.go @@ -0,0 +1,216 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omnictl + +import ( + "bufio" + "context" + "fmt" + "os" + "path/filepath" + "strings" + "time" + + "github.com/mattn/go-isatty" + "github.com/siderolabs/go-kubeconfig" + "github.com/spf13/cobra" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + "k8s.io/client-go/tools/clientcmd" + + "github.com/siderolabs/omni/client/pkg/client" + "github.com/siderolabs/omni/client/pkg/client/management" + "github.com/siderolabs/omni/client/pkg/constants" + "github.com/siderolabs/omni/client/pkg/omnictl/internal/access" +) + +const ( + serviceAccountFlag = "service-account" + serviceAccountUserFlag = "user" +) + +var kubeconfigCmdFlags struct { + cluster string + forceContextName string + serviceAccountUser string + serviceAccountGroups []string + serviceAccountTTL time.Duration + force bool + merge bool + serviceAccount bool +} + +// kubeconfigCmd represents the get (resources) command. +var kubeconfigCmd = &cobra.Command{ + Use: "kubeconfig [local-path]", + Short: "Download the admin kubeconfig of a cluster", + Long: `Download the admin kubeconfig of a cluster. +If merge flag is defined, config will be merged with ~/.kube/config or [local-path] if specified. +Otherwise kubeconfig will be written to PWD or [local-path] if specified.`, + Args: cobra.MaximumNArgs(1), + RunE: func(_ *cobra.Command, args []string) error { + return access.WithClient(getKubeconfig(args)) + }, +} + +//nolint:gocognit +func getKubeconfig(args []string) func(ctx context.Context, client *client.Client) error { + return func(ctx context.Context, client *client.Client) error { + var localPath string + + if len(args) == 0 { + // no path given, use defaults + var err error + + if kubeconfigCmdFlags.merge { + localPath, err = kubeconfig.SinglePath() + if err != nil { + return err + } + } else { + localPath, err = os.Getwd() + if err != nil { + return fmt.Errorf("error getting current working directory: %w", err) + } + } + } else { + localPath = args[0] + } + + localPath = filepath.Clean(localPath) + + st, err := os.Stat(localPath) + if err != nil { + if !os.IsNotExist(err) { + return fmt.Errorf("error checking path %q: %w", localPath, err) + } + + err = os.MkdirAll(filepath.Dir(localPath), 0o755) + if err != nil { + return err + } + } else if st.IsDir() { + // only dir name was given, append `kubeconfig` by default + localPath = filepath.Join(localPath, "kubeconfig") + } + + _, err = os.Stat(localPath) + if err == nil && !(kubeconfigCmdFlags.force || kubeconfigCmdFlags.merge) { + return fmt.Errorf("kubeconfig file already exists, use --force to overwrite: %q", localPath) + } else if err != nil { + if os.IsNotExist(err) { + // merge doesn't make sense if target path doesn't exist + kubeconfigCmdFlags.merge = false + } else { + return fmt.Errorf("error checking path %q: %w", localPath, err) + } + } + + var opts []management.KubeconfigOption + + if kubeconfigCmdFlags.serviceAccount { + if kubeconfigCmdFlags.serviceAccountUser == "" { + return fmt.Errorf("--%s flag is required when --%s is set to true", serviceAccountUserFlag, serviceAccountFlag) + } + + opts = append(opts, management.WithServiceAccount( + kubeconfigCmdFlags.serviceAccountTTL, + kubeconfigCmdFlags.serviceAccountUser, + kubeconfigCmdFlags.serviceAccountGroups..., + )) + } + + data, err := client.Management().WithCluster(kubeconfigCmdFlags.cluster).Kubeconfig(ctx, opts...) + if err != nil { + if code, ok := status.FromError(err); ok && code.Code() == codes.NotFound { + return fmt.Errorf("cluster %s not found", kubeconfigCmdFlags.cluster) + } + + return err + } + + if kubeconfigCmdFlags.merge { + return extractAndMerge(data, localPath) + } + + return os.WriteFile(localPath, data, 0o640) + } +} + +func extractAndMerge(data []byte, localPath string) error { + config, err := clientcmd.Load(data) + if err != nil { + return err + } + + merger, err := kubeconfig.Load(localPath) + if err != nil { + return err + } + + interactive := isatty.IsTerminal(os.Stdout.Fd()) + + err = merger.Merge(config, kubeconfig.MergeOptions{ + ActivateContext: true, + ForceContextName: kubeconfigCmdFlags.forceContextName, + OutputWriter: os.Stdout, + ConflictHandler: func(component kubeconfig.ConfigComponent, name string) (kubeconfig.ConflictDecision, error) { + if kubeconfigCmdFlags.force { + return kubeconfig.OverwriteDecision, nil + } + + if !interactive { + return kubeconfig.RenameDecision, nil + } + + return askOverwriteOrRename(fmt.Sprintf("%s %q already exists", component, name)) + }, + }) + if err != nil { + return err + } + + return merger.Write(localPath) +} + +func askOverwriteOrRename(prompt string) (kubeconfig.ConflictDecision, error) { + reader := bufio.NewReader(os.Stdin) + + for { + fmt.Printf("%s [(r)ename/(o)verwrite]: ", prompt) + + response, err := reader.ReadString('\n') + if err != nil { + return "", err + } + + switch strings.ToLower(strings.TrimSpace(response)) { + case "overwrite", "o": + return kubeconfig.OverwriteDecision, nil + case "rename", "r": + return kubeconfig.RenameDecision, nil + } + } +} + +func init() { + kubeconfigCmd.Flags().StringVarP(&kubeconfigCmdFlags.cluster, "cluster", "c", "", "cluster to use") + kubeconfigCmd.Flags().BoolVarP(&kubeconfigCmdFlags.force, "force", "f", false, "force overwrite of kubeconfig if already present, force overwrite on kubeconfig merge") + kubeconfigCmd.Flags().StringVar(&kubeconfigCmdFlags.forceContextName, "force-context-name", "", "force context name for kubeconfig merge") + kubeconfigCmd.Flags().BoolVarP(&kubeconfigCmdFlags.merge, "merge", "m", true, "merge with existing kubeconfig") + + kubeconfigCmd.Flags().BoolVar(&kubeconfigCmdFlags.serviceAccount, serviceAccountFlag, false, + "create a service account type kubeconfig instead of a OIDC-authenticated user type") + kubeconfigCmd.Flags().DurationVar(&kubeconfigCmdFlags.serviceAccountTTL, "ttl", 365*24*time.Hour, + fmt.Sprintf("ttl for the service account token. only used when --%s is set to true", serviceAccountFlag)) + kubeconfigCmd.Flags().StringVar(&kubeconfigCmdFlags.serviceAccountUser, serviceAccountUserFlag, "", + fmt.Sprintf("user to be used in the service account token (sub). required when --%s is set to true", serviceAccountFlag)) + kubeconfigCmd.Flags().StringSliceVar(&kubeconfigCmdFlags.serviceAccountGroups, "groups", []string{constants.DefaultAccessGroup}, + fmt.Sprintf("group to be used in the service account token (groups). only used when --%s is set to true", serviceAccountFlag)) + + kubeconfigCmd.MarkFlagRequired("cluster") //nolint:errcheck + + RootCmd.AddCommand(kubeconfigCmd) +} diff --git a/client/pkg/omnictl/logformat/dmesg.go b/client/pkg/omnictl/logformat/dmesg.go new file mode 100644 index 00000000..eec63c8d --- /dev/null +++ b/client/pkg/omnictl/logformat/dmesg.go @@ -0,0 +1,71 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package logformat + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "io" + "strings" +) + +// NewDmesgOutput returns a new DmesgOutput. +func NewDmesgOutput(rdr io.Reader) *DmesgOutput { + return &DmesgOutput{ + decoder: json.NewDecoder(rdr), + } +} + +// DmesgOutput is used to print logs in dmesg format. +type DmesgOutput struct { + decoder *json.Decoder +} + +// Run parses logs from passed reader and prints them in dmesg format until the context is canceled +// or the reader has returned an error. +func (o DmesgOutput) Run(ctx context.Context) error { + var msg talosLogMessage + + for { + if ctx.Err() != nil { + return nil //nolint:nilerr + } + + err := o.decoder.Decode(&msg) + if err != nil { + if errors.Is(err, io.EOF) { + return nil + } + + return err + } + + secondsPart := msg.Clock / 1000000 + microSecondsPart := msg.Clock % 1000000 + message := trimNewLine(msg.Message) + + if strings.IndexByte(message, '\n') == -1 { + fmt.Printf("[%5d.%06d] %s: %s\n", secondsPart, microSecondsPart, msg.Facility, message) + } else { + for i, line := range strings.Split(message, "\n") { + if i == 0 { + fmt.Printf("[%5d.%06d] %s: %s\n", secondsPart, microSecondsPart, msg.Facility, line) + } else { + fmt.Printf("[%5d.%06d] %s\n", secondsPart, microSecondsPart, line) + } + } + } + } +} + +func trimNewLine(message string) string { + if len(message) > 0 && message[len(message)-1] == '\n' { + message = message[:len(message)-1] + } + + return message +} diff --git a/client/pkg/omnictl/logformat/omni.go b/client/pkg/omnictl/logformat/omni.go new file mode 100644 index 00000000..073479e7 --- /dev/null +++ b/client/pkg/omnictl/logformat/omni.go @@ -0,0 +1,78 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +// Package logformat contains different implementations of log formatting. +package logformat + +import ( + "context" + "encoding/json" + "errors" + "io" + "time" + + "go.uber.org/zap" +) + +// NewOmniOutput returns a new OmniOutput. +func NewOmniOutput(rdr io.Reader) *OmniOutput { + decoder := json.NewDecoder(rdr) + + return &OmniOutput{decoder: decoder} +} + +// OmniOutput is a log output which parses logs from Talos machine and prints them in zap'like format. +type OmniOutput struct { + decoder *json.Decoder +} + +// Run prints logs from passed reader until the context is canceled or the reader has returned an error. +func (o *OmniOutput) Run(ctx context.Context) error { + var msg talosLogMessage + + var logger zap.Logger + + logger.WithOptions(zap.AddStacktrace(zap.FatalLevel)) + + for { + if ctx.Err() != nil { + return nil //nolint:nilerr + } + + err := o.decoder.Decode(&msg) + if err != nil { + if errors.Is(err, io.EOF) { + return nil + } + + return err + } + + level, err := zap.ParseAtomicLevel(msg.TalosLevel) + if err != nil { + level = zap.NewAtomicLevel() + } + + logMsg := logger.Check(level.Level(), msg.Message) + if logMsg != nil { + logMsg.Write( + zap.Int("clock", msg.Clock), + zap.String("facility", msg.Facility), + zap.String("priority", msg.Priority), + zap.Int("seq", msg.Seq), + zap.Time("talos-time", msg.TalosTime), + ) + } + } +} + +type talosLogMessage struct { + TalosTime time.Time `json:"talos-time"` + Facility string `json:"facility"` + Message string `json:"msg"` + Priority string `json:"priority"` + TalosLevel string `json:"talos-level"` + Clock int `json:"clock"` + Seq int `json:"seq"` +} diff --git a/client/pkg/omnictl/logformat/raw.go b/client/pkg/omnictl/logformat/raw.go new file mode 100644 index 00000000..e2445fd6 --- /dev/null +++ b/client/pkg/omnictl/logformat/raw.go @@ -0,0 +1,29 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package logformat + +import ( + "io" + "os" +) + +// NewRawOutput runs the raw log format. +func NewRawOutput(rdr io.Reader) *RawOutput { + return &RawOutput{ + rdr: rdr, + } +} + +// RawOutput simply copies the input rdr to os.Stdout. +type RawOutput struct { + rdr io.Reader +} + +// Run copies the input rdr to os.Stdout the rdr has returned an error. +func (o RawOutput) Run() error { + _, err := io.Copy(os.Stdout, o.rdr) + + return err +} diff --git a/client/pkg/omnictl/machine-logs.go b/client/pkg/omnictl/machine-logs.go new file mode 100644 index 00000000..2dca6499 --- /dev/null +++ b/client/pkg/omnictl/machine-logs.go @@ -0,0 +1,69 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omnictl + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + + "github.com/siderolabs/omni/client/pkg/client" + "github.com/siderolabs/omni/client/pkg/omnictl/internal/access" + "github.com/siderolabs/omni/client/pkg/omnictl/logformat" +) + +var logsCmdFlags struct { + logFormat string + follow bool + tailLines int32 +} + +// getCmd represents the get logs command. +var logsCmd = &cobra.Command{ + Use: "machine-logs machineID", + Aliases: []string{"l"}, + Short: "Get logs for a machine", + Long: `Get logs for a provided machine id`, + Example: "", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + return access.WithClient(getLogs(cmd, args)) + }, + SilenceUsage: true, +} + +func getLogs(_ *cobra.Command, args []string) func(ctx context.Context, client *client.Client) error { + return func(ctx context.Context, client *client.Client) error { + machineID := args[0] + + logReader, err := client.Management().LogsReader(ctx, machineID, logsCmdFlags.follow, logsCmdFlags.tailLines) + if err != nil { + return fmt.Errorf("failed to get logs stream for '%s': %w", machineID, err) + } + + switch logsCmdFlags.logFormat { + case "omni": + err = logformat.NewOmniOutput(logReader).Run(ctx) + case "dmesg": + err = logformat.NewDmesgOutput(logReader).Run(ctx) + default: + err = logformat.NewRawOutput(logReader).Run() + } + + if err != nil { + return fmt.Errorf("failed to print logs for '%s': %w", machineID, err) + } + + return nil + } +} + +func init() { + logsCmd.Flags().BoolVarP(&logsCmdFlags.follow, "follow", "f", false, "specify if the logs should be streamed") + logsCmd.Flags().Int32Var(&logsCmdFlags.tailLines, "tail", -1, "lines of log file to display (default is to show from the beginning)") + logsCmd.Flags().StringVar(&logsCmdFlags.logFormat, "log-format", "raw", "log format (raw, omni, dmesg) to display (default is to display in raw format)") + RootCmd.AddCommand(logsCmd) +} diff --git a/client/pkg/omnictl/output/json.go b/client/pkg/omnictl/output/json.go new file mode 100644 index 00000000..0adb971b --- /dev/null +++ b/client/pkg/omnictl/output/json.go @@ -0,0 +1,84 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package output + +import ( + "encoding/json" + "io" + "strings" + + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/state" + yaml "gopkg.in/yaml.v3" +) + +// JSON outputs resources in JSON format. +type JSON struct { + writer io.Writer + withEvents bool +} + +// NewJSON initializes JSON resource output. +func NewJSON(writer io.Writer) *JSON { + return &JSON{ + writer: writer, + } +} + +// WriteHeader implements output.Writer interface. +func (j *JSON) WriteHeader(_ *meta.ResourceDefinition, withEvents bool) error { + j.withEvents = withEvents + + return nil +} + +// prepareEncodableData prepares the data of a resource to be encoded as JSON and populates it with some extra information. +func (j *JSON) prepareEncodableData(r resource.Resource, event state.EventType) (map[string]any, error) { + out, err := resource.MarshalYAML(r) + if err != nil { + return nil, err + } + + yamlBytes, err := yaml.Marshal(out) + if err != nil { + return nil, err + } + + var data map[string]any + + err = yaml.Unmarshal(yamlBytes, &data) + if err != nil { + return nil, err + } + + if j.withEvents { + data["event"] = strings.ToLower(event.String()) + } + + return data, nil +} + +func writeAsIndentedJSON(wr io.Writer, data any) error { + enc := json.NewEncoder(wr) + enc.SetIndent("", " ") + + return enc.Encode(data) +} + +// WriteResource implements output.Writer interface. +func (j *JSON) WriteResource(r resource.Resource, event state.EventType) error { + data, err := j.prepareEncodableData(r, event) + if err != nil { + return err + } + + return writeAsIndentedJSON(j.writer, data) +} + +// Flush implements output.Writer interface. +func (j *JSON) Flush() error { + return nil +} diff --git a/client/pkg/omnictl/output/jsonpath.go b/client/pkg/omnictl/output/jsonpath.go new file mode 100644 index 00000000..f4575a9a --- /dev/null +++ b/client/pkg/omnictl/output/jsonpath.go @@ -0,0 +1,124 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package output + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "reflect" + + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/state" + "k8s.io/client-go/third_party/forked/golang/template" + "k8s.io/client-go/util/jsonpath" +) + +// JSONPath outputs resources in JSONPath format. +type JSONPath struct { + jsonPath *jsonpath.JSONPath + json *JSON + writer io.Writer +} + +// NewJSONPath initializes JSONPath resource output. +func NewJSONPath(writer io.Writer, jsonPath *jsonpath.JSONPath) *JSONPath { + return &JSONPath{ + jsonPath: jsonPath, + json: NewJSON(writer), + writer: writer, + } +} + +// WriteHeader implements output.Writer interface. +func (j *JSONPath) WriteHeader(definition *meta.ResourceDefinition, withEvents bool) error { + return j.json.WriteHeader(definition, withEvents) +} + +// printResult prints a reflect.Value as JSON if it's a map, array, slice or struct. +// But if it's just a 'scalar' type it prints it as a mere string. +func printResult(wr io.Writer, result reflect.Value) error { + kind := result.Kind() + if kind == reflect.Interface { + kind = result.Elem().Kind() + } + + outputJSON := kind == reflect.Map || + kind == reflect.Array || + kind == reflect.Slice || + kind == reflect.Struct + + var text []byte + + var err error + + if outputJSON { + text, err = json.MarshalIndent(result.Interface(), "", " ") + if err != nil { + return err + } + } else { + text, err = valueToText(result) + } + + if err != nil { + return err + } + + text = append(text, '\n') + + if _, err = wr.Write(text); err != nil { + return err + } + + return nil +} + +// valueToText translates reflect value to corresponding text. +func valueToText(v reflect.Value) ([]byte, error) { + iface, ok := template.PrintableValue(v) + if !ok { + return nil, fmt.Errorf("can't translate type %s to text", v.Type()) + } + + var buffer bytes.Buffer + + fmt.Fprint(&buffer, iface) + + return buffer.Bytes(), nil +} + +// WriteResource implements output.Writer interface. +func (j *JSONPath) WriteResource(r resource.Resource, event state.EventType) error { + data, err := j.json.prepareEncodableData(r, event) + if err != nil { + return err + } + + results, err := j.jsonPath.FindResults(data) + if err != nil { + return fmt.Errorf("error finding result for jsonpath: %w", err) + } + + j.jsonPath.EnableJSONOutput(true) + + for _, resultGroup := range results { + for _, result := range resultGroup { + err = printResult(j.writer, result) + if err != nil { + return fmt.Errorf("error generating jsonpath results: %w", err) + } + } + } + + return nil +} + +// Flush implements output.Writer interface. +func (j *JSONPath) Flush() error { + return nil +} diff --git a/client/pkg/omnictl/output/output.go b/client/pkg/omnictl/output/output.go new file mode 100644 index 00000000..7fd672a7 --- /dev/null +++ b/client/pkg/omnictl/output/output.go @@ -0,0 +1,54 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +// Package output provides writers in different formats. +package output + +import ( + "fmt" + "os" + "strings" + + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/state" + "github.com/spf13/cobra" + "k8s.io/client-go/util/jsonpath" +) + +// Writer interface. +type Writer interface { + WriteHeader(definition *meta.ResourceDefinition, withEvents bool) error + WriteResource(r resource.Resource, event state.EventType) error + Flush() error +} + +// NewWriter builds writer from type. +func NewWriter(format string) (Writer, error) { //nolint:ireturn + switch { + case format == "table": + return NewTable(), nil + case format == "yaml": + return NewYAML(), nil + case format == "json": + return NewJSON(os.Stdout), nil + case strings.HasPrefix(format, "jsonpath="): + path := format[len("jsonpath="):] + + jp := jsonpath.New("talos") + + if err := jp.Parse(path); err != nil { + return nil, fmt.Errorf("error parsing jsonpath: %w", err) + } + + return NewJSONPath(os.Stdout, jp), nil + default: + return nil, fmt.Errorf("output format %q is not supported", format) + } +} + +// CompleteOutputArg represents tab completion for `--output` argument. +func CompleteOutputArg(*cobra.Command, []string, string) ([]string, cobra.ShellCompDirective) { + return []string{"json", "table", "yaml"}, cobra.ShellCompDirectiveNoFileComp +} diff --git a/client/pkg/omnictl/output/table.go b/client/pkg/omnictl/output/table.go new file mode 100644 index 00000000..c8e58771 --- /dev/null +++ b/client/pkg/omnictl/output/table.go @@ -0,0 +1,133 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package output + +import ( + "bytes" + "fmt" + "os" + "strings" + "text/tabwriter" + + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/state" + "gopkg.in/yaml.v3" + "k8s.io/client-go/util/jsonpath" +) + +// Table outputs resources in Table view. +type Table struct { + dynamicColumns []dynamicColumn + displayType string + w tabwriter.Writer + withEvents bool +} + +type dynamicColumn func(value any) (string, error) + +// NewTable initializes table resource output. +func NewTable() *Table { + output := &Table{} + output.w.Init(os.Stdout, 0, 0, 3, ' ', 0) + + return output +} + +// WriteHeader implements output.Writer interface. +func (table *Table) WriteHeader(definition *meta.ResourceDefinition, withEvents bool) error { + table.withEvents = withEvents + fields := []string{"NAMESPACE", "TYPE", "ID", "VERSION"} + + if withEvents { + fields = append([]string{"*"}, fields...) + } + + table.displayType = definition.TypedSpec().DisplayType + + for _, col := range definition.TypedSpec().PrintColumns { + fields = append(fields, strings.ToUpper(col.Name)) + + expr := jsonpath.New(col.Name) + if err := expr.Parse(col.JSONPath); err != nil { + return fmt.Errorf("error parsing column %q jsonpath: %w", col.Name, err) + } + + expr = expr.AllowMissingKeys(true) + + table.dynamicColumns = append(table.dynamicColumns, func(val any) (string, error) { + var buf bytes.Buffer + + if e := expr.Execute(&buf, val); e != nil { + return "", e + } + + return buf.String(), nil + }) + } + + _, err := fmt.Fprintln(&table.w, strings.Join(fields, "\t")) + + return err +} + +// WriteResource implements output.Writer interface. +func (table *Table) WriteResource(r resource.Resource, event state.EventType) error { + values := []string{r.Metadata().Namespace(), table.displayType, r.Metadata().ID(), r.Metadata().Version().String()} + + if table.withEvents { + var label string + + switch event { + case state.Created: + label = "+" + case state.Destroyed: + label = "-" + case state.Updated: + label = " " + case state.Errored, state.Bootstrapped: // ignored + } + + values = append([]string{label}, values...) + } + + yamlR, err := resource.MarshalYAML(r) + if err != nil { + return err + } + + marshaled, err := yaml.Marshal(yamlR) + if err != nil { + return err + } + + var data struct { + Spec any `yaml:"spec"` + } + + if err = yaml.Unmarshal(marshaled, &data); err != nil { + return err + } + + for _, dynamicColumn := range table.dynamicColumns { + var value string + + value, err = dynamicColumn(data.Spec) + if err != nil { + return err + } + + values = append(values, value) + } + + _, err = fmt.Fprintln(&table.w, strings.Join(values, "\t")) + + return err +} + +// Flush implements output.Writer interface. +func (table *Table) Flush() error { + return table.w.Flush() +} diff --git a/client/pkg/omnictl/output/yaml.go b/client/pkg/omnictl/output/yaml.go new file mode 100644 index 00000000..b174fbb9 --- /dev/null +++ b/client/pkg/omnictl/output/yaml.go @@ -0,0 +1,59 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package output + +import ( + "fmt" + "os" + "strings" + + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/state" + yaml "gopkg.in/yaml.v3" +) + +// YAML outputs resources in YAML format. +type YAML struct { + needDashes bool + withEvents bool +} + +// NewYAML initializes YAML resource output. +func NewYAML() *YAML { + return &YAML{} +} + +// WriteHeader implements output.Writer interface. +func (y *YAML) WriteHeader(_ *meta.ResourceDefinition, withEvents bool) error { + y.withEvents = withEvents + + return nil +} + +// WriteResource implements output.Writer interface. +func (y *YAML) WriteResource(r resource.Resource, event state.EventType) error { + out, err := resource.MarshalYAML(r) + if err != nil { + return err + } + + if y.needDashes { + fmt.Fprintln(os.Stdout, "---") + } + + y.needDashes = true + + if y.withEvents { + fmt.Fprintf(os.Stdout, "event: %s\n", strings.ToLower(event.String())) + } + + return yaml.NewEncoder(os.Stdout).Encode(out) +} + +// Flush implements output.Writer interface. +func (y *YAML) Flush() error { + return nil +} diff --git a/client/pkg/omnictl/root.go b/client/pkg/omnictl/root.go new file mode 100644 index 00000000..7aadf22a --- /dev/null +++ b/client/pkg/omnictl/root.go @@ -0,0 +1,34 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omnictl + +import ( + "fmt" + + "github.com/spf13/cobra" + + "github.com/siderolabs/omni/client/pkg/omnictl/config" + "github.com/siderolabs/omni/client/pkg/omnictl/internal/access" +) + +// RootCmd represents the base command when called without any subcommands. +var RootCmd = &cobra.Command{ + Use: "omnictl", + Short: "A CLI for accessing Omni API.", + Long: ``, + SilenceUsage: true, + DisableAutoGenTag: true, +} + +func init() { + RootCmd.PersistentFlags().StringVar(&access.CmdFlags.Omniconfig, "omniconfig", "", + fmt.Sprintf("The path to the omni configuration file. Defaults to '%s' env variable if set, otherwise the config directory according to the XDG specification.", + config.OmniConfigEnvVar, + )) + RootCmd.PersistentFlags().StringVar(&access.CmdFlags.Context, "context", "", + "The context to be used. Defaults to the selected context in the omniconfig file.") + RootCmd.PersistentFlags().BoolVar(&access.CmdFlags.InsecureSkipTLSVerify, "insecure-skip-tls-verify", false, + "Skip TLS verification for the Omni GRPC and HTTP API endpoints.") +} diff --git a/client/pkg/omnictl/serviceaccount.go b/client/pkg/omnictl/serviceaccount.go new file mode 100644 index 00000000..dfc79493 --- /dev/null +++ b/client/pkg/omnictl/serviceaccount.go @@ -0,0 +1,203 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omnictl + +import ( + "context" + "fmt" + "os" + "runtime" + "text/tabwriter" + "time" + + "github.com/siderolabs/go-api-signature/pkg/pgp" + "github.com/siderolabs/go-api-signature/pkg/serviceaccount" + "github.com/spf13/cobra" + + pkgaccess "github.com/siderolabs/omni/client/pkg/access" + "github.com/siderolabs/omni/client/pkg/client" + "github.com/siderolabs/omni/client/pkg/omnictl/internal/access" +) + +var ( + serviceAccountCreateFlags struct { + role string + + useUserRole bool + ttl time.Duration + } + + serviceAccountRenewFlags struct { + ttl time.Duration + } + + // serviceAccountCmd represents the serviceaccount command. + serviceAccountCmd = &cobra.Command{ + Use: "serviceaccount", + Aliases: []string{"sa"}, + Short: "Manage service accounts", + } + + serviceAccountCreateCmd = &cobra.Command{ + Use: "create <name>", + Aliases: []string{"c"}, + Short: "Create a service account", + Args: cobra.ExactArgs(1), + RunE: func(_ *cobra.Command, args []string) error { + name := args[0] + + return access.WithClient(func(ctx context.Context, client *client.Client) error { + key, err := generateServiceAccountPGPKey(name) + if err != nil { + return err + } + + armoredPublicKey, err := key.ArmorPublic() + if err != nil { + return err + } + + publicKeyID, err := client.Management().CreateServiceAccount(ctx, armoredPublicKey, serviceAccountCreateFlags.role, serviceAccountCreateFlags.useUserRole) + if err != nil { + return err + } + + encodedKey, err := serviceaccount.Encode(name, key) + if err != nil { + return err + } + + fmt.Printf("Created service account %q with public key ID %q\n", name, publicKeyID) + fmt.Printf("\n") + fmt.Printf("Set the following environment variables to use the service account:\n") + fmt.Printf("%s=%s\n", access.EndpointEnvVar, client.Endpoint()) + fmt.Printf("%s=%s\n", serviceaccount.OmniServiceAccountKeyEnvVar, encodedKey) + fmt.Printf("\n") + fmt.Printf("Note: Store the service account key securely, it will not be displayed again\n") + + return nil + }) + }, + } + + serviceAccountRenewCmd = &cobra.Command{ + Use: "renew <name>", + Aliases: []string{"r"}, + Short: "Renew a service account by registering a new public key to it", + Args: cobra.ExactArgs(1), + RunE: func(_ *cobra.Command, args []string) error { + name := args[0] + + return access.WithClient(func(ctx context.Context, client *client.Client) error { + key, err := generateServiceAccountPGPKey(name) + if err != nil { + return err + } + + armoredPublicKey, err := key.ArmorPublic() + if err != nil { + return err + } + + publicKeyID, err := client.Management().RenewServiceAccount(ctx, name, armoredPublicKey) + if err != nil { + return err + } + + encodedKey, err := serviceaccount.Encode(name, key) + if err != nil { + return err + } + + fmt.Printf("Renewed service account %q by adding a public key with ID %q\n", name, publicKeyID) + fmt.Printf("\n") + fmt.Printf("Set the following environment variables to use the service account:\n") + fmt.Printf("%s=%s\n", access.EndpointEnvVar, client.Endpoint()) + fmt.Printf("%s=%s\n", serviceaccount.OmniServiceAccountKeyEnvVar, encodedKey) + fmt.Printf("\n") + fmt.Printf("Note: Store the service account key securely, it will not be displayed again\n") + + return nil + }) + }, + } + + serviceAccountListCmd = &cobra.Command{ + Use: "list", + Aliases: []string{"l"}, + Short: "List service accounts", + Args: cobra.NoArgs, + RunE: func(*cobra.Command, []string) error { + return access.WithClient(func(ctx context.Context, client *client.Client) error { + serviceAccounts, err := client.Management().ListServiceAccounts(ctx) + if err != nil { + return err + } + + writer := tabwriter.NewWriter(os.Stdout, 0, 0, 3, ' ', 0) + + fmt.Fprintf(writer, "NAME\tROLE\tPUBLIC KEY ID\tEXPIRATION\n") + + for _, sa := range serviceAccounts { + for i, publicKey := range sa.PgpPublicKeys { + if i == 0 { + fmt.Fprintf(writer, "%s\t%q\t%s\t%s\n", sa.Name, sa.GetRole(), publicKey.Id, publicKey.Expiration.AsTime().String()) + } else { + fmt.Fprintf(writer, "\t\t%s\t%s\n", publicKey.Id, publicKey.Expiration.AsTime().String()) + } + } + } + + return writer.Flush() + }) + }, + } + + serviceAccountDestroyCmd = &cobra.Command{ + Use: "destroy <name>", + Aliases: []string{"d"}, + Short: "Destroy a service account", + Args: cobra.ExactArgs(1), + RunE: func(_ *cobra.Command, args []string) error { + name := args[0] + + return access.WithClient(func(ctx context.Context, client *client.Client) error { + err := client.Management().DestroyServiceAccount(ctx, name) + if err != nil { + return fmt.Errorf("failed to destroy service account: %w", err) + } + + fmt.Printf("destroyed service account: %s\n", name) + + return nil + }) + }, + } +) + +func generateServiceAccountPGPKey(name string) (*pgp.Key, error) { + comment := fmt.Sprintf("%s/%s", runtime.GOOS, runtime.GOARCH) + serviceAccountEmail := name + pkgaccess.ServiceAccountNameSuffix + + return pgp.GenerateKey(name, comment, serviceAccountEmail, serviceAccountCreateFlags.ttl) +} + +func init() { + RootCmd.AddCommand(serviceAccountCmd) + + serviceAccountCmd.AddCommand(serviceAccountCreateCmd) + serviceAccountCmd.AddCommand(serviceAccountListCmd) + serviceAccountCmd.AddCommand(serviceAccountDestroyCmd) + serviceAccountCmd.AddCommand(serviceAccountRenewCmd) + + roleFlag := "role" + useUserRoleFlag := "use-user-role" + + serviceAccountCreateCmd.Flags().DurationVarP(&serviceAccountCreateFlags.ttl, "ttl", "t", 365*24*time.Hour, "TTL for the service account key") + serviceAccountCreateCmd.Flags().StringVarP(&serviceAccountCreateFlags.role, roleFlag, "r", "", "role of the service account. only used when --"+useUserRoleFlag+"=false") + serviceAccountCreateCmd.Flags().BoolVarP(&serviceAccountCreateFlags.useUserRole, useUserRoleFlag, "u", true, "use the role of the creating user. if true, --"+roleFlag+" is ignored") + + serviceAccountRenewCmd.Flags().DurationVarP(&serviceAccountRenewFlags.ttl, "ttl", "t", 365*24*time.Hour, "TTL for the service account key") +} diff --git a/client/pkg/omnictl/talosconfig.go b/client/pkg/omnictl/talosconfig.go new file mode 100644 index 00000000..f0c790e0 --- /dev/null +++ b/client/pkg/omnictl/talosconfig.go @@ -0,0 +1,149 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package omnictl + +import ( + "context" + "fmt" + "os" + "path/filepath" + + "github.com/siderolabs/talos/pkg/machinery/client/config" + "github.com/spf13/cobra" + + "github.com/siderolabs/omni/client/pkg/client" + "github.com/siderolabs/omni/client/pkg/client/management" + "github.com/siderolabs/omni/client/pkg/constants" + "github.com/siderolabs/omni/client/pkg/omnictl/internal/access" +) + +var talosconfigCmdFlags struct { + cluster string + forceContextName string + force bool + merge bool + getAdminConfig bool +} + +// talosconfigCmd represents the get (resources) command. +var talosconfigCmd = &cobra.Command{ + Use: "talosconfig [local-path]", + Short: "Download the admin talosconfig of a cluster", + Long: `Download the admin talosconfig of a cluster. +If merge flag is defined, config will be merged with ~/.talos/config or [local-path] if specified. +Otherwise talosconfig will be written to PWD or [local-path] if specified.`, + Args: cobra.MaximumNArgs(1), + RunE: func(_ *cobra.Command, args []string) error { + return access.WithClient(getTalosconfig(args)) + }, +} + +//nolint:gocognit +func getTalosconfig(args []string) func(ctx context.Context, client *client.Client) error { + return func(ctx context.Context, client *client.Client) error { + var localPath string + + if len(args) == 0 { + // no path given, use defaults + var err error + + if talosconfigCmdFlags.merge { + localPath, err = config.GetTalosDirectory() + if err != nil { + return err + } + + // TODO: figure out a proper way to get the path to .talos/config + localPath = filepath.Join(localPath, "config") + } else { + localPath, err = os.Getwd() + if err != nil { + return fmt.Errorf("error getting current working directory: %w", err) + } + } + } else { + localPath = args[0] + } + + localPath = filepath.Clean(localPath) + + st, err := os.Stat(localPath) + if err != nil { + if !os.IsNotExist(err) { + return fmt.Errorf("error checking path %q: %w", localPath, err) + } + + err = os.MkdirAll(filepath.Dir(localPath), 0o755) + if err != nil { + return err + } + } else if st.IsDir() { + // only dir name was given, append `talosconfig` by default + localPath = filepath.Join(localPath, "talosconfig") + } + + _, err = os.Stat(localPath) + if err == nil && !(talosconfigCmdFlags.force || talosconfigCmdFlags.merge) { + return fmt.Errorf("talosconfig file already exists, use --force to overwrite: %q", localPath) + } else if err != nil { + if os.IsNotExist(err) { + // merge doesn't make sense if target path doesn't exist + talosconfigCmdFlags.merge = false + } else { + return fmt.Errorf("error checking path %q: %w", localPath, err) + } + } + + opts := []management.TalosconfigOption{ + management.WithAdminTalosconfig(talosconfigCmdFlags.getAdminConfig), + } + + var data []byte + + if talosconfigCmdFlags.cluster == "" { + data, err = client.Management().Talosconfig(ctx, opts...) + } else { + data, err = client.Management().WithCluster(talosconfigCmdFlags.cluster).Talosconfig(ctx, opts...) + } + + if err != nil { + return err + } + + if talosconfigCmdFlags.merge { + cfg, err := config.FromBytes(data) + if err != nil { + return err + } + + existing, err := config.Open(localPath) + if err != nil { + return err + } + + renames := existing.Merge(cfg) + + for _, rename := range renames { + fmt.Printf("renamed talosconfig context %s\n", rename.String()) + } + + return existing.Save(localPath) + } + + return os.WriteFile(localPath, data, 0o640) + } +} + +func init() { + talosconfigCmd.Flags().StringVarP(&talosconfigCmdFlags.cluster, "cluster", "c", "", "cluster to use") + talosconfigCmd.Flags().BoolVarP(&talosconfigCmdFlags.force, "force", "f", false, "force overwrite of talosconfig if already present") + talosconfigCmd.Flags().BoolVarP(&talosconfigCmdFlags.merge, "merge", "m", true, "merge with existing talosconfig") + + if constants.IsDebugBuild { + talosconfigCmd.Flags().BoolVar(&talosconfigCmdFlags.getAdminConfig, "admin", false, "get admin talosconfig (DEBUG-ONLY)") + } + + RootCmd.AddCommand(talosconfigCmd) +} diff --git a/client/pkg/runtime/runtime.go b/client/pkg/runtime/runtime.go new file mode 100644 index 00000000..09384e7c --- /dev/null +++ b/client/pkg/runtime/runtime.go @@ -0,0 +1,25 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +// Package runtime contains public interfaces used in Omni frontend runtime. +package runtime + +// Matcher is implemented by all types which can traverse themselves in search for specific string. +type Matcher interface { + Match(string) bool +} + +// Fielder is implemented by all types which can traverse themselves in search for specific field. +type Fielder interface { + Field(string) (string, bool) +} + +// ListItem is a wrapper for the list item. +type ListItem interface { + Matcher + ID() string + Namespace() string + Unwrap() any + Field(name string) (string, bool) +} diff --git a/client/pkg/template/internal/models/cluster.go b/client/pkg/template/internal/models/cluster.go new file mode 100644 index 00000000..b3753a8b --- /dev/null +++ b/client/pkg/template/internal/models/cluster.go @@ -0,0 +1,193 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package models + +import ( + "fmt" + "strings" + "time" + "unicode" + + "github.com/blang/semver" + "github.com/cosi-project/runtime/pkg/resource" + "github.com/hashicorp/go-multierror" + "github.com/siderolabs/gen/pair" + "google.golang.org/protobuf/types/known/durationpb" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/constants" + "github.com/siderolabs/omni/client/pkg/omni/resources" + "github.com/siderolabs/omni/client/pkg/omni/resources/omni" +) + +// KindCluster is Cluster model kind. +const KindCluster = "Cluster" + +// Cluster is a top-level template object. +type Cluster struct { //nolint:govet + Meta `yaml:",inline"` + + // Name is the name of the cluster. + Name string `yaml:"name"` + + // Descriptors are the user descriptors to apply to the cluster. + Descriptors Descriptors `yaml:",inline"` + + // Kubernetes settings. + Kubernetes KubernetesCluster `yaml:"kubernetes"` + + // Talos settings. + Talos TalosCluster `yaml:"talos"` + + // Features settings. + Features Features `yaml:"features,omitempty"` + + // Cluster-wide patches. + Patches PatchList `yaml:"patches,omitempty"` +} + +// Features defines cluster-wide features. +type Features struct { + // DiskEncryption enables KMS encryption. + DiskEncryption bool `yaml:"diskEncryption,omitempty"` + // EnableWorkloadProxy enables workload proxy. + EnableWorkloadProxy bool `yaml:"enableWorkloadProxy,omitempty"` + // BackupConfiguration contains backup configuration settings. + BackupConfiguration BackupConfiguration `yaml:"backupConfiguration,omitempty"` +} + +// BackupConfiguration contains backup configuration settings. +type BackupConfiguration struct { + // Interval configures intervals between backups. If set to 0, etcd backups for this cluster are disabled. + Interval time.Duration `yaml:"interval,omitempty"` +} + +// KubernetesCluster is a Kubernetes cluster settings. +type KubernetesCluster struct { + // Version is the Kubernetes version. + Version string `yaml:"version"` +} + +// TalosCluster is a Talos cluster settings. +type TalosCluster struct { + // Version is the Talos version. + Version string `yaml:"version"` +} + +// Validate the model. +func (cluster *Cluster) Validate() error { + var multiErr error + + if cluster.Name == "" { + multiErr = multierror.Append(multiErr, fmt.Errorf("name is required")) + } + + for _, c := range cluster.Name { + if !unicode.IsDigit(c) && !unicode.IsLetter(c) && c != '-' && c != '_' { + multiErr = multierror.Append(multiErr, fmt.Errorf("name should only contain letters, digits, dashes and underscores")) + + break + } + } + + if err := cluster.Descriptors.Validate(); err != nil { + multiErr = multierror.Append(multiErr, err) + } + + multiErr = joinErrors(multiErr, cluster.Kubernetes.Validate(), cluster.Talos.Validate(), cluster.Patches.Validate()) + + if multiErr != nil { + return fmt.Errorf("error validating cluster %q: %w", cluster.Name, multiErr) + } + + return nil +} + +// Validate the model. +func (kubernetes *KubernetesCluster) Validate() error { + var multiErr error + + if kubernetes.Version == "" { + multiErr = multierror.Append(multiErr, fmt.Errorf("version is required")) + } else if _, err := semver.ParseTolerant(kubernetes.Version); err != nil { + multiErr = multierror.Append(multiErr, fmt.Errorf("version should be in semver format: %w", err)) + } + + if multiErr != nil { + return fmt.Errorf("error validating Kubernetes version: %w", multiErr) + } + + return nil +} + +// Validate the model. +func (talos *TalosCluster) Validate() error { + var multiErr error + + if talos.Version == "" { + multiErr = multierror.Append(multiErr, fmt.Errorf("version is required")) + } else { + if _, err := semver.ParseTolerant(talos.Version); err != nil { + multiErr = multierror.Append(multiErr, fmt.Errorf("version should be in semver format: %w", err)) + } + + if !strings.HasPrefix(talos.Version, "v") { + multiErr = multierror.Append(multiErr, fmt.Errorf("version should start with 'v'")) + } + } + + if multiErr != nil { + return fmt.Errorf("error validating Talos version: %w", multiErr) + } + + return nil +} + +// Translate into Omni resources. +func (cluster *Cluster) Translate(TranslateContext) ([]resource.Resource, error) { + clusterResource := omni.NewCluster(resources.DefaultNamespace, cluster.Name) + + clusterResource.Metadata().Annotations().Set(omni.ResourceManagedByClusterTemplates, "") + + cluster.Descriptors.Apply(clusterResource) + + clusterResource.TypedSpec().Value.Features = &specs.ClusterSpec_Features{ + EnableWorkloadProxy: cluster.Features.EnableWorkloadProxy, + } + + clusterResource.TypedSpec().Value.KubernetesVersion = strings.TrimLeft(cluster.Kubernetes.Version, "v") + clusterResource.TypedSpec().Value.TalosVersion = strings.TrimLeft(cluster.Talos.Version, "v") + + patches, err := cluster.Patches.Translate(fmt.Sprintf("cluster-%s", cluster.Name), constants.PatchBaseWeightCluster, pair.MakePair(omni.LabelCluster, cluster.Name)) + if err != nil { + return nil, err + } + + if clusterResource.TypedSpec().Value.Features == nil { + clusterResource.TypedSpec().Value.Features = &specs.ClusterSpec_Features{} + } + + clusterResource.TypedSpec().Value.Features.DiskEncryption = cluster.Features.DiskEncryption + + if interval := cluster.Features.BackupConfiguration.Interval; interval > 0 { + clusterResource.TypedSpec().Value.BackupConfiguration = &specs.EtcdBackupConf{Interval: durationpb.New(interval), Enabled: true} + } + + return append([]resource.Resource{clusterResource}, patches...), nil +} + +func init() { + register[Cluster](KindCluster) +} + +func joinErrors(err error, errs ...error) error { + for _, e := range errs { + if e != nil { + err = multierror.Append(err, e) + } + } + + return err +} diff --git a/client/pkg/template/internal/models/controlplane.go b/client/pkg/template/internal/models/controlplane.go new file mode 100644 index 00000000..61bd46d9 --- /dev/null +++ b/client/pkg/template/internal/models/controlplane.go @@ -0,0 +1,66 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package models + +import ( + "fmt" + + "github.com/cosi-project/runtime/pkg/resource" + "github.com/hashicorp/go-multierror" + + "github.com/siderolabs/omni/client/pkg/omni/resources/omni" +) + +// KindControlPlane is ControlPlane model kind. +const KindControlPlane = "ControlPlane" + +// ControlPlane describes Cluster controlplane nodes. +type ControlPlane struct { + MachineSet `yaml:",inline"` +} + +// Validate the model. +func (controlplane *ControlPlane) Validate() error { + var multiErr error + + if controlplane.Name != "" { + multiErr = multierror.Append(multiErr, fmt.Errorf("custom name is not allowed in the controlplane")) + } + + if controlplane.BootstrapSpec != nil { + if controlplane.BootstrapSpec.ClusterUUID == "" { + multiErr = multierror.Append(multiErr, fmt.Errorf("clusterUUID is required in bootstrapSpec")) + } + + if controlplane.BootstrapSpec.Snapshot == "" { + multiErr = multierror.Append(multiErr, fmt.Errorf("snapshot is required in bootstrapSpec")) + } + } + + if controlplane.UpdateStrategy != nil { + multiErr = multierror.Append(multiErr, fmt.Errorf("updateStrategy is not allowed in the controlplane")) + } + + if controlplane.DeleteStrategy != nil { + multiErr = multierror.Append(multiErr, fmt.Errorf("deleteStrategy is not allowed in the controlplane")) + } + + multiErr = joinErrors(multiErr, controlplane.MachineSet.Validate(), controlplane.Machines.Validate(), controlplane.Patches.Validate()) + + if multiErr != nil { + return fmt.Errorf("controlplane is invalid: %w", multiErr) + } + + return nil +} + +// Translate the model. +func (controlplane *ControlPlane) Translate(ctx TranslateContext) ([]resource.Resource, error) { + return controlplane.translate(ctx, omni.ControlPlanesIDSuffix, omni.LabelControlPlaneRole) +} + +func init() { + register[ControlPlane](KindControlPlane) +} diff --git a/client/pkg/template/internal/models/list.go b/client/pkg/template/internal/models/list.go new file mode 100644 index 00000000..93ec2ea5 --- /dev/null +++ b/client/pkg/template/internal/models/list.go @@ -0,0 +1,196 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package models + +import ( + "fmt" + "slices" + + "github.com/cosi-project/runtime/pkg/resource" + "github.com/hashicorp/go-multierror" + "github.com/siderolabs/gen/maps" + "github.com/siderolabs/gen/xslices" + + "github.com/siderolabs/omni/client/pkg/omni/resources/omni" +) + +// List implements a list of models, essentially it's a template. +type List []Model + +// Validate the set of models as a complete template. +// +// Each model should be valid, but also the set of models should be complete. +// +//nolint:gocyclo,cyclop +func (l List) Validate() error { + var multiErr error + + for _, model := range l { + multiErr = joinErrors(multiErr, model.Validate()) + } + + // complete template should contain 1 cluster, 1 controlplane, 0-N workers + // and machines mentioned in the controlplane or worker models + var ( + clusterCount int + controlplaneCount int + controlPlaneMachines MachineIDList + + workerMachineSetNameToCount = make(map[string]int) + workerMachineIDToWorkerMachineSets = make(map[MachineID][]string) + ) + + lockedMachines := make(map[MachineID]struct{}) + + for _, model := range l { + switch m := model.(type) { + case *Cluster: + clusterCount++ + case *ControlPlane: + controlplaneCount++ + + controlPlaneMachines = append(controlPlaneMachines, m.Machines...) + case *Workers: + workerMachineSetNameToCount[m.Name]++ + + for _, machineID := range m.Machines { + workerMachineIDToWorkerMachineSets[machineID] = append(workerMachineIDToWorkerMachineSets[machineID], m.Name) + } + case *Machine: + if m.Locked { + lockedMachines[m.Name] = struct{}{} + } + } + } + + if clusterCount != 1 { + multiErr = multierror.Append(multiErr, fmt.Errorf("template should contain 1 cluster, got %d", clusterCount)) + } + + if controlplaneCount != 1 { + multiErr = multierror.Append(multiErr, fmt.Errorf("template should contain 1 controlplane, got %d", controlplaneCount)) + } + + for name, count := range workerMachineSetNameToCount { + if count > 1 { + multiErr = multierror.Append(multiErr, fmt.Errorf("duplicate workers with name %q", name)) + } + } + + for machineID, machineSets := range workerMachineIDToWorkerMachineSets { + if len(machineSets) > 1 { + multiErr = multierror.Append(multiErr, fmt.Errorf("machine %q is used in multiple workers: %q", machineID, machineSets)) + } + } + + cpMachinesSet := xslices.ToSet(controlPlaneMachines) + workerMachines := maps.Keys(workerMachineIDToWorkerMachineSets) + + intersection := xslices.Filter(workerMachines, func(id MachineID) bool { + _, ok := cpMachinesSet[id] + + return ok + }) + + if len(intersection) != 0 { + multiErr = multierror.Append(multiErr, fmt.Errorf("machines %v are used in both controlplane and workers", intersection)) + } + + allMachines := append(slices.Clone(controlPlaneMachines), workerMachines...) + allMachinesSet := xslices.ToSet(allMachines) + + for _, model := range l { + if machine, ok := model.(*Machine); ok { + if _, ok := allMachinesSet[machine.Name]; !ok { + multiErr = multierror.Append(multiErr, fmt.Errorf("machine %q is not used in controlplane or workers", machine.Name)) + } + } + } + + for _, cpMachine := range controlPlaneMachines { + if _, ok := lockedMachines[cpMachine]; ok { + multiErr = multierror.Append(multiErr, fmt.Errorf("machine %q is locked and used in controlplane", cpMachine)) + } + } + + return multiErr +} + +// Translate a set of models (template) to a set of Omni resources. +// +// Translate assumes that the template is valid. +func (l List) Translate() ([]resource.Resource, error) { + context := TranslateContext{ + LockedMachines: make(map[MachineID]struct{}), + MachineDescriptors: make(map[MachineID]Descriptors), + } + + for _, model := range l { + switch m := model.(type) { + case *Cluster: + context.ClusterName = m.Name + case *Machine: + context.MachineDescriptors[m.Name] = m.Descriptors + + if m.Locked { + context.LockedMachines[m.Name] = struct{}{} + } + } + } + + var ( + multiErr error + resourcesList []resource.Resource + ) + + for _, model := range l { + resources, err := model.Translate(context) + if err != nil { + multiErr = multierror.Append(multiErr, err) + + continue + } + + resourcesList = append(resourcesList, resources...) + } + + // perform additional validation: + // - all resources except for cluster itself should have a cluster label + // - all resources should have a unique ID + resourceIDs := map[resource.Type]map[resource.ID]struct{}{} + + for _, r := range resourcesList { + if _, ok := resourceIDs[r.Metadata().Type()]; !ok { + resourceIDs[r.Metadata().Type()] = map[resource.ID]struct{}{} + } + + if _, ok := resourceIDs[r.Metadata().Type()][r.Metadata().ID()]; ok { + multiErr = multierror.Append(multiErr, fmt.Errorf("resource ID duplicate %s", resource.String(r))) + } + + resourceIDs[r.Metadata().Type()][r.Metadata().ID()] = struct{}{} + + if r.Metadata().Type() == omni.ClusterType { + continue + } + + if l, _ := r.Metadata().Labels().Get(omni.LabelCluster); l != context.ClusterName { + multiErr = multierror.Append(multiErr, fmt.Errorf("resource %q is missing cluster label", r.Metadata().ID())) + } + } + + return resourcesList, multiErr +} + +// ClusterName returns the name of the cluster in the template. +func (l List) ClusterName() (string, error) { + for _, model := range l { + if cluster, ok := model.(*Cluster); ok { + return cluster.Name, nil + } + } + + return "", fmt.Errorf("cluster model not found") +} diff --git a/client/pkg/template/internal/models/machine.go b/client/pkg/template/internal/models/machine.go new file mode 100644 index 00000000..c928e7aa --- /dev/null +++ b/client/pkg/template/internal/models/machine.go @@ -0,0 +1,145 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package models + +import ( + "fmt" + + "github.com/cosi-project/runtime/pkg/resource" + "github.com/google/uuid" + "github.com/hashicorp/go-multierror" + "github.com/siderolabs/gen/pair" + + "github.com/siderolabs/omni/client/pkg/constants" + "github.com/siderolabs/omni/client/pkg/omni/resources/omni" +) + +// MachineIDList is a list of Machine UUIDs. +type MachineIDList []MachineID + +// MachineID is a Machine UUID. +type MachineID string + +// KindMachine is a Machine model kind. +const KindMachine = "Machine" + +// Machine provides customization for a specific machine. +type Machine struct { //nolint:govet + Meta `yaml:",inline"` + + // Machine name (ID). + Name MachineID `yaml:"name"` + + // Descriptors are the user descriptors to apply to the cluster. + Descriptors Descriptors `yaml:",inline"` + + // Locked locks the machine, so no config updates, upgrades and downgrades will be performed on the machine. + Locked bool `yaml:"locked,omitempty"` + + // Install specification. + Install MachineInstall `yaml:"install,omitempty"` + + // ClusterMachine patches. + Patches PatchList `yaml:"patches,omitempty"` +} + +// MachineInstall provides machine install configuration. +type MachineInstall struct { + // Disk device name. + Disk string `yaml:"disk"` +} + +// Validate the list of machines. +func (l MachineIDList) Validate() error { + var multiErr error + + for _, id := range l { + multiErr = joinErrors(multiErr, id.Validate()) + } + + return multiErr +} + +// Validate the model. +func (id MachineID) Validate() error { + if _, err := uuid.Parse(string(id)); err != nil { + return fmt.Errorf("invalid machine ID %q: %w", id, err) + } + + return nil +} + +// Validate the model. +func (install *MachineInstall) Validate() error { + return nil +} + +// Validate the model. +func (machine *Machine) Validate() error { + var multiErr error + + if machine.Name == "" { + multiErr = multierror.Append(multiErr, fmt.Errorf("name is required for machine")) + } + + if err := machine.Descriptors.Validate(); err != nil { + multiErr = multierror.Append(multiErr, err) + } + + multiErr = joinErrors(multiErr, machine.Name.Validate(), machine.Install.Validate(), machine.Patches.Validate()) + + if multiErr != nil { + return fmt.Errorf("machine %q is invalid: %w", machine.Name, multiErr) + } + + return nil +} + +// Translate the model. +func (machine *Machine) Translate(context TranslateContext) ([]resource.Resource, error) { + var resourceList []resource.Resource + + if machine.Install.Disk != "" { + patch := Patch{ + Name: "install-disk", + Inline: map[string]any{ + "machine": map[string]any{ + "install": map[string]any{ + "disk": machine.Install.Disk, + }, + }, + }, + } + + patchResource, err := patch.Translate( + fmt.Sprintf("cm-%s", machine.Name), + constants.PatchWeightInstallDisk, + pair.MakePair(omni.LabelCluster, context.ClusterName), + pair.MakePair(omni.LabelClusterMachine, string(machine.Name)), + pair.MakePair(omni.LabelSystemPatch, ""), + ) + if err != nil { + return nil, err + } + + resourceList = append(resourceList, patchResource) + } + + patches, err := machine.Patches.Translate( + fmt.Sprintf("cm-%s", machine.Name), + constants.PatchBaseWeightClusterMachine, + pair.MakePair(omni.LabelCluster, context.ClusterName), + pair.MakePair(omni.LabelClusterMachine, string(machine.Name)), + ) + if err != nil { + return nil, err + } + + return append(resourceList, patches...), nil +} + +func init() { + register[Machine](KindMachine) +} diff --git a/client/pkg/template/internal/models/machineset.go b/client/pkg/template/internal/models/machineset.go new file mode 100644 index 00000000..8974328b --- /dev/null +++ b/client/pkg/template/internal/models/machineset.go @@ -0,0 +1,248 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package models + +import ( + "fmt" + "strconv" + + "github.com/cosi-project/runtime/pkg/resource" + "github.com/hashicorp/go-multierror" + "github.com/siderolabs/gen/pair" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/constants" + "github.com/siderolabs/omni/client/pkg/omni/resources" + "github.com/siderolabs/omni/client/pkg/omni/resources/omni" +) + +// MachineSet is a base model for controlplane and workers. +type MachineSet struct { + Meta `yaml:",inline"` + + // Name is the name of the machine set. When empty, the default name will be used. + Name string `yaml:"name,omitempty"` + + // Descriptors are the user descriptors to apply to the cluster. + Descriptors Descriptors `yaml:",inline"` + + BootstrapSpec *BootstrapSpec `yaml:"bootstrapSpec,omitempty"` + + // MachineSet machines. + Machines MachineIDList `yaml:"machines,omitempty"` + + MachineClass *MachineClassConfig `yaml:"machineClass,omitempty"` + + // UpdateStrategy defines the update strategy for the machine set. + UpdateStrategy *UpdateStrategyConfig `yaml:"updateStrategy,omitempty"` + + // DeleteStrategy defines the delete strategy for the machine set. + DeleteStrategy *UpdateStrategyConfig `yaml:"deleteStrategy,omitempty"` + + // MachineSet patches. + Patches PatchList `yaml:"patches,omitempty"` +} + +// BootstrapSpec defines the model for setting the bootstrap specification, i.e. restoring from a backup, in the machine set. +// Only valid for the control plane machine set. +type BootstrapSpec struct { + // ClusterUUID defines the UUID of the cluster to restore from. + ClusterUUID string `yaml:"clusterUUID"` + + // Snapshot defines the snapshot file name to restore from. + Snapshot string `yaml:"snapshot"` +} + +// MachineClassConfig defines the model for setting the machine class based machine selector in the machine set. +type MachineClassConfig struct { + // Name defines used machine class name. + Name string `yaml:"name"` + + // Size sets the number of machines to be pulled from the machine class. + Size Size `yaml:"size"` +} + +// Size extends protobuf generated allocation type enum to parse string constants. +type Size struct { + Value uint32 + AllocationType specs.MachineSetSpec_MachineClass_AllocationType +} + +// UnmarshalYAML implements yaml.Unmarshaler. +func (c *Size) UnmarshalYAML(unmarshal func(any) error) error { + var value string + + if err := unmarshal(&value); err != nil { + return err + } + + switch value { + case "unlimited", "∞", "infinity": + value = "Unlimited" + } + + v, ok := specs.MachineSetSpec_MachineClass_AllocationType_value[value] + + if !ok { + c.AllocationType = specs.MachineSetSpec_MachineClass_Static + + count, err := strconv.ParseUint(value, 10, 32) + if err != nil { + return fmt.Errorf("invalid machine count %s: %w", value, err) + } + + c.Value = uint32(count) + } + + c.AllocationType = specs.MachineSetSpec_MachineClass_AllocationType(v) + + return nil +} + +// MarshalYAML implements yaml.Marshaler. +func (c Size) MarshalYAML() (any, error) { + if c.AllocationType != specs.MachineSetSpec_MachineClass_Static { + return specs.MachineSetSpec_MachineClass_AllocationType_name[int32(c.AllocationType)], nil + } + + return c.Value, nil +} + +// UpdateStrategyType extends protobuf generated update strategy enum to parse string constants. +type UpdateStrategyType uint32 + +// UnmarshalYAML implements yaml.Unmarshaler. +func (t *UpdateStrategyType) UnmarshalYAML(unmarshal func(any) error) error { + var value string + + if err := unmarshal(&value); err != nil { + return err + } + + v, ok := specs.MachineSetSpec_UpdateStrategy_value[value] + + if !ok { + return fmt.Errorf("invalid update strategy type %s", value) + } + + *t = UpdateStrategyType(v) + + return nil +} + +// MarshalYAML implements yaml.Marshaler. +func (t UpdateStrategyType) MarshalYAML() (any, error) { + return specs.MachineSetSpec_UpdateStrategy_name[int32(t)], nil +} + +// RollingUpdateStrategyConfig defines the model for setting the rolling update strategy in the machine set. +type RollingUpdateStrategyConfig struct { + MaxParallelism uint32 `yaml:"maxParallelism,omitempty"` +} + +// UpdateStrategyConfig defines the model for setting the update strategy in the machine set. +type UpdateStrategyConfig struct { + Type *UpdateStrategyType `yaml:"type,omitempty"` + Rolling *RollingUpdateStrategyConfig `yaml:"rolling,omitempty"` +} + +// Validate checks the machine set fields correctness. +func (machineset *MachineSet) Validate() error { + var multiErr error + + if err := machineset.Descriptors.Validate(); err != nil { + multiErr = multierror.Append(multiErr, err) + } + + if len(machineset.Machines) > 0 && machineset.MachineClass != nil { + multiErr = multierror.Append(multiErr, fmt.Errorf("machine set can not have both machines and machine class defined")) + } + + return multiErr +} + +// Translate the model. +func (machineset *MachineSet) translate(ctx TranslateContext, nameSuffix, roleLabel string) ([]resource.Resource, error) { + id := omni.AdditionalWorkersResourceID(ctx.ClusterName, nameSuffix) + + machineSet := omni.NewMachineSet(resources.DefaultNamespace, id) + machineSet.Metadata().Labels().Set(omni.LabelCluster, ctx.ClusterName) + machineSet.Metadata().Labels().Set(roleLabel, "") + + machineset.Descriptors.Apply(machineSet) + + machineSet.TypedSpec().Value.UpdateStrategy = specs.MachineSetSpec_Rolling // Update strategy is Rolling when not specified. + + if machineset.UpdateStrategy != nil { + if machineset.UpdateStrategy.Type != nil { + machineSet.TypedSpec().Value.UpdateStrategy = specs.MachineSetSpec_UpdateStrategy(*machineset.UpdateStrategy.Type) + } + + if machineset.UpdateStrategy.Rolling != nil { + machineSet.TypedSpec().Value.UpdateStrategyConfig = &specs.MachineSetSpec_UpdateStrategyConfig{ + Rolling: &specs.MachineSetSpec_RollingUpdateStrategyConfig{ + MaxParallelism: machineset.UpdateStrategy.Rolling.MaxParallelism, + }, + } + } + } + + if machineset.DeleteStrategy != nil { + if machineset.DeleteStrategy.Type != nil { + machineSet.TypedSpec().Value.DeleteStrategy = specs.MachineSetSpec_UpdateStrategy(*machineset.DeleteStrategy.Type) + } + + if machineset.DeleteStrategy.Rolling != nil { + machineSet.TypedSpec().Value.DeleteStrategyConfig = &specs.MachineSetSpec_UpdateStrategyConfig{ + Rolling: &specs.MachineSetSpec_RollingUpdateStrategyConfig{ + MaxParallelism: machineset.DeleteStrategy.Rolling.MaxParallelism, + }, + } + } + } + + resourceList := []resource.Resource{machineSet} + + if machineset.BootstrapSpec != nil { + machineSet.TypedSpec().Value.BootstrapSpec = &specs.MachineSetSpec_BootstrapSpec{ + ClusterUuid: machineset.BootstrapSpec.ClusterUUID, + Snapshot: machineset.BootstrapSpec.Snapshot, + } + } + + if machineset.MachineClass != nil { + machineSet.TypedSpec().Value.MachineClass = &specs.MachineSetSpec_MachineClass{ + Name: machineset.MachineClass.Name, + MachineCount: machineset.MachineClass.Size.Value, + AllocationType: machineset.MachineClass.Size.AllocationType, + } + } else { + for _, machineID := range machineset.Machines { + machineSetNode := omni.NewMachineSetNode(resources.DefaultNamespace, string(machineID), machineSet) + descriptors := ctx.MachineDescriptors[machineID] + + descriptors.Apply(machineSetNode) + + _, locked := ctx.LockedMachines[machineID] + if locked { + machineSetNode.Metadata().Annotations().Set(omni.MachineLocked, "") + } + + resourceList = append(resourceList, machineSetNode) + } + } + + patches, err := machineset.Patches.Translate( + id, + constants.PatchBaseWeightMachineSet, + pair.MakePair(omni.LabelCluster, ctx.ClusterName), + pair.MakePair(omni.LabelMachineSet, id), + ) + if err != nil { + return nil, err + } + + return append(resourceList, patches...), nil +} diff --git a/client/pkg/template/internal/models/models.go b/client/pkg/template/internal/models/models.go new file mode 100644 index 00000000..68dc7e2b --- /dev/null +++ b/client/pkg/template/internal/models/models.go @@ -0,0 +1,103 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +// Package models provides cluster template models (for each sub-document of multi-doc YAML). +package models + +import ( + "fmt" + "strings" + + "github.com/cosi-project/runtime/pkg/resource" + "github.com/hashicorp/go-multierror" + + "github.com/siderolabs/omni/client/pkg/omni/resources/omni" +) + +// Meta is embedded into all template objects. +type Meta struct { + Kind string `yaml:"kind"` +} + +// TranslateContext is a context for translation. +type TranslateContext struct { + LockedMachines map[MachineID]struct{} + + MachineDescriptors map[MachineID]Descriptors + + // ClusterName is the name of the cluster. + ClusterName string +} + +// Descriptors are the user descriptors (i.e. Labels, Annotations) to apply to the resource. +type Descriptors struct { + // Labels are the user labels to apply to the resource. + Labels map[string]string `yaml:"labels,omitempty"` + + // Annotations are the user annotations to apply to the resource. + Annotations map[string]string `yaml:"annotations,omitempty"` +} + +// Validate validates the descriptors. +func (d *Descriptors) Validate() error { + var multiErr error + + for labelKey := range d.Labels { + if strings.HasPrefix(labelKey, omni.SystemLabelPrefix) { + multiErr = multierror.Append(multiErr, fmt.Errorf("label %q is invalid: prefix %q is reserved for internal use", labelKey, omni.SystemLabelPrefix)) + } + } + + for annotationKey := range d.Annotations { + if strings.HasPrefix(annotationKey, omni.SystemLabelPrefix) { + multiErr = multierror.Append(multiErr, fmt.Errorf("annotation %q is invalid: prefix %q is reserved for internal use", annotationKey, omni.SystemLabelPrefix)) + } + } + + return multiErr +} + +// Apply applies the descriptors to the given resource. +func (d *Descriptors) Apply(res resource.Resource) { + for k, v := range d.Labels { + res.Metadata().Labels().Set(k, v) + } + + for k, v := range d.Annotations { + res.Metadata().Annotations().Set(k, v) + } +} + +// Model is a base interface for cluster templates. +type Model interface { + Validate() error + Translate(TranslateContext) ([]resource.Resource, error) +} + +var registeredModels = map[string]func() Model{} + +type model[T any] interface { + *T + Model +} + +func register[T any, P model[T]](kind string) { + if _, ok := registeredModels[kind]; ok { + panic(fmt.Sprintf("model %s already registered", kind)) + } + + registeredModels[kind] = func() Model { + return P(new(T)) + } +} + +// New creates a model by kind. +func New(kind string) (Model, error) { + f, ok := registeredModels[kind] + if !ok { + return nil, fmt.Errorf("unknown model kind %q", kind) + } + + return f(), nil +} diff --git a/client/pkg/template/internal/models/patch.go b/client/pkg/template/internal/models/patch.go new file mode 100644 index 00000000..67c2bdce --- /dev/null +++ b/client/pkg/template/internal/models/patch.go @@ -0,0 +1,163 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package models + +import ( + "fmt" + "os" + + "github.com/cosi-project/runtime/pkg/resource" + "github.com/hashicorp/go-multierror" + "github.com/siderolabs/gen/pair" + "gopkg.in/yaml.v3" + + "github.com/siderolabs/omni/client/pkg/omni/resources" + "github.com/siderolabs/omni/client/pkg/omni/resources/omni" +) + +// PatchList is a list of patches. +type PatchList []Patch + +// Patch is a Talos machine configuration patch. +type Patch struct { //nolint:govet + // Name of the patch. + // + // Optional for 'path' patches, mandatory for 'inline' patches if idOverride is not set. + Name string `yaml:"name,omitempty"` + + // IDOverride overrides the ID of the patch. When set, the ID will not be generated using the name and/or the file path. + IDOverride string `yaml:"idOverride,omitempty"` + + // Descriptors are the user descriptors to apply to the resource. + Descriptors Descriptors `yaml:",inline"` + + // File path to the file containing the patch. + // + // Mutually exclusive with `inline:`. + File string `yaml:"file,omitempty"` + + // Inline patch content. + Inline map[string]any `yaml:"inline,omitempty"` +} + +// Validate the model. +func (l PatchList) Validate() error { + var multiErr error + + for _, patch := range l { + multiErr = joinErrors(multiErr, patch.Validate()) + } + + return multiErr +} + +// Translate the list of patches into a list of resources. +func (l PatchList) Translate(prefix string, baseWeight int, labels ...pair.Pair[string, string]) ([]resource.Resource, error) { + resources := make([]resource.Resource, 0, len(l)) + + for i, patch := range l { + r, err := patch.Translate(prefix, baseWeight+i, labels...) + if err != nil { + return nil, err + } + + resources = append(resources, r) + } + + return resources, nil +} + +// Validate the model. +func (patch *Patch) Validate() error { + var multiErr error + + name := patch.Name + if name == "" { + name = patch.File + } + + if err := patch.Descriptors.Validate(); err != nil { + multiErr = multierror.Append(multiErr, err) + } + + if patch.File != "" && patch.Inline != nil { + multiErr = multierror.Append(multiErr, fmt.Errorf("path and inline are mutually exclusive")) + } + + if patch.File == "" && patch.Inline == nil { + multiErr = multierror.Append(multiErr, fmt.Errorf("path or inline is required")) + } + + switch { + case patch.File != "": + raw, err := os.ReadFile(patch.File) + if err != nil { + multiErr = multierror.Append(multiErr, fmt.Errorf("failed to access %q: %w", patch.File, err)) + } else { + if err = omni.ValidateConfigPatch(string(raw)); err != nil { + multiErr = multierror.Append(multiErr, fmt.Errorf("failed to validate patch %q: %w", patch.File, err)) + } + } + case patch.Inline != nil: + if patch.Name == "" && patch.IDOverride == "" { + multiErr = multierror.Append(multiErr, fmt.Errorf("either name or idOverride is required for inline patches")) + } + + raw, err := yaml.Marshal(patch.Inline) + if err != nil { + multiErr = multierror.Append(multiErr, fmt.Errorf("failed to marshal inline patch %q: %w", name, err)) + } else { + if err = omni.ValidateConfigPatch(string(raw)); err != nil { + multiErr = multierror.Append(multiErr, fmt.Errorf("failed to validate inline patch %q: %w", name, err)) + } + } + } + + if multiErr != nil { + return fmt.Errorf("patch %q is invalid: %w", name, multiErr) + } + + return nil +} + +// Translate the model into a resource. +func (patch *Patch) Translate(prefix string, weight int, labels ...pair.Pair[string, string]) (*omni.ConfigPatch, error) { + name := patch.Name + if name == "" { + name = patch.File + } + + id := patch.IDOverride + if id == "" { + id = fmt.Sprintf("%03d-%s-%s", weight, prefix, name) + } + + var ( + raw []byte + err error + ) + + switch { + case patch.File != "": + raw, err = os.ReadFile(patch.File) + case patch.Inline != nil: + raw, err = yaml.Marshal(patch.Inline) + default: + panic("missing patch contents?") + } + + if err != nil { + return nil, fmt.Errorf("failed to read patch %q: %w", name, err) + } + + patchResource := omni.NewConfigPatch(resources.DefaultNamespace, id, labels...) + patchResource.Metadata().Annotations().Set("name", name) + + patch.Descriptors.Apply(patchResource) + + patchResource.TypedSpec().Value.Data = string(raw) + + return patchResource, nil +} diff --git a/client/pkg/template/internal/models/workers.go b/client/pkg/template/internal/models/workers.go new file mode 100644 index 00000000..b59c66f9 --- /dev/null +++ b/client/pkg/template/internal/models/workers.go @@ -0,0 +1,60 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package models + +import ( + "fmt" + + "github.com/cosi-project/runtime/pkg/resource" + "github.com/hashicorp/go-multierror" + + "github.com/siderolabs/omni/client/pkg/omni/resources/omni" +) + +// KindWorkers is Workers model kind. +const KindWorkers = "Workers" + +// Workers describes Cluster worker nodes. +type Workers struct { + MachineSet `yaml:",inline"` +} + +// Validate the model. +func (workers *Workers) Validate() error { + var multiErr error + + if workers.Name == omni.ControlPlanesIDSuffix { + multiErr = multierror.Append(multiErr, fmt.Errorf("name %q cannot be used in workers", omni.ControlPlanesIDSuffix)) + } + + if workers.BootstrapSpec != nil { + multiErr = multierror.Append(multiErr, fmt.Errorf("bootstrapSpec is not allowed in workers")) + } + + multiErr = joinErrors(multiErr, workers.MachineSet.Validate(), workers.Machines.Validate(), workers.Patches.Validate()) + + if multiErr != nil { + return fmt.Errorf("workers is invalid: %w", multiErr) + } + + return nil +} + +// Translate the model. +func (workers *Workers) Translate(ctx TranslateContext) ([]resource.Resource, error) { + var nameSuffix string + + if workers.Name == "" { + nameSuffix = omni.DefaultWorkersIDSuffix + } else { + nameSuffix = workers.Name + } + + return workers.translate(ctx, nameSuffix, omni.LabelWorkerRole) +} + +func init() { + register[Workers](KindWorkers) +} diff --git a/client/pkg/template/operations/delete.go b/client/pkg/template/operations/delete.go new file mode 100644 index 00000000..211014fd --- /dev/null +++ b/client/pkg/template/operations/delete.go @@ -0,0 +1,82 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package operations + +import ( + "context" + "fmt" + "io" + + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/state" + + "github.com/siderolabs/omni/client/pkg/omni/resources" + "github.com/siderolabs/omni/client/pkg/omni/resources/omni" + "github.com/siderolabs/omni/client/pkg/omni/resources/siderolink" + "github.com/siderolabs/omni/client/pkg/template" +) + +// DeleteTemplate removes all template resources from Omni. +func DeleteTemplate(ctx context.Context, templateReader io.Reader, out io.Writer, st state.State, syncOptions SyncOptions) error { + tmpl, err := template.Load(templateReader) + if err != nil { + return fmt.Errorf("error loading template: %w", err) + } + + if err = tmpl.Validate(); err != nil { + return err + } + + return deleteTemplate(ctx, tmpl, out, st, syncOptions) +} + +// DeleteCluster removes all cluster resources from Omni via template operations. +func DeleteCluster(ctx context.Context, clusterName string, out io.Writer, st state.State, syncOptions SyncOptions) error { + tmpl := template.WithCluster(clusterName) + + return deleteTemplate(ctx, tmpl, out, st, syncOptions) +} + +func deleteTemplate(ctx context.Context, tmpl *template.Template, out io.Writer, st state.State, syncOptions SyncOptions) error { + syncResult, err := tmpl.Delete(ctx, st) + if err != nil { + return err + } + + if syncOptions.DestroyMachines { + clusterName, err := tmpl.ClusterName() + if err != nil { + return err + } + + machines, err := st.List(ctx, resource.NewMetadata(resources.DefaultNamespace, omni.MachineStatusType, "", resource.VersionUndefined), + state.WithLabelQuery(resource.LabelExists(omni.MachineStatusLabelDisconnected), resource.LabelEqual(omni.LabelCluster, clusterName)), + ) + if err != nil { + return err + } + + var allPatches []resource.Resource + + links := make([]resource.Resource, 0, len(machines.Items)) + + for _, machine := range machines.Items { + patches, err := st.List(ctx, resource.NewMetadata(resources.DefaultNamespace, omni.ConfigPatchType, "", resource.VersionUndefined), + state.WithLabelQuery(resource.LabelEqual(omni.LabelMachine, machine.Metadata().ID())), + ) + if err != nil { + return err + } + + allPatches = append(allPatches, patches.Items...) + links = append(links, siderolink.NewLink(resources.DefaultNamespace, machine.Metadata().ID(), nil)) + } + + syncResult.Destroy = append([][]resource.Resource{links}, + append([][]resource.Resource{allPatches}, syncResult.Destroy...)...) + } + + return syncDelete(ctx, syncResult, out, st, syncOptions) +} diff --git a/client/pkg/template/operations/diff.go b/client/pkg/template/operations/diff.go new file mode 100644 index 00000000..9ca75ce9 --- /dev/null +++ b/client/pkg/template/operations/diff.go @@ -0,0 +1,55 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package operations + +import ( + "context" + "fmt" + "io" + + "github.com/cosi-project/runtime/pkg/state" + + "github.com/siderolabs/omni/client/pkg/template" + "github.com/siderolabs/omni/client/pkg/template/operations/internal/utils" +) + +// DiffTemplate outputs the diff between template resources and existing resources. +func DiffTemplate(ctx context.Context, templateReader io.Reader, output io.Writer, st state.State) error { + tmpl, err := template.Load(templateReader) + if err != nil { + return fmt.Errorf("error loading template: %w", err) + } + + if err = tmpl.Validate(); err != nil { + return err + } + + syncResult, err := tmpl.Sync(ctx, st) + if err != nil { + return fmt.Errorf("error syncing template: %w", err) + } + + for _, p := range syncResult.Update { + if err = utils.RenderDiff(output, p.Old, p.New); err != nil { + return err + } + } + + for _, r := range syncResult.Create { + if err = utils.RenderDiff(output, nil, r); err != nil { + return err + } + } + + for _, phase := range syncResult.Destroy { + for _, r := range phase { + if err = utils.RenderDiff(output, r, nil); err != nil { + return err + } + } + } + + return nil +} diff --git a/client/pkg/template/operations/export.go b/client/pkg/template/operations/export.go new file mode 100644 index 00000000..c27cc972 --- /dev/null +++ b/client/pkg/template/operations/export.go @@ -0,0 +1,523 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package operations + +import ( + "context" + "errors" + "fmt" + "io" + "slices" + "strings" + "time" + + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/safe" + "github.com/cosi-project/runtime/pkg/state" + "github.com/siderolabs/gen/xslices" + "github.com/siderolabs/go-pointer" + "gopkg.in/yaml.v3" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/constants" + "github.com/siderolabs/omni/client/pkg/omni/resources/omni" + "github.com/siderolabs/omni/client/pkg/template/internal/models" +) + +type clusterResources struct { + machineSetNodes map[string][]*omni.MachineSetNode + machineSetConfigPatches map[string][]*omni.ConfigPatch + clusterMachineConfigPatches map[string][]*omni.ConfigPatch + clusterMachineInstallDisks map[string]string + + cluster *omni.Cluster + + machineSets []*omni.MachineSet + clusterConfigPatches []*omni.ConfigPatch +} + +// ExportTemplate exports the cluster configuration as a template. +func ExportTemplate(ctx context.Context, st state.State, clusterID string, writer io.Writer) (models.List, error) { + resources, err := collectClusterResources(ctx, st, clusterID) + if err != nil { + return nil, err + } + + clusterModel, err := transformClusterToModel(resources.cluster, resources.clusterConfigPatches) + if err != nil { + return nil, err + } + + var controlPlaneMachineSetModel models.ControlPlane + + workerMachineSetModels := make([]models.Workers, 0, len(resources.machineSets)) + + for _, machineSet := range resources.machineSets { + machineSetModel, transformErr := transformMachineSetToModel(machineSet, + resources.machineSetNodes[machineSet.Metadata().ID()], + resources.machineSetConfigPatches[machineSet.Metadata().ID()]) + if transformErr != nil { + return nil, transformErr + } + + if _, isControlPlane := machineSet.Metadata().Labels().Get(omni.LabelControlPlaneRole); isControlPlane { + controlPlaneMachineSetModel = models.ControlPlane{MachineSet: machineSetModel} + + continue + } + + workerMachineSetModels = append(workerMachineSetModels, models.Workers{MachineSet: machineSetModel}) + } + + machineModels := make([]models.Machine, 0, len(resources.machineSetNodes)) + + for _, machineSetNodes := range resources.machineSetNodes { + for _, machineSetNode := range machineSetNodes { + machineModel, transformErr := transformMachineSetNodeToModel(machineSetNode, + resources.clusterMachineConfigPatches[machineSetNode.Metadata().ID()], + resources.clusterMachineInstallDisks[machineSetNode.Metadata().ID()], + ) + if transformErr != nil { + return nil, transformErr + } + + machineModels = append(machineModels, machineModel) + } + } + + modelList := buildModelList(clusterModel, controlPlaneMachineSetModel, workerMachineSetModels, machineModels) + if err = modelList.Validate(); err != nil { + return nil, fmt.Errorf("error validating models: %w", err) + } + + return modelList, writeYAML(writer, modelList) +} + +func buildModelList(clusterModel models.Cluster, controlPlaneMachineSetModel models.ControlPlane, + workerMachineSetModels []models.Workers, machineModels []models.Machine, +) models.List { + modelList := models.List{ + &clusterModel, + &controlPlaneMachineSetModel, + } + + slices.SortFunc(workerMachineSetModels, func(a, b models.Workers) int { + return strings.Compare(a.Name, b.Name) + }) + + for _, workerMachineSetModel := range workerMachineSetModels { + workerMachineSetModel := workerMachineSetModel + + modelList = append(modelList, &workerMachineSetModel) + } + + slices.SortFunc(machineModels, func(a, b models.Machine) int { + return strings.Compare(string(a.Name), string(b.Name)) + }) + + for _, machineModel := range machineModels { + machineModel := machineModel + + modelList = append(modelList, &machineModel) + } + + return modelList +} + +func writeYAML(writer io.Writer, modelList models.List) (err error) { + encoder := yaml.NewEncoder(writer) + + defer func() { + err = errors.Join(err, encoder.Close()) + }() + + encoder.SetIndent(2) + + for _, model := range modelList { + if err = encoder.Encode(model); err != nil { + return fmt.Errorf("error encoding model: %w", err) + } + } + + return nil +} + +func transformConfigPatchToModel(configPatch *omni.ConfigPatch) (models.Patch, error) { + var data map[string]any + + if err := yaml.Unmarshal([]byte(configPatch.TypedSpec().Value.GetData()), &data); err != nil { + return models.Patch{}, fmt.Errorf("failed to unmarshal patch %q: %w", configPatch.Metadata().ID(), err) + } + + return models.Patch{ + Descriptors: getUserDescriptors(configPatch), + IDOverride: configPatch.Metadata().ID(), + Inline: data, + }, nil +} + +func transformConfigPatchesToModels(configPatches []*omni.ConfigPatch) (models.PatchList, error) { + patchModels := make(models.PatchList, 0, len(configPatches)) + + for _, configPatch := range configPatches { + patchModel, err := transformConfigPatchToModel(configPatch) + if err != nil { + return nil, err + } + + patchModels = append(patchModels, patchModel) + } + + slices.SortFunc(patchModels, func(a, b models.Patch) int { + return strings.Compare(a.IDOverride, b.IDOverride) + }) + + return patchModels, nil +} + +func transformMachineSetNodeToModel(machineSetNode *omni.MachineSetNode, patches []*omni.ConfigPatch, installDisk string) (models.Machine, error) { + _, locked := machineSetNode.Metadata().Annotations().Get(omni.MachineLocked) + + patchModels, err := transformConfigPatchesToModels(patches) + if err != nil { + return models.Machine{}, err + } + + return models.Machine{ + Meta: models.Meta{ + Kind: models.KindMachine, + }, + Name: models.MachineID(machineSetNode.Metadata().ID()), + Descriptors: getUserDescriptors(machineSetNode), + Locked: locked, + Install: models.MachineInstall{ + Disk: installDisk, + }, + Patches: patchModels, + }, nil +} + +func transformMachineSetToModel(machineSet *omni.MachineSet, nodes []*omni.MachineSetNode, patches []*omni.ConfigPatch) (models.MachineSet, error) { + cluster, _ := machineSet.Metadata().Labels().Get(omni.LabelCluster) + _, isControlPlane := machineSet.Metadata().Labels().Get(omni.LabelControlPlaneRole) + _, isWorker := machineSet.Metadata().Labels().Get(omni.LabelWorkerRole) + + if !isControlPlane && !isWorker { + return models.MachineSet{}, fmt.Errorf("machine set %q has no role label", machineSet.Metadata().ID()) + } + + spec := machineSet.TypedSpec().Value + + var bootstrapSpec *models.BootstrapSpec + + if spec.GetBootstrapSpec() != nil { + bootstrapSpec = &models.BootstrapSpec{ + ClusterUUID: spec.GetBootstrapSpec().GetClusterUuid(), + Snapshot: spec.GetBootstrapSpec().GetSnapshot(), + } + } + + var ( + machineIDs models.MachineIDList + machineClassConfig *models.MachineClassConfig + ) + + if spec.GetMachineClass() != nil { + machineClassConfig = &models.MachineClassConfig{ + Name: spec.GetMachineClass().GetName(), + Size: models.Size{ + Value: spec.GetMachineClass().GetMachineCount(), + AllocationType: spec.GetMachineClass().GetAllocationType(), + }, + } + } else { + machineIDs = xslices.Map(nodes, func(node *omni.MachineSetNode) models.MachineID { + return models.MachineID(node.Metadata().ID()) + }) + + slices.Sort(machineIDs) + } + + var updateStrategyConfig *models.UpdateStrategyConfig + + if spec.GetUpdateStrategyConfig() != nil { + updateStrategyConfig = &models.UpdateStrategyConfig{} + + if spec.GetUpdateStrategy() != specs.MachineSetSpec_Rolling { // Rolling is the default for update, so set the strategy type only when it is not Rolling. + updateStrategyConfig.Type = pointer.To(models.UpdateStrategyType(spec.GetUpdateStrategy())) + } + + if spec.GetUpdateStrategyConfig().GetRolling() != nil { + updateStrategyConfig.Rolling = &models.RollingUpdateStrategyConfig{ + MaxParallelism: spec.GetUpdateStrategyConfig().GetRolling().GetMaxParallelism(), + } + } + } + + var deleteStrategyConfig *models.UpdateStrategyConfig + + if spec.GetDeleteStrategyConfig() != nil { + deleteStrategyConfig = &models.UpdateStrategyConfig{} + + if spec.GetDeleteStrategy() != specs.MachineSetSpec_Unset { // Unset is the default for delete, so set the strategy type only when it is not Unset. + deleteStrategyConfig.Type = pointer.To(models.UpdateStrategyType(spec.GetDeleteStrategy())) + } + + if spec.GetDeleteStrategyConfig().GetRolling() != nil { + deleteStrategyConfig.Rolling = &models.RollingUpdateStrategyConfig{ + MaxParallelism: spec.GetDeleteStrategyConfig().GetRolling().GetMaxParallelism(), + } + } + } + + kind := models.KindControlPlane + if isWorker { + kind = models.KindWorkers + } + + name := "" + if isWorker && machineSet.Metadata().ID() != omni.WorkersResourceID(cluster) { + name = strings.TrimPrefix(machineSet.Metadata().ID(), cluster+"-") + } + + patchModels, err := transformConfigPatchesToModels(patches) + if err != nil { + return models.MachineSet{}, err + } + + return models.MachineSet{ + Meta: models.Meta{ + Kind: kind, + }, + Name: name, + Descriptors: getUserDescriptors(machineSet), + BootstrapSpec: bootstrapSpec, + Machines: machineIDs, + MachineClass: machineClassConfig, + Patches: patchModels, + UpdateStrategy: updateStrategyConfig, + DeleteStrategy: deleteStrategyConfig, + }, nil +} + +func transformClusterToModel(cluster *omni.Cluster, patches []*omni.ConfigPatch) (models.Cluster, error) { + spec := cluster.TypedSpec().Value + backupIntervalDuration := time.Duration(0) + + if spec.GetBackupConfiguration().GetInterval() != nil { + backupIntervalDuration = spec.GetBackupConfiguration().GetInterval().AsDuration() + } + + patchModels, err := transformConfigPatchesToModels(patches) + if err != nil { + return models.Cluster{}, err + } + + return models.Cluster{ + Meta: models.Meta{ + Kind: models.KindCluster, + }, + Name: cluster.Metadata().ID(), + Descriptors: getUserDescriptors(cluster), + Kubernetes: models.KubernetesCluster{ + Version: "v" + spec.GetKubernetesVersion(), + }, + Talos: models.TalosCluster{ + Version: "v" + spec.GetTalosVersion(), + }, + Features: models.Features{ + DiskEncryption: spec.GetFeatures().GetDiskEncryption(), + EnableWorkloadProxy: spec.GetFeatures().GetEnableWorkloadProxy(), + BackupConfiguration: models.BackupConfiguration{ + Interval: backupIntervalDuration, + }, + }, + Patches: patchModels, + }, nil +} + +func getUserDescriptors(res resource.Resource) models.Descriptors { + rawLabels := res.Metadata().Labels().Raw() + labels := make(map[string]string, len(rawLabels)) + + for k, v := range res.Metadata().Labels().Raw() { + if !strings.HasPrefix(k, omni.SystemLabelPrefix) { + labels[k] = v + } + } + + rawAnnotations := res.Metadata().Annotations().Raw() + annotations := make(map[string]string, len(rawAnnotations)) + + for k, v := range res.Metadata().Annotations().Raw() { + if !strings.HasPrefix(k, omni.SystemLabelPrefix) { + annotations[k] = v + } + } + + return models.Descriptors{ + Labels: labels, + Annotations: annotations, + } +} + +func collectClusterResources(ctx context.Context, st state.State, clusterID string) (clusterResources, error) { + cluster, err := safe.StateGetByID[*omni.Cluster](ctx, st, clusterID) + if err != nil { + return clusterResources{}, fmt.Errorf("error getting cluster %q: %w", clusterID, err) + } + + machineSetList, err := safe.StateListAll[*omni.MachineSet](ctx, st, state.WithLabelQuery(resource.LabelEqual(omni.LabelCluster, clusterID))) + if err != nil { + return clusterResources{}, fmt.Errorf("error listing machine sets of cluster %q: %w", clusterID, err) + } + + machineSetIDToMachineSet := listToMap(machineSetList, func(machineSet *omni.MachineSet) resource.ID { + return machineSet.Metadata().ID() + }) + + machineSetNodeList, err := safe.StateListAll[*omni.MachineSetNode](ctx, st, state.WithLabelQuery(resource.LabelEqual(omni.LabelCluster, clusterID))) + if err != nil { + return clusterResources{}, fmt.Errorf("error listing machine set nodes of cluster %q: %w", clusterID, err) + } + + machineSetNodes := make(map[string][]*omni.MachineSetNode, machineSetNodeList.Len()) + + for iter := machineSetNodeList.Iterator(); iter.Next(); { + machineSetNode := iter.Value() + + machineSetLabel, ok := machineSetNode.Metadata().Labels().Get(omni.LabelMachineSet) + if !ok { + return clusterResources{}, fmt.Errorf("machine set node %q has no machine set label", machineSetNode.Metadata().ID()) + } + + machineSet, ok := machineSetIDToMachineSet[machineSetLabel] + if !ok { + return clusterResources{}, fmt.Errorf("unexpected machine set label %q", machineSetLabel) + } + + // skip the node if its machine set picks machines from a machine class + if machineSet.TypedSpec().Value.GetMachineClass() != nil { + continue + } + + machineSetNodes[machineSetLabel] = append(machineSetNodes[machineSetLabel], machineSetNode) + } + + configPatchList, err := safe.StateListAll[*omni.ConfigPatch](ctx, st, state.WithLabelQuery(resource.LabelEqual(omni.LabelCluster, clusterID))) + if err != nil { + return clusterResources{}, fmt.Errorf("error listing config patches of cluster %q: %w", clusterID, err) + } + + clusterConfigPatches := make([]*omni.ConfigPatch, 0, configPatchList.Len()) + machineSetConfigPatches := make(map[string][]*omni.ConfigPatch, configPatchList.Len()) + clusterMachineConfigPatches := make(map[string][]*omni.ConfigPatch, configPatchList.Len()) + clusterMachineInstallDisks := make(map[string]string, configPatchList.Len()) + + for iter := configPatchList.Iterator(); iter.Next(); { + configPatch := iter.Value() + + // skip the patches with an owner, as they are not user-defined + if configPatch.Metadata().Owner() != "" { + continue + } + + if clusterMachineLabel, ok := configPatch.Metadata().Labels().Get(omni.LabelClusterMachine); ok { + installDisk := getInstallDiskFromConfigPatch(configPatch) + if installDisk != "" { + clusterMachineInstallDisks[clusterMachineLabel] = installDisk + + // this is an install disk patch, therefore it will be set as the machine's install disk on the Machine model, + // not in patches, so we skip adding it to the set of regular patches + continue + } + + clusterMachineConfigPatches[clusterMachineLabel] = append(clusterMachineConfigPatches[clusterMachineLabel], configPatch) + + continue + } + + if machineSetLabel, ok := configPatch.Metadata().Labels().Get(omni.LabelMachineSet); ok { + machineSetConfigPatches[machineSetLabel] = append(machineSetConfigPatches[machineSetLabel], configPatch) + + continue + } + + if _, ok := configPatch.Metadata().Labels().Get(omni.LabelCluster); ok { + clusterConfigPatches = append(clusterConfigPatches, configPatch) + } + } + + return clusterResources{ + cluster: cluster, + machineSets: listToSlice(machineSetList), + machineSetNodes: machineSetNodes, + clusterConfigPatches: clusterConfigPatches, + machineSetConfigPatches: machineSetConfigPatches, + clusterMachineConfigPatches: clusterMachineConfigPatches, + clusterMachineInstallDisks: clusterMachineInstallDisks, + }, nil +} + +func getInstallDiskFromConfigPatch(configPatch *omni.ConfigPatch) string { + clusterMachine, ok := configPatch.Metadata().Labels().Get(omni.LabelClusterMachine) + if !ok { + return "" + } + + expectedID := fmt.Sprintf("%03d-cm-%s-install-disk", constants.PatchWeightInstallDisk, clusterMachine) + if configPatch.Metadata().ID() != expectedID { + return "" + } + + var data map[string]any + + if err := yaml.Unmarshal([]byte(configPatch.TypedSpec().Value.GetData()), &data); err != nil { + return "" // ignore the error, as it will be caught by the validation later + } + + machine, ok := data["machine"].(map[string]any) + if !ok { + return "" + } + + install, ok := machine["install"].(map[string]any) + if !ok { + return "" + } + + if slices.ContainsFunc([]map[string]any{data, machine, install}, func(m map[string]any) bool { return len(m) != 1 }) { + return "" // there is some data in the patch other than the install disk, so it cannot be converted into install.disk block in the Machine model + } + + disk, ok := install["disk"].(string) + if !ok { + return "" + } + + return disk +} + +func listToSlice[T resource.Resource](list safe.List[T]) []T { + result := make([]T, 0, list.Len()) + + for iter := list.Iterator(); iter.Next(); { + result = append(result, iter.Value()) + } + + return result +} + +func listToMap[K comparable, T resource.Resource](list safe.List[T], keyFunc func(T) K) map[K]T { + result := make(map[K]T, list.Len()) + + for iter := list.Iterator(); iter.Next(); { + value := iter.Value() + + result[keyFunc(value)] = value + } + + return result +} diff --git a/client/pkg/template/operations/export_test.go b/client/pkg/template/operations/export_test.go new file mode 100644 index 00000000..cb1c08fa --- /dev/null +++ b/client/pkg/template/operations/export_test.go @@ -0,0 +1,213 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package operations_test + +import ( + "bytes" + "context" + _ "embed" + "errors" + "io" + "reflect" + "strings" + "testing" + "time" + + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/safe" + "github.com/cosi-project/runtime/pkg/state" + "github.com/cosi-project/runtime/pkg/state/impl/inmem" + "github.com/cosi-project/runtime/pkg/state/impl/namespaced" + "github.com/siderolabs/gen/maps" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "gopkg.in/yaml.v3" + + "github.com/siderolabs/omni/client/pkg/omni/resources/omni" + "github.com/siderolabs/omni/client/pkg/template/internal/models" + "github.com/siderolabs/omni/client/pkg/template/operations" +) + +//go:embed testdata/export/cluster-template.yaml +var clusterTemplate string + +//go:embed testdata/export/cluster-resources.yaml +var clusterResources []byte + +type resources struct { + clusters map[string]*omni.Cluster + machineSets map[string]*omni.MachineSet + machineSetNodes map[string]*omni.MachineSetNode + configPatches map[string]*omni.ConfigPatch +} + +func TestExport(t *testing.T) { + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + t.Cleanup(cancel) + + st := buildState(ctx, t) + + // export a template from resources created via the UI + exportedTemplate := assertTemplate(ctx, t, st) + + // sync the exported template back into the state and assert that the state is unchanged + assertSync(ctx, t, st, exportedTemplate) + + // export a template one more time and assert that it's still the same as the first exported template + assertTemplate(ctx, t, st) +} + +// assertSync asserts that the state is unchanged after syncing back the exported template. +func assertSync(ctx context.Context, t *testing.T, st state.State, exportedTemplate string) { + var sb strings.Builder + + resourcesBeforeSync := readResources(ctx, t, st) + + err := operations.SyncTemplate(ctx, strings.NewReader(exportedTemplate), &sb, st, operations.SyncOptions{}) + require.NoError(t, err) + + resourcesAfterSync := readResources(ctx, t, st) + + assert.ElementsMatch(t, maps.Keys(resourcesBeforeSync.clusters), maps.Keys(resourcesAfterSync.clusters)) + assert.ElementsMatch(t, maps.Keys(resourcesBeforeSync.machineSets), maps.Keys(resourcesAfterSync.machineSets)) + assert.ElementsMatch(t, maps.Keys(resourcesBeforeSync.machineSetNodes), maps.Keys(resourcesAfterSync.machineSetNodes)) + assert.ElementsMatch(t, maps.Keys(resourcesBeforeSync.configPatches), maps.Keys(resourcesAfterSync.configPatches)) + + // we expect everything other than config patches to be completely unchanged + assertVersionsUnchanged(t, resourcesBeforeSync.clusters, resourcesAfterSync.clusters) + assertVersionsUnchanged(t, resourcesBeforeSync.machineSets, resourcesAfterSync.machineSets) + assertVersionsUnchanged(t, resourcesBeforeSync.machineSetNodes, resourcesAfterSync.machineSetNodes) + + // config patches might be updated due to discrepancies between how the cluster templates and the frontend generate them, e.g.: + // they might differ in the indentation/comments of the patch data, so we do a yaml-equality check on data instead of byte-equality. + assertConfigPatches(t, resourcesBeforeSync.configPatches, resourcesAfterSync.configPatches) +} + +func assertVersionsUnchanged[T resource.Resource](t *testing.T, before map[resource.ID]T, after map[resource.ID]T) { + for _, beforeResource := range before { + afterResource := after[beforeResource.Metadata().ID()] + + assert.Equal(t, beforeResource.Metadata().Version(), afterResource.Metadata().Version(), "resource version changed for resource: %q", beforeResource.Metadata()) + } +} + +func assertConfigPatches(t *testing.T, before map[string]*omni.ConfigPatch, after map[string]*omni.ConfigPatch) { + for _, beforeConfigPatch := range before { + afterConfigPatch := after[beforeConfigPatch.Metadata().ID()] + + if beforeConfigPatch.Metadata().Version().Equal(afterConfigPatch.Metadata().Version()) { + continue + } + + assert.Equal(t, beforeConfigPatch.Metadata().Labels(), afterConfigPatch.Metadata().Labels(), "labels changed for resource: %q", beforeConfigPatch.Metadata()) + assert.Equal(t, beforeConfigPatch.Metadata().Annotations(), afterConfigPatch.Metadata().Annotations(), "annotations changed for resource: %q", beforeConfigPatch.Metadata()) + + assert.YAMLEq(t, beforeConfigPatch.TypedSpec().Value.GetData(), afterConfigPatch.TypedSpec().Value.GetData(), + "config patch data changed for resource: %q", beforeConfigPatch.Metadata()) + } +} + +func readResources(ctx context.Context, t *testing.T, st state.State) resources { + clusterList, err := safe.StateListAll[*omni.Cluster](ctx, st) + require.NoError(t, err) + + machineSetList, err := safe.StateListAll[*omni.MachineSet](ctx, st) + require.NoError(t, err) + + machineSetNodeList, err := safe.StateListAll[*omni.MachineSetNode](ctx, st) + require.NoError(t, err) + + configPatchList, err := safe.StateListAll[*omni.ConfigPatch](ctx, st) + require.NoError(t, err) + + return resources{ + clusters: listToMap(clusterList), + machineSets: listToMap(machineSetList), + machineSetNodes: listToMap(machineSetNodeList), + configPatches: listToMap(configPatchList), + } +} + +func assertTemplate(ctx context.Context, t *testing.T, st state.State) string { + var sb strings.Builder + + modelList, err := operations.ExportTemplate(ctx, st, "export-test", &sb) + require.NoError(t, err) + + assertAllFieldsSet(t, modelList) + + assert.Equal(t, clusterTemplate, sb.String()) + + return clusterTemplate +} + +// assertAllFieldsSet asserts that all fields of the models are set at least once. +// This is to ensure that the exporter is handling all fields of the models as new fields are added. +func assertAllFieldsSet(t *testing.T, modelList models.List) { + machineSetTypeName := reflect.TypeOf(models.MachineSet{}).String() + modelFieldToIsZero := make(map[string]bool) + + for _, model := range modelList { + modelValue := reflect.ValueOf(model).Elem() + modelType := modelValue.Type() + remainingMachineSetFieldCount := 0 + + for _, visibleField := range reflect.VisibleFields(modelType) { + modelField := modelType.String() + "." + visibleField.Name + + // if the field belongs to the MachineSet struct, we do not want to check twice for ControlPlane and Workers types + if visibleField.Anonymous && visibleField.Type.String() == machineSetTypeName { + remainingMachineSetFieldCount = len(reflect.VisibleFields(visibleField.Type)) + } else { + remainingMachineSetFieldCount-- + } + + if remainingMachineSetFieldCount >= 0 { // the field belongs to the MachineSet Anonymous field + modelField = machineSetTypeName + "." + visibleField.Name + } + + if isZero, ok := modelFieldToIsZero[modelField]; !ok || isZero { + modelFieldToIsZero[modelField] = modelValue.FieldByName(visibleField.Name).IsZero() + } + } + } + + for modelField, isZero := range modelFieldToIsZero { + assert.False(t, isZero, "field %q was never set, is the field handled by the exporter?", modelField) + } +} + +func buildState(ctx context.Context, t *testing.T) state.State { + st := state.WrapCore(namespaced.NewState(inmem.Build)) + dec := yaml.NewDecoder(bytes.NewReader(clusterResources)) + + for { + var res protobuf.YAMLResource + + err := dec.Decode(&res) + if errors.Is(err, io.EOF) { + break + } + + require.NoError(t, err) + + require.NoError(t, st.Create(ctx, res.Resource(), state.WithCreateOwner(res.Resource().Metadata().Owner()))) + } + + return st +} + +func listToMap[T resource.Resource](list safe.List[T]) map[resource.ID]T { + result := make(map[resource.ID]T, list.Len()) + + for iter := list.Iterator(); iter.Next(); { + value := iter.Value() + + result[value.Metadata().ID()] = value + } + + return result +} diff --git a/client/pkg/template/operations/internal/statustree/helpers.go b/client/pkg/template/operations/internal/statustree/helpers.go new file mode 100644 index 00000000..990f7293 --- /dev/null +++ b/client/pkg/template/operations/internal/statustree/helpers.go @@ -0,0 +1,204 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package statustree + +import ( + "fmt" + + "github.com/fatih/color" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources/omni" +) + +func readyString(ready bool) string { + if ready { + return color.GreenString("Ready") + } + + return color.RedString("Not Ready") +} + +func clusterPhaseString(phase specs.ClusterStatusSpec_Phase) string { + phaseString := phase.String() + + var c func(string, ...any) string + + switch phase { + case specs.ClusterStatusSpec_UNKNOWN: + c = color.YellowString + case specs.ClusterStatusSpec_SCALING_UP, + specs.ClusterStatusSpec_SCALING_DOWN: + c = color.HiYellowString + case specs.ClusterStatusSpec_DESTROYING: + c = color.HiRedString + case specs.ClusterStatusSpec_RUNNING: + c = color.GreenString + default: + c = fmt.Sprintf + } + + return c(phaseString) +} + +func kubernetesUpgradePhaseString(phase specs.KubernetesUpgradeStatusSpec_Phase) string { + phaseString := phase.String() + + var c func(string, ...any) string + + switch phase { + case specs.KubernetesUpgradeStatusSpec_Done: + c = color.GreenString + case specs.KubernetesUpgradeStatusSpec_Upgrading, specs.KubernetesUpgradeStatusSpec_Reverting: + c = color.HiYellowString + case specs.KubernetesUpgradeStatusSpec_Failed: + c = color.HiRedString + case specs.KubernetesUpgradeStatusSpec_Unknown: + c = fmt.Sprintf + default: + c = fmt.Sprintf + } + + return c(phaseString) +} + +func talosUpgradePhaseString(phase specs.TalosUpgradeStatusSpec_Phase) string { + phaseString := phase.String() + + var c func(string, ...any) string + + switch phase { + case specs.TalosUpgradeStatusSpec_Done: + c = color.GreenString + case specs.TalosUpgradeStatusSpec_Upgrading, specs.TalosUpgradeStatusSpec_Reverting: + c = color.HiYellowString + case specs.TalosUpgradeStatusSpec_Failed: + c = color.HiRedString + case specs.TalosUpgradeStatusSpec_Unknown: + c = fmt.Sprintf + default: + c = fmt.Sprintf + } + + return c(phaseString) +} + +func machineSetPhaseString(phase specs.MachineSetPhase) string { + phaseString := phase.String() + + var c func(string, ...any) string + + switch phase { + case specs.MachineSetPhase_Unknown: + c = color.YellowString + case specs.MachineSetPhase_ScalingUp, + specs.MachineSetPhase_ScalingDown, + specs.MachineSetPhase_Reconfiguring: + c = color.HiYellowString + case specs.MachineSetPhase_Destroying, specs.MachineSetPhase_Failed: + c = color.HiRedString + case specs.MachineSetPhase_Running: + c = color.GreenString + default: + c = fmt.Sprintf + } + + return c(phaseString) +} + +func clusterMachineStageString(phase specs.ClusterMachineStatusSpec_Stage) string { + phaseString := phase.String() + + var c func(string, ...any) string + + switch phase { + case specs.ClusterMachineStatusSpec_UNKNOWN: + c = color.YellowString + case specs.ClusterMachineStatusSpec_CONFIGURING, + specs.ClusterMachineStatusSpec_INSTALLING, + specs.ClusterMachineStatusSpec_UPGRADING, + specs.ClusterMachineStatusSpec_REBOOTING, + specs.ClusterMachineStatusSpec_BOOTING: + c = color.HiYellowString + case specs.ClusterMachineStatusSpec_BEFORE_DESTROY, + specs.ClusterMachineStatusSpec_DESTROYING, + specs.ClusterMachineStatusSpec_SHUTTING_DOWN: + c = color.HiRedString + case specs.ClusterMachineStatusSpec_RUNNING: + c = color.GreenString + default: + c = fmt.Sprintf + } + + return c(phaseString) +} + +func clusterMachineConnected(clusterMachine *omni.ClusterMachineStatus) string { + _, connected := clusterMachine.Metadata().Labels().Get(omni.MachineStatusLabelConnected) + if connected { + return "" + } + + return " " + color.RedString("Unreachable") +} + +func clusterMachineConfigOutdated(outdated bool) string { + if !outdated { + return "" + } + + return " " + color.YellowString("Config Outdated") +} + +func clusterMachineConfigStatus(status specs.ConfigApplyStatus) string { + switch status { + case specs.ConfigApplyStatus_UNKNOWN, + specs.ConfigApplyStatus_PENDING, + specs.ConfigApplyStatus_APPLIED: + return "" + case specs.ConfigApplyStatus_FAILED: + return " " + color.RedString("Config Apply Failed") + default: + return "" + } +} + +func clusterMachineReadyString(clusterMachine *omni.ClusterMachineStatus) string { + if clusterMachine.TypedSpec().Value.Stage != specs.ClusterMachineStatusSpec_RUNNING { + return "" + } + + return " " + readyString(clusterMachine.TypedSpec().Value.Ready) +} + +func controlPlaneStatusString(cpStatus *omni.ControlPlaneStatus) string { + var failedConditions []specs.ConditionType + + for _, condition := range cpStatus.TypedSpec().Value.GetConditions() { + if condition.GetStatus() == specs.ControlPlaneStatusSpec_Condition_NotReady { + failedConditions = append(failedConditions, condition.GetType()) + } + } + + if len(failedConditions) == 0 { + return color.GreenString("OK") + } + + return color.RedString("Failing: %s", failedConditions) +} + +func machineSetName(machineSet *omni.MachineSetStatus) string { + if _, ok := machineSet.Metadata().Labels().Get(omni.LabelControlPlaneRole); ok { + return "Control Plane" + } + + cluster, _ := machineSet.Metadata().Labels().Get(omni.LabelCluster) + + if machineSet.Metadata().ID() == omni.WorkersResourceID(cluster) { + return "Workers" + } + + return "Additional Workers" +} diff --git a/client/pkg/template/operations/internal/statustree/statustree.go b/client/pkg/template/operations/internal/statustree/statustree.go new file mode 100644 index 00000000..6c7e3d2e --- /dev/null +++ b/client/pkg/template/operations/internal/statustree/statustree.go @@ -0,0 +1,175 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +// Package statustree contains helpers to render cluster status to the terminal. +package statustree + +import ( + "cmp" + "fmt" + + "github.com/cosi-project/runtime/pkg/resource" + "github.com/fatih/color" + + "github.com/siderolabs/omni/client/pkg/omni/resources/omni" +) + +// NodeWrapper wraps cluster status resources for tree rendering. +type NodeWrapper struct { + resource.Resource +} + +func (t NodeWrapper) String() string { + switch node := t.Resource.(type) { + case *omni.ClusterStatus: + return fmt.Sprintf( + "%s %q %s %s (%d/%d) (healthy/total)", + color.YellowString("Cluster"), + node.Metadata().ID(), + clusterPhaseString(node.TypedSpec().Value.Phase), + readyString(node.TypedSpec().Value.Ready), + node.TypedSpec().Value.GetMachines().GetHealthy(), + node.TypedSpec().Value.GetMachines().GetTotal(), + ) + case *omni.KubernetesUpgradeStatus: + return fmt.Sprintf( + "%s %s %s", + color.YellowString("Kubernetes Upgrade"), + kubernetesUpgradePhaseString(node.TypedSpec().Value.Phase), + node.TypedSpec().Value.Step, + ) + case *omni.TalosUpgradeStatus: + return fmt.Sprintf( + "%s %s %s", + color.YellowString("Talos Upgrade"), + talosUpgradePhaseString(node.TypedSpec().Value.Phase), + node.TypedSpec().Value.Step, + ) + case *omni.MachineSetStatus: + return fmt.Sprintf( + "%s %q %s %s (%d/%d)", + color.YellowString(machineSetName(node)), + node.Metadata().ID(), + machineSetPhaseString(node.TypedSpec().Value.Phase), + readyString(node.TypedSpec().Value.Ready), + node.TypedSpec().Value.GetMachines().GetHealthy(), + node.TypedSpec().Value.GetMachines().GetTotal(), + ) + case *omni.ClusterMachineStatus: + return fmt.Sprintf( + "%s %q %s%s%s%s%s", + color.YellowString("Machine"), + node.Metadata().ID(), + clusterMachineStageString(node.TypedSpec().Value.Stage), + clusterMachineReadyString(node), + clusterMachineConnected(node), + clusterMachineConfigOutdated(!node.TypedSpec().Value.ConfigUpToDate), + clusterMachineConfigStatus(node.TypedSpec().Value.ConfigApplyStatus), + ) + case *omni.ControlPlaneStatus: + return fmt.Sprintf( + "%s %s", + color.YellowString("Status Checks"), + controlPlaneStatusString(node), + ) + case *omni.LoadBalancerStatus: + return fmt.Sprintf( + "%s %s", + color.YellowString("Load Balancer"), + readyString(node.TypedSpec().Value.Healthy), + ) + default: + return resource.String(t.Resource) + } +} + +// IsParentOf allows to find parent-child relationships between resources. +func (t NodeWrapper) IsParentOf(r resource.Resource) bool { + switch node := t.Resource.(type) { + case *omni.ClusterStatus: + return r.Metadata().Type() == omni.MachineSetStatusType || r.Metadata().Type() == omni.KubernetesUpgradeStatusType || r.Metadata().Type() == omni.TalosUpgradeStatusType + case *omni.MachineSetStatus: + _, isControlPlane := node.Metadata().Labels().Get(omni.LabelControlPlaneRole) + if isControlPlane && r.Metadata().Type() == omni.ControlPlaneStatusType { + return true + } + + if isControlPlane && r.Metadata().Type() == omni.LoadBalancerStatusType { + return true + } + + return r.Metadata().Type() == omni.ClusterMachineStatusType && r.Metadata().Labels().Matches( + resource.LabelTerm{ + Key: omni.LabelMachineSet, + Op: resource.LabelOpEqual, + Value: []string{node.Metadata().ID()}, + }) + default: + return false + } +} + +// resourceTypeOrder maps resource types to their order (integer) in the tree. +func resourceTypeOrder(resourceType resource.Type) int { + switch resourceType { + case omni.ClusterStatusType: + return 0 + case omni.KubernetesUpgradeStatusType: + return 1 + case omni.TalosUpgradeStatusType: + return 2 + case omni.MachineSetStatusType: + return 3 + case omni.LoadBalancerStatusType: + return 4 + case omni.ControlPlaneStatusType: + return 5 + case omni.ClusterMachineStatusType: + return 6 + default: + panic("unknown resource type " + resourceType) + } +} + +// Compare allows to sort resources in a tree on the same level. +func (t NodeWrapper) Compare(other NodeWrapper) int { + l, r := t.Resource, other.Resource + lType, rType := l.Metadata().Type(), r.Metadata().Type() + lTypeOrder, rTypeOrder := resourceTypeOrder(lType), resourceTypeOrder(rType) + + if lTypeOrder != rTypeOrder { + return lTypeOrder - rTypeOrder + } + + // at this point lType == rType + if lType == omni.MachineSetStatusType { + // controlplane machine set goes first + _, lIsControlPlane := l.Metadata().Labels().Get(omni.LabelControlPlaneRole) + _, rIsControlPlane := r.Metadata().Labels().Get(omni.LabelControlPlaneRole) + + if lIsControlPlane { + return -1 + } + + if rIsControlPlane { + return 1 + } + + // now, default workers go first + clusterName, _ := l.Metadata().Labels().Get(omni.LabelCluster) + lIsDefaultWorkers := l.Metadata().ID() == omni.WorkersResourceID(clusterName) + rIsDefaultWorkers := r.Metadata().ID() == omni.WorkersResourceID(clusterName) + + if lIsDefaultWorkers { + return -1 + } + + if rIsDefaultWorkers { + return 1 + } + } + + // compare by name + return cmp.Compare(l.Metadata().ID(), r.Metadata().ID()) +} diff --git a/client/pkg/template/operations/internal/utils/utils.go b/client/pkg/template/operations/internal/utils/utils.go new file mode 100644 index 00000000..a85cc53a --- /dev/null +++ b/client/pkg/template/operations/internal/utils/utils.go @@ -0,0 +1,145 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +// Package utils contains various utility functions for template operations. +package utils + +import ( + "bytes" + "fmt" + "io" + "strings" + + "github.com/cosi-project/runtime/pkg/resource" + "github.com/fatih/color" + "github.com/hexops/gotextdiff" + "github.com/hexops/gotextdiff/myers" + "github.com/hexops/gotextdiff/span" + "gopkg.in/yaml.v3" +) + +// MarshalResource to YAML format (bytes). +func MarshalResource(r resource.Resource) ([]byte, error) { + var buf bytes.Buffer + + enc := yaml.NewEncoder(&buf) + enc.SetIndent(2) + + m, err := resource.MarshalYAML(r) + if err != nil { + return nil, err + } + + if err := enc.Encode(m); err != nil { + return nil, err + } + + return buf.Bytes(), nil +} + +// RenderDiff outputs colorized diff between two resources. +// +// One of the resources might be nil. +func RenderDiff(w io.Writer, oldR, newR resource.Resource) error { + var ( + oldYaml, newYaml []byte + oldPath, newPath string + err error + ) + + if oldR != nil { + oldYaml, err = MarshalResource(oldR) + if err != nil { + return err + } + + oldPath = resource.String(oldR) + } else { + oldPath = "/dev/null" + } + + if newR != nil { + newYaml, err = MarshalResource(newR) + if err != nil { + return err + } + + newPath = resource.String(newR) + } else { + newPath = "/dev/null" + } + + edits := myers.ComputeEdits(span.URIFromPath(oldPath), string(oldYaml), string(newYaml)) + diff := gotextdiff.ToUnified(oldPath, newPath, string(oldYaml), edits) + + outputDiff(w, diff) + + return nil +} + +func outputDiff(w io.Writer, u gotextdiff.Unified) { + if len(u.Hunks) == 0 { + return + } + + bold := color.New(color.Bold) + bold.Fprintf(w, "--- %s\n", u.From) //nolint:errcheck + bold.Fprintf(w, "+++ %s\n", u.To) //nolint:errcheck + + cyan := color.New(color.FgCyan) + red := color.New(color.FgRed) + green := color.New(color.FgGreen) + + for _, hunk := range u.Hunks { + fromCount, toCount := 0, 0 + + for _, l := range hunk.Lines { + switch l.Kind { //nolint:exhaustive + case gotextdiff.Delete: + fromCount++ + case gotextdiff.Insert: + toCount++ + default: + fromCount++ + toCount++ + } + } + + cyan.Fprintf(w, "@@") //nolint:errcheck + + if fromCount > 1 { + cyan.Fprintf(w, " -%d,%d", hunk.FromLine, fromCount) //nolint:errcheck + } else { + cyan.Fprintf(w, " -%d", hunk.FromLine) //nolint:errcheck + } + + if toCount > 1 { + cyan.Fprintf(w, " +%d,%d", hunk.ToLine, toCount) //nolint:errcheck + } else { + cyan.Fprintf(w, " +%d", hunk.ToLine) //nolint:errcheck + } + + cyan.Printf(" @@\n") //nolint:errcheck + + for _, l := range hunk.Lines { + switch l.Kind { //nolint:exhaustive + case gotextdiff.Delete: + red.Fprintf(w, "-%s", l.Content) //nolint:errcheck + case gotextdiff.Insert: + green.Fprintf(w, "+%s", l.Content) //nolint:errcheck + default: + fmt.Fprintf(w, " %s", l.Content) + } + + if !strings.HasSuffix(l.Content, "\n") { + red.Fprintf(w, "\n\\ No newline at end of file\n") //nolint:errcheck + } + } + } +} + +// Describe a resources in human readable format. +func Describe(r resource.Resource) string { + return fmt.Sprintf("%s(%s)", r.Metadata().Type(), r.Metadata().ID()) +} diff --git a/client/pkg/template/operations/operations.go b/client/pkg/template/operations/operations.go new file mode 100644 index 00000000..9447676d --- /dev/null +++ b/client/pkg/template/operations/operations.go @@ -0,0 +1,6 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +// Package operations provides higher level operations on cluster templates. +package operations diff --git a/client/pkg/template/operations/render.go b/client/pkg/template/operations/render.go new file mode 100644 index 00000000..aafc9bab --- /dev/null +++ b/client/pkg/template/operations/render.go @@ -0,0 +1,48 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package operations + +import ( + "fmt" + "io" + + "github.com/cosi-project/runtime/pkg/resource" + "gopkg.in/yaml.v3" + + "github.com/siderolabs/omni/client/pkg/template" +) + +// RenderTemplate outputs the rendered template to the given output. +func RenderTemplate(templateReader io.Reader, output io.Writer) error { + tmpl, err := template.Load(templateReader) + if err != nil { + return fmt.Errorf("error loading template: %w", err) + } + + if err = tmpl.Validate(); err != nil { + return err + } + + resources, err := tmpl.Translate() + if err != nil { + return fmt.Errorf("error rendering template: %w", err) + } + + enc := yaml.NewEncoder(output) + enc.SetIndent(2) + + for _, r := range resources { + m, err := resource.MarshalYAML(r) + if err != nil { + return fmt.Errorf("error marshaling resource: %w", err) + } + + if err = enc.Encode(m); err != nil { + return fmt.Errorf("error encoding resource: %w", err) + } + } + + return nil +} diff --git a/client/pkg/template/operations/status.go b/client/pkg/template/operations/status.go new file mode 100644 index 00000000..038876fd --- /dev/null +++ b/client/pkg/template/operations/status.go @@ -0,0 +1,259 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package operations + +import ( + "context" + "fmt" + "io" + "os" + "slices" + "strings" + "time" + "unicode/utf8" + + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/state" + "github.com/xlab/treeprint" + "golang.org/x/term" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" + "github.com/siderolabs/omni/client/pkg/omni/resources/omni" + "github.com/siderolabs/omni/client/pkg/template" + "github.com/siderolabs/omni/client/pkg/template/operations/internal/statustree" +) + +// StatusOptions configures the status operation. +type StatusOptions struct { + Wait bool + Quiet bool +} + +// StatusTemplate queries, renders and (optionally) waits for the cluster status (health). +func StatusTemplate(ctx context.Context, templateReader io.Reader, out io.Writer, st state.State, options StatusOptions) error { + tmpl, err := template.Load(templateReader) + if err != nil { + return fmt.Errorf("error loading template: %w", err) + } + + if err = tmpl.Validate(); err != nil { + return err + } + + return statusTemplate(ctx, tmpl, out, st, options) +} + +// StatusCluster queries, renders and (optionally) waits for the cluster status (health). +func StatusCluster(ctx context.Context, clusterName string, out io.Writer, st state.State, options StatusOptions) error { + tmpl := template.WithCluster(clusterName) + + return statusTemplate(ctx, tmpl, out, st, options) +} + +//nolint:gocognit,gocyclo,cyclop +func statusTemplate(ctx context.Context, tmpl *template.Template, out io.Writer, st state.State, options StatusOptions) error { + clusterName, err := tmpl.ClusterName() + if err != nil { + return err + } + + // initiate a watch on all resources which are part of the cluster status + ctx, cancel := context.WithCancel(ctx) + defer cancel() + + watchCh := make(chan state.Event) + + if err = st.Watch(ctx, omni.NewClusterStatus(resources.DefaultNamespace, clusterName).Metadata(), watchCh); err != nil { + return err + } + + resourceTypes := []resource.Type{ + omni.MachineSetStatusType, + omni.ControlPlaneStatusType, + omni.LoadBalancerStatusType, + omni.KubernetesUpgradeStatusType, + omni.TalosUpgradeStatusType, + omni.ClusterMachineStatusType, + } + + for _, resourceType := range resourceTypes { + if err = st.WatchKind( + ctx, + resource.NewMetadata(resources.DefaultNamespace, resourceType, "", resource.VersionUndefined), + watchCh, + state.WithBootstrapContents(true), + state.WatchWithLabelQuery(resource.LabelEqual(omni.LabelCluster, clusterName)), + ); err != nil { + return err + } + } + + resources := map[string]resource.Resource{} + pendingBootstraps := len(resourceTypes) + + var ( + clusterBootstrapped, startedRendering, hasUpdates bool + prevLines []byte + ) + + renderTicker := time.NewTicker(time.Second) + defer renderTicker.Stop() + + for { + select { + case <-ctx.Done(): + return ctx.Err() + case <-renderTicker.C: + if !hasUpdates { + continue + } + + hasUpdates = false + + if options.Quiet { + continue + } + + newLines, healthy := render(resources) + + if err = printStatus(out, prevLines, newLines); err != nil { + return err + } + + prevLines = newLines + + if healthy { + // done waiting + return nil + } + case event := <-watchCh: + hasUpdates = true + + switch event.Type { + case state.Errored: + return fmt.Errorf("watch failed: %w", event.Error) + case state.Bootstrapped: + pendingBootstraps-- + case state.Created, state.Updated: + if event.Resource.Metadata().Type() == omni.ClusterStatusType { + clusterBootstrapped = true + } + + resources[resource.String(event.Resource)] = event.Resource + case state.Destroyed: + delete(resources, resource.String(event.Resource)) + } + + // render the initial state once fully bootstrapped + if !startedRendering && clusterBootstrapped && pendingBootstraps == 0 { + startedRendering = true + } else { + continue + } + + newLines, healthy := render(resources) + + if !options.Quiet { + if err = printStatus(out, prevLines, newLines); err != nil { + return err + } + + prevLines = newLines + } + + hasUpdates = false + + if healthy { + return nil + } + + if !options.Wait { + return fmt.Errorf("cluster is not healthy") + } + } + } +} + +func expandTree(tree treeprint.Tree, item statustree.NodeWrapper, resources map[string]resource.Resource) { + var nextLevel []statustree.NodeWrapper + + for _, r := range resources { + if item.IsParentOf(r) { + nextLevel = append(nextLevel, statustree.NodeWrapper{Resource: r}) + } + } + + slices.SortFunc(nextLevel, statustree.NodeWrapper.Compare) + + for _, item := range nextLevel { + subtree := tree.AddBranch(item) + expandTree(subtree, item, resources) + } +} + +// render builds a tree of resources and renders it to the buffer. +func render(resources map[string]resource.Resource) ([]byte, bool) { + var clusterStatus *omni.ClusterStatus + + healthy := true + + for _, r := range resources { + switch item := r.(type) { + case *omni.ClusterStatus: + clusterStatus = item + + healthy = healthy && item.TypedSpec().Value.Phase == specs.ClusterStatusSpec_RUNNING && item.TypedSpec().Value.Ready + case *omni.MachineSetStatus: + healthy = healthy && item.TypedSpec().Value.Phase == specs.MachineSetPhase_Running && item.TypedSpec().Value.Ready + case *omni.KubernetesUpgradeStatus: + healthy = healthy && item.TypedSpec().Value.Phase == specs.KubernetesUpgradeStatusSpec_Done + case *omni.TalosUpgradeStatus: + healthy = healthy && item.TypedSpec().Value.Phase == specs.TalosUpgradeStatusSpec_Done + } + } + + if clusterStatus == nil { + return nil, false + } + + root := statustree.NodeWrapper{Resource: clusterStatus} + tree := treeprint.NewWithRoot(root) + + expandTree(tree, root, resources) + + return tree.Bytes(), healthy +} + +// printStatus prints the tree to the terminal. +// +// If terminal supports it, previous tree is erased. +func printStatus(out io.Writer, prevLines, newLines []byte) error { + var ( + w int + isTerminal bool + ) + + if f, ok := out.(*os.File); ok { + w, _, _ = term.GetSize(int(f.Fd())) //nolint:errcheck + isTerminal = term.IsTerminal(int(f.Fd())) + } + + if w <= 0 { + w = 80 + } + + if isTerminal { + for _, outputLine := range strings.Split(string(prevLines), "\n") { + for i := 0; i < (utf8.RuneCountInString(outputLine)+w-1)/w; i++ { + fmt.Fprint(out, "\033[A\033[K") // cursor up, clear line + } + } + } + + _, err := out.Write(newLines) + + return err +} diff --git a/client/pkg/template/operations/sync.go b/client/pkg/template/operations/sync.go new file mode 100644 index 00000000..399361b2 --- /dev/null +++ b/client/pkg/template/operations/sync.go @@ -0,0 +1,198 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package operations + +import ( + "context" + "fmt" + "io" + "os" + + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/state" + "github.com/fatih/color" + + "github.com/siderolabs/omni/client/pkg/omni/resources" + "github.com/siderolabs/omni/client/pkg/template" + "github.com/siderolabs/omni/client/pkg/template/operations/internal/utils" +) + +// SyncOptions contains options for SyncTemplate. +type SyncOptions struct { + // DryRun indicates that no changes should be made to the cluster. + DryRun bool + + // Verbose indicates that diff for each resource should be printed. + Verbose bool + + // DestroyMachines forcefully remove the disconnected nodes from Omni. + DestroyMachines bool +} + +// SyncTemplate performs resource sync to Omni. +func SyncTemplate(ctx context.Context, templateReader io.Reader, out io.Writer, st state.State, syncOptions SyncOptions) error { + tmpl, err := template.Load(templateReader) + if err != nil { + return fmt.Errorf("error loading template: %w", err) + } + + if err = tmpl.Validate(); err != nil { + return err + } + + syncResult, err := tmpl.Sync(ctx, st) + if err != nil { + return fmt.Errorf("error syncing template: %w", err) + } + + // sync flow: + // 1. create missing resources + // 2. update resources + // 3. delete resources last + // + // this follows the idea of a scaling up first + + yellow := color.New(color.FgYellow) + boldFunc := color.New(color.Bold).SprintfFunc() + + dryRun := "" + if syncOptions.DryRun { + dryRun = " (dry run)" + } + + for _, r := range syncResult.Create { + yellow.Fprintf(out, "* creating%s %s\n", dryRun, boldFunc(utils.Describe(r))) //nolint:errcheck + + if syncOptions.Verbose { + if err = utils.RenderDiff(out, nil, r); err != nil { + return err + } + } + + if syncOptions.DryRun { + continue + } + + if err = st.Create(ctx, r); err != nil { + return err + } + } + + for _, p := range syncResult.Update { + yellow.Fprintf(out, "* updating%s %s\n", dryRun, boldFunc(utils.Describe(p.New))) //nolint:errcheck + + if syncOptions.Verbose { + if err = utils.RenderDiff(os.Stdout, p.Old, p.New); err != nil { + return err + } + } + + if syncOptions.DryRun { + continue + } + + if err = st.Update(ctx, p.New); err != nil { + return err + } + } + + return syncDelete(ctx, syncResult, out, st, syncOptions) +} + +func syncDelete(ctx context.Context, syncResult *template.SyncResult, out io.Writer, st state.State, syncOptions SyncOptions) error { + for _, phase := range syncResult.Destroy { + if err := syncDeleteResources(ctx, phase, out, st, syncOptions); err != nil { + return err + } + } + + return nil +} + +//nolint:gocognit,gocyclo,cyclop +func syncDeleteResources(ctx context.Context, toDelete []resource.Resource, out io.Writer, st state.State, syncOptions SyncOptions) error { + ctx, cancel := context.WithCancel(ctx) + defer cancel() + + yellow := color.New(color.FgYellow) + boldFunc := color.New(color.Bold).SprintfFunc() + + dryRun := "" + if syncOptions.DryRun { + dryRun = " (dry run)" + } + + teardownWatch := make(chan state.Event) + tearingDownResourceTypes := map[resource.Type]struct{}{} + + for _, r := range toDelete { + tearingDownResourceTypes[r.Metadata().Type()] = struct{}{} + } + + for resourceType := range tearingDownResourceTypes { + if err := st.WatchKind(ctx, resource.NewMetadata(resources.DefaultNamespace, resourceType, "", resource.VersionUndefined), teardownWatch, state.WithBootstrapContents(true)); err != nil { + return err + } + } + + tearingDownResources := map[string]struct{}{} + + for _, r := range toDelete { + yellow.Fprintf(out, "* tearing down%s %s\n", dryRun, boldFunc(utils.Describe(r))) //nolint:errcheck + + if syncOptions.Verbose { + if err := utils.RenderDiff(os.Stdout, r, nil); err != nil { + return err + } + } + + if syncOptions.DryRun { + continue + } + + if _, err := st.Teardown(ctx, r.Metadata()); err != nil && !state.IsNotFoundError(err) { + return err + } + + tearingDownResources[utils.Describe(r)] = struct{}{} + } + + if syncOptions.DryRun { + return nil + } + + for len(tearingDownResources) > 0 { + var event state.Event + + select { + case <-ctx.Done(): + return ctx.Err() + case event = <-teardownWatch: + } + + switch event.Type { + case state.Updated, state.Created: + if _, ok := tearingDownResources[utils.Describe(event.Resource)]; ok { + if event.Resource.Metadata().Phase() == resource.PhaseTearingDown && event.Resource.Metadata().Finalizers().Empty() { + if err := st.Destroy(ctx, event.Resource.Metadata()); err != nil && !state.IsNotFoundError(err) { + return err + } + } + } + case state.Destroyed: + if _, ok := tearingDownResources[utils.Describe(event.Resource)]; ok { + delete(tearingDownResources, utils.Describe(event.Resource)) + + yellow.Fprintf(out, "* destroyed%s %s\n", dryRun, boldFunc(utils.Describe(event.Resource))) //nolint:errcheck + } + case state.Bootstrapped: + // ignore + case state.Errored: + return event.Error + } + } + + return nil +} diff --git a/client/pkg/template/operations/testdata/export/cluster-resources.yaml b/client/pkg/template/operations/testdata/export/cluster-resources.yaml new file mode 100644 index 00000000..d6e8d2ec --- /dev/null +++ b/client/pkg/template/operations/testdata/export/cluster-resources.yaml @@ -0,0 +1,548 @@ +################################ Cluster +metadata: + namespace: default + type: Clusters.omni.sidero.dev + id: export-test + version: 11 + owner: + phase: running + created: 2023-12-07T13:36:21Z + updated: 2023-12-08T15:43:10Z + labels: + cluster-label-1: val + cluster-label-2: val2 + annotations: + omni.sidero.dev/managed-by-cluster-templates: + finalizers: + - KubernetesUpgradeStatusController + - TalosUpgradeStatusController + - ClusterController + - SecretsController +spec: + installimage: "" + kubernetesversion: 1.28.2 + talosversion: 1.5.5 + features: + enableworkloadproxy: true + diskencryption: true + backupconfiguration: + interval: + seconds: 7200 + nanos: 0 + enabled: true +--- + + + +################################ Control Plane MachineSet - with bootstrapspec +metadata: + namespace: default + type: MachineSets.omni.sidero.dev + id: export-test-control-planes + version: 5 + owner: + phase: running + created: 2023-12-07T13:36:21Z + updated: 2023-12-07T13:39:44Z + labels: + omni.sidero.dev/cluster: export-test + omni.sidero.dev/role-controlplane: + finalizers: + - MachineSetController + - MachineSetStatusController +spec: + updatestrategy: 1 + machineclass: null + bootstrapspec: + clusteruuid: 98d00c6b-fae1-4bf2-afa3-0282ef443f84 + snapshot: FFFFFFFF9AA169F0.snapshot +--- + + + +################################ Worker MachineSet - default +metadata: + namespace: default + type: MachineSets.omni.sidero.dev + id: export-test-workers + version: 5 + owner: + phase: running + created: 2023-12-07T13:36:21Z + updated: 2023-12-07T13:39:44Z + labels: + omni.sidero.dev/cluster: export-test + omni.sidero.dev/role-worker: + finalizers: + - MachineSetController + - MachineSetStatusController +spec: + updatestrategy: 1 + machineclass: null + bootstrapspec: null + deletestrategy: 1 + updatestrategyconfig: + rolling: + maxparallelism: 3 + deletestrategyconfig: + type: Rolling + rolling: + maxparallelism: 5 +--- + + + +################################ Worker MachineSet - additional, using machine class, unlimited allocation +metadata: + namespace: default + type: MachineSets.omni.sidero.dev + id: export-test-w07c5e8 + version: 4 + owner: + phase: running + created: 2023-12-07T13:38:09Z + updated: 2023-12-07T13:39:44Z + labels: + omni.sidero.dev/cluster: export-test + omni.sidero.dev/role-worker: + finalizers: + - MachineSetController + - MachineSetStatusController +spec: + updatestrategy: 1 + machineclass: + name: mc1 + machinecount: 0 + allocationtype: 1 + bootstrapspec: null +--- + + + +################################ Worker MachineSet - additional, using machine class, static allocation +metadata: + namespace: default + type: MachineSets.omni.sidero.dev + id: export-test-w3c03cf + version: 3 + owner: + phase: running + created: 2023-12-07T13:39:44Z + updated: 2023-12-07T13:39:44Z + labels: + omni.sidero.dev/cluster: export-test + omni.sidero.dev/role-worker: + finalizers: + - MachineSetController + - MachineSetStatusController +spec: + updatestrategy: 1 + machineclass: + name: mc2 + machinecount: 1 + allocationtype: 0 + bootstrapspec: null +--- + + + +################################ MachineSetNodes +metadata: + namespace: default + type: MachineSetNodes.omni.sidero.dev + id: 024780fe-b0d6-43e0-a868-b142ba0a67a6 + version: 1 + owner: + phase: running + created: 2023-12-07T13:36:21Z + updated: 1970-01-01T00:00:00Z + labels: + omni.sidero.dev/cluster: export-test + omni.sidero.dev/machine-set: export-test-workers + omni.sidero.dev/role-worker: + annotations: + omni.sidero.dev/locked: +spec: {} +--- +metadata: + namespace: default + type: MachineSetNodes.omni.sidero.dev + id: 0313855d-e4ea-458b-8df9-8dbdc2e41e8c + version: 1 + owner: MachineSetNodeController + phase: running + created: 2023-12-07T13:39:44Z + updated: 2023-12-07T13:39:44Z + labels: + omni.sidero.dev/cluster: export-test + omni.sidero.dev/machine-set: export-test-w3c03cf + omni.sidero.dev/role-worker: +spec: {} +--- +metadata: + namespace: default + type: MachineSetNodes.omni.sidero.dev + id: 3f8b33d2-52b1-42ed-8505-4025ddbc31f1 + version: 1 + owner: + phase: running + created: 2023-12-07T13:36:21Z + updated: 1970-01-01T00:00:00Z + labels: + omni.sidero.dev/cluster: export-test + omni.sidero.dev/machine-set: export-test-control-planes + omni.sidero.dev/role-controlplane: +spec: {} +--- +metadata: + namespace: default + type: MachineSetNodes.omni.sidero.dev + id: 7ee83506-4432-4499-9291-276e1319e8b4 + version: 1 + owner: MachineSetNodeController + phase: running + created: 2023-12-07T13:38:09Z + updated: 2023-12-07T13:38:09Z + labels: + omni.sidero.dev/cluster: export-test + omni.sidero.dev/machine-set: export-test-w07c5e8 + omni.sidero.dev/role-worker: +spec: {} +--- +metadata: + namespace: default + type: MachineSetNodes.omni.sidero.dev + id: a3ef5705-6ee0-4344-9d4a-da447909e0d4 + version: 1 + owner: MachineSetNodeController + phase: running + created: 2023-12-07T13:38:09Z + updated: 2023-12-07T13:38:09Z + labels: + omni.sidero.dev/cluster: export-test + omni.sidero.dev/machine-set: export-test-w07c5e8 + omni.sidero.dev/role-worker: +spec: {} +--- + + + +################################ Config Patches - user defined +metadata: + namespace: default + type: ConfigPatches.omni.sidero.dev + id: 499-2e4b9030-aade-47cf-8f7f-3031b7ae49bb + version: 2 + owner: + phase: running + created: 2023-12-07T15:02:39Z + updated: 2023-12-08T15:43:10Z + labels: + omni.sidero.dev/cluster: export-test + annotations: + name: User defined patch +spec: + data: | + machine: + network: + kubespan: + enabled: false +--- +metadata: + namespace: default + type: ConfigPatches.omni.sidero.dev + id: 500-1104d832-79fb-4121-a67f-752fa8f763e9 + version: 2 + owner: + phase: running + created: 2023-12-07T13:50:13Z + updated: 2023-12-08T15:43:10Z + labels: + omni.sidero.dev/cluster: export-test + omni.sidero.dev/cluster-machine: 024780fe-b0d6-43e0-a868-b142ba0a67a6 + annotations: + description: Some Test Description ASD + name: User defined patch +spec: + data: | + machine: + network: + kubespan: + enabled: false + mtu: 1166 +--- +metadata: + namespace: default + type: ConfigPatches.omni.sidero.dev + id: 500-2e2a2a64-5085-407a-a205-f75f4c64a060 + version: 2 + owner: + phase: running + created: 2023-12-07T13:48:50Z + updated: 2023-12-08T15:43:10Z + labels: + omni.sidero.dev/cluster: export-test + omni.sidero.dev/machine-set: export-test-control-planes + annotations: + description: Some Test Description 123 + name: User defined patch +spec: + data: | + machine: + network: + kubespan: + enabled: false + mtu: 1111 +--- +metadata: + namespace: default + type: ConfigPatches.omni.sidero.dev + id: 500-32fe29d6-221a-4e6e-a55e-6b1700cae09d + version: 2 + owner: + phase: running + created: 2023-12-07T13:49:28Z + updated: 2023-12-08T15:43:10Z + labels: + omni.sidero.dev/cluster: export-test + omni.sidero.dev/machine-set: export-test-w07c5e8 + annotations: + description: Some Test Description 987 + name: User defined patch +spec: + data: | + machine: + network: + kubespan: + enabled: false + mtu: 1217 +--- +metadata: + namespace: default + type: ConfigPatches.omni.sidero.dev + id: 500-3792b0d9-0fc2-46fb-becf-4d5439bbe5ba + version: 2 + owner: + phase: running + created: 2023-12-07T13:49:10Z + updated: 2023-12-08T15:43:10Z + labels: + omni.sidero.dev/cluster: export-test + omni.sidero.dev/machine-set: export-test-workers + annotations: + description: Some Test Description ABC + name: User defined patch +spec: + data: | + machine: + network: + kubespan: + enabled: false + mtu: 1447 +--- +metadata: + namespace: default + type: ConfigPatches.omni.sidero.dev + id: 500-ae981813-420d-464f-a246-fd7e861402f1 + version: 2 + owner: + phase: running + created: 2023-12-07T13:47:18Z + updated: 2023-12-08T15:43:10Z + labels: + omni.sidero.dev/cluster: export-test + annotations: + description: Cluster Patch Description + name: User defined patch +spec: + data: | + machine: + network: + kubespan: + enabled: false + mtu: 1410 +--- +metadata: + namespace: default + type: ConfigPatches.omni.sidero.dev + id: 600-3fb9b4d2-b13c-48a7-9929-3632e68ff5da + version: 2 + owner: + phase: running + created: 2023-12-07T13:48:07Z + updated: 2023-12-08T15:43:10Z + labels: + omni.sidero.dev/cluster: export-test + annotations: + description: Cluster Patch Description 2 + name: User defined patch +spec: + data: | + machine: + network: + kubespan: + enabled: false + mtu: 1234 +--- +metadata: + namespace: default + type: ConfigPatches.omni.sidero.dev + id: 666-4a5ca2e0-4f57-4761-bf61-c1e4cf583170 + version: 2 + owner: + phase: running + created: 2023-12-07T13:49:44Z + updated: 2023-12-08T15:43:10Z + labels: + omni.sidero.dev/cluster: export-test + omni.sidero.dev/machine-set: export-test-w3c03cf + annotations: + description: Some Test Description ZXC + name: User defined patch +spec: + data: | + machine: + network: + kubespan: + enabled: false + mtu: 1298 +--- + + + +################################ Feature Config Patches - workload proxying +metadata: + namespace: default + type: ConfigPatches.omni.sidero.dev + id: 950-cluster-export-test-workload-proxying + version: 1 + owner: ClusterWorkloadProxyController + phase: running + created: 2023-12-07T13:36:21Z + updated: 2023-12-07T13:36:21Z + labels: + omni.sidero.dev/cluster: export-test + omni.sidero.dev/system-patch: +spec: + data: | + cluster: + inlineManifests: + - name: omni-kube-service-exposer + # adapted from: https://github.com/siderolabs/kube-service-exposer/blob/main/deploy/kube-service-exposer.yaml + contents: |- + apiVersion: rbac.authorization.k8s.io/v1 + kind: ClusterRole + metadata: + name: omni-kube-service-exposer + rules: + - apiGroups: [""] + resources: ["services"] + verbs: ["get", "list", "watch"] + --- + apiVersion: v1 + kind: ServiceAccount + metadata: + name: omni-kube-service-exposer + namespace: kube-system + --- + apiVersion: rbac.authorization.k8s.io/v1 + kind: ClusterRoleBinding + metadata: + name: omni-kube-service-exposer + roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: omni-kube-service-exposer + subjects: + - kind: ServiceAccount + name: omni-kube-service-exposer + namespace: kube-system + --- + apiVersion: apps/v1 + kind: DaemonSet + metadata: + name: omni-kube-service-exposer + namespace: kube-system + spec: + selector: + matchLabels: + app.kubernetes.io/name: omni-kube-service-exposer + template: + metadata: + labels: + app.kubernetes.io/name: omni-kube-service-exposer + spec: + serviceAccountName: omni-kube-service-exposer + hostNetwork: true + dnsPolicy: ClusterFirstWithHostNet + tolerations: + - operator: Exists + containers: + - name: omni-kube-service-exposer + image: ghcr.io/siderolabs/kube-service-exposer:v0.1.1 + args: + - --debug=false + - --annotation-key=omni-kube-service-exposer.sidero.dev/port + # siderolink CIDR + - --bind-cidrs="fdae:41e4:649b:9303::/64" +--- + + + +################################ Feature Config Patches - disk encryption +metadata: + namespace: default + type: ConfigPatches.omni.sidero.dev + id: 950-export-test-encryption + version: 1 + owner: ClusterMachineEncryptionController + phase: running + created: 2023-12-07T13:36:21Z + updated: 2023-12-07T13:36:21Z + labels: + omni.sidero.dev/cluster: export-test + omni.sidero.dev/system-patch: + annotations: + description: Makes machine encrypt disks using Omni as a KMS server + name: disk encryption config +spec: + data: |- + machine: + systemDiskEncryption: + state: + provider: luks2 + keys: + - kms: + endpoint: grpc://192.168.178.167:8090 + slot: 0 + ephemeral: + provider: luks2 + keys: + - kms: + endpoint: grpc://192.168.178.167:8090 + slot: 0 +--- + + + +################################ Special Config Patches - install disk +metadata: + namespace: default + type: ConfigPatches.omni.sidero.dev + id: 000-cm-3f8b33d2-52b1-42ed-8505-4025ddbc31f1-install-disk + version: 1 + owner: + phase: running + created: 2023-12-07T23:14:47Z + updated: 1970-01-01T00:00:00Z + labels: + omni.sidero.dev/cluster: export-test + omni.sidero.dev/cluster-machine: 3f8b33d2-52b1-42ed-8505-4025ddbc31f1 + omni.sidero.dev/system-patch: + annotations: + name: install-disk +spec: + data: | + machine: + install: + disk: /dev/sdc diff --git a/client/pkg/template/operations/testdata/export/cluster-template.yaml b/client/pkg/template/operations/testdata/export/cluster-template.yaml new file mode 100644 index 00000000..3d042dac --- /dev/null +++ b/client/pkg/template/operations/testdata/export/cluster-template.yaml @@ -0,0 +1,137 @@ +kind: Cluster +name: export-test +labels: + cluster-label-1: val + cluster-label-2: val2 +kubernetes: + version: v1.28.2 +talos: + version: v1.5.5 +features: + diskEncryption: true + enableWorkloadProxy: true + backupConfiguration: + interval: 2h0m0s +patches: + - idOverride: 499-2e4b9030-aade-47cf-8f7f-3031b7ae49bb + annotations: + name: User defined patch + inline: + machine: + network: + kubespan: + enabled: false + - idOverride: 500-ae981813-420d-464f-a246-fd7e861402f1 + annotations: + description: Cluster Patch Description + name: User defined patch + inline: + machine: + network: + kubespan: + enabled: false + mtu: 1410 + - idOverride: 600-3fb9b4d2-b13c-48a7-9929-3632e68ff5da + annotations: + description: Cluster Patch Description 2 + name: User defined patch + inline: + machine: + network: + kubespan: + enabled: false + mtu: 1234 +--- +kind: ControlPlane +bootstrapSpec: + clusterUUID: 98d00c6b-fae1-4bf2-afa3-0282ef443f84 + snapshot: FFFFFFFF9AA169F0.snapshot +machines: + - 3f8b33d2-52b1-42ed-8505-4025ddbc31f1 +patches: + - idOverride: 500-2e2a2a64-5085-407a-a205-f75f4c64a060 + annotations: + description: Some Test Description 123 + name: User defined patch + inline: + machine: + network: + kubespan: + enabled: false + mtu: 1111 +--- +kind: Workers +machines: + - 024780fe-b0d6-43e0-a868-b142ba0a67a6 +updateStrategy: + rolling: + maxParallelism: 3 +deleteStrategy: + type: Rolling + rolling: + maxParallelism: 5 +patches: + - idOverride: 500-3792b0d9-0fc2-46fb-becf-4d5439bbe5ba + annotations: + description: Some Test Description ABC + name: User defined patch + inline: + machine: + network: + kubespan: + enabled: false + mtu: 1447 +--- +kind: Workers +name: w07c5e8 +machineClass: + name: mc1 + size: Unlimited +patches: + - idOverride: 500-32fe29d6-221a-4e6e-a55e-6b1700cae09d + annotations: + description: Some Test Description 987 + name: User defined patch + inline: + machine: + network: + kubespan: + enabled: false + mtu: 1217 +--- +kind: Workers +name: w3c03cf +machineClass: + name: mc2 + size: 1 +patches: + - idOverride: 666-4a5ca2e0-4f57-4761-bf61-c1e4cf583170 + annotations: + description: Some Test Description ZXC + name: User defined patch + inline: + machine: + network: + kubespan: + enabled: false + mtu: 1298 +--- +kind: Machine +name: 024780fe-b0d6-43e0-a868-b142ba0a67a6 +locked: true +patches: + - idOverride: 500-1104d832-79fb-4121-a67f-752fa8f763e9 + annotations: + description: Some Test Description ASD + name: User defined patch + inline: + machine: + network: + kubespan: + enabled: false + mtu: 1166 +--- +kind: Machine +name: 3f8b33d2-52b1-42ed-8505-4025ddbc31f1 +install: + disk: /dev/sdc diff --git a/client/pkg/template/operations/validate.go b/client/pkg/template/operations/validate.go new file mode 100644 index 00000000..0efda9a5 --- /dev/null +++ b/client/pkg/template/operations/validate.go @@ -0,0 +1,22 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package operations + +import ( + "fmt" + "io" + + "github.com/siderolabs/omni/client/pkg/template" +) + +// ValidateTemplate performs template validation. +func ValidateTemplate(templateReader io.Reader) error { + tmpl, err := template.Load(templateReader) + if err != nil { + return fmt.Errorf("error loading template: %w", err) + } + + return tmpl.Validate() +} diff --git a/client/pkg/template/order.go b/client/pkg/template/order.go new file mode 100644 index 00000000..381e99f9 --- /dev/null +++ b/client/pkg/template/order.go @@ -0,0 +1,40 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package template + +import ( + "cmp" + "fmt" + "slices" + + "github.com/cosi-project/runtime/pkg/resource" + + "github.com/siderolabs/omni/client/pkg/omni/resources/omni" +) + +// Canonical order of resources in the generated list. +var canonicalResourceOrder = map[resource.Type]int{ + omni.ClusterType: 1, + omni.ConfigPatchType: 2, + omni.MachineSetType: 3, + omni.MachineSetNodeType: 4, +} + +func sortResources[T any](s []T, mapper func(T) resource.Metadata) { + slices.SortStableFunc(s, func(a, b T) int { + orderI := canonicalResourceOrder[mapper(a).Type()] + orderJ := canonicalResourceOrder[mapper(b).Type()] + + if orderI == 0 { + panic(fmt.Sprintf("unknown resource type %q", mapper(a).Type())) + } + + if orderJ == 0 { + panic(fmt.Sprintf("unknown resource type %q", mapper(b).Type())) + } + + return cmp.Compare(orderI, orderJ) + }) +} diff --git a/client/pkg/template/sync.go b/client/pkg/template/sync.go new file mode 100644 index 00000000..55c044a3 --- /dev/null +++ b/client/pkg/template/sync.go @@ -0,0 +1,23 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package template + +import "github.com/cosi-project/runtime/pkg/resource" + +// UpdateChange is a pair of old/new resources. +type UpdateChange struct { + Old resource.Resource + New resource.Resource +} + +// SyncResult describes the actions to perform to sync the template resources. +type SyncResult struct { + // Resources to create. + Create []resource.Resource + // Resources to update. + Update []UpdateChange + // Resources to delete split by phases. + Destroy [][]resource.Resource +} diff --git a/client/pkg/template/template.go b/client/pkg/template/template.go new file mode 100644 index 00000000..dd60e026 --- /dev/null +++ b/client/pkg/template/template.go @@ -0,0 +1,325 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +// Package template provides conversion of cluster templates to Omni resources. +package template + +import ( + "bytes" + "context" + "errors" + "fmt" + "io" + + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/state" + "github.com/siderolabs/gen/xslices" + "gopkg.in/yaml.v3" + + "github.com/siderolabs/omni/client/pkg/omni/resources" + "github.com/siderolabs/omni/client/pkg/omni/resources/omni" + "github.com/siderolabs/omni/client/pkg/template/internal/models" +) + +// Template is a cluster template. +type Template struct { + models models.List +} + +// Load the template from input. +func Load(input io.Reader) (*Template, error) { + dec := yaml.NewDecoder(input) + + var template Template + + for { + var docNode yaml.Node + + if err := dec.Decode(&docNode); err != nil { + if errors.Is(err, io.EOF) { + return &template, nil + } + + return nil, fmt.Errorf("error decoding template: %w", err) + } + + if docNode.Kind != yaml.DocumentNode { + return nil, fmt.Errorf("unexpected node kind %q", docNode.Kind) + } + + if len(docNode.Content) != 1 { + return nil, fmt.Errorf("unexpected number of nodes %d", len(docNode.Content)) + } + + kind, err := findKind(docNode.Content[0]) + if err != nil { + return nil, fmt.Errorf("error in document at line %d:%d: %w", docNode.Line, docNode.Column, err) + } + + model, err := models.New(kind) + if err != nil { + return nil, fmt.Errorf("error in document at line %d:%d: %w", docNode.Line, docNode.Column, err) + } + + // YAML decoder doesn't allow to decode with KnownFields: true from a Node + // so we do a roundtrip to bytes and back :sigh: + raw, err := yaml.Marshal(docNode.Content[0]) + if err != nil { + return nil, fmt.Errorf("error marshaling document at line %d:%d: %w", docNode.Line, docNode.Column, err) + } + + documentDecoder := yaml.NewDecoder(bytes.NewReader(raw)) + documentDecoder.KnownFields(true) + + if err = documentDecoder.Decode(model); err != nil { + return nil, fmt.Errorf("error decoding document at line %d:%d: %w", docNode.Line, docNode.Column, err) + } + + template.models = append(template.models, model) + } +} + +func findKind(node *yaml.Node) (string, error) { + if node.Kind != yaml.MappingNode { + return "", fmt.Errorf("unexpected node kind %q, expecting mapping", node.Kind) + } + + for i := 0; i < len(node.Content); i += 2 { + key := node.Content[i] + value := node.Content[i+1] + + if key.Kind != yaml.ScalarNode { + return "", fmt.Errorf("unexpected node kind %q", key.Kind) + } + + if key.Value != "kind" { + continue + } + + if value.Kind != yaml.ScalarNode { + return "", fmt.Errorf("unexpected value type for kind field %q", value.Kind) + } + + return value.Value, nil + } + + return "", fmt.Errorf("kind field not found") +} + +// WithCluster creates an empty template which contains only cluster model. +// +// Such template can be used for reading a cluster status, deleting a cluster, etc. +func WithCluster(clusterName string) *Template { + return &Template{ + models: models.List{ + &models.Cluster{ + Meta: models.Meta{ + Kind: models.KindCluster, + }, + Name: clusterName, + }, + }, + } +} + +// Validate the template. +func (t *Template) Validate() error { + return t.models.Validate() +} + +// Translate the template into resources. +func (t *Template) Translate() ([]resource.Resource, error) { + return t.models.Translate() +} + +// ClusterName returns the name of the cluster associated with the template. +func (t *Template) ClusterName() (string, error) { + return t.models.ClusterName() +} + +// actualResources returns a list of resources in the state related to the cluster template. +func (t *Template) actualResources(ctx context.Context, st state.State) ([]resource.Resource, error) { + clusterName, err := t.models.ClusterName() + if err != nil { + return nil, err + } + + var actualResources []resource.Resource + + clusterResource, err := st.Get(ctx, resource.NewMetadata(resources.DefaultNamespace, omni.ClusterType, clusterName, resource.VersionUndefined)) + if err != nil { + if !state.IsNotFoundError(err) { + return nil, err + } + } else { + actualResources = append(actualResources, clusterResource) + } + + for _, resourceType := range []resource.Type{ + omni.MachineSetType, + omni.MachineSetNodeType, + omni.ConfigPatchType, + } { + items, err := st.List( + ctx, + resource.NewMetadata(resources.DefaultNamespace, resourceType, "", resource.VersionUndefined), + state.WithLabelQuery(resource.LabelEqual(omni.LabelCluster, clusterName)), + ) + if err != nil { + return nil, err + } + + actualResources = append(actualResources, + xslices.Filter(items.Items, + func(r resource.Resource) bool { + return r.Metadata().Owner() == "" + }, + )...) + } + + return actualResources, nil +} + +func splitResourcesToDelete(toDelete []resource.Resource) [][]resource.Resource { + phases := make([][]resource.Resource, 2) + + for _, r := range deduplicateDeletion(toDelete) { + switch r.Metadata().Type() { + case omni.MachineSetNodeType, omni.MachineSetType: + phases[0] = append(phases[0], r) + default: + phases[1] = append(phases[1], r) + } + } + + for i := range phases { + sortResources(phases[i], func(r resource.Resource) resource.Metadata { return *r.Metadata() }) + } + + return phases +} + +// Delete returns a sync result which lists what needs to be deleted from state to remove template from the cluster. +func (t *Template) Delete(ctx context.Context, st state.State) (*SyncResult, error) { + actualResources, err := t.actualResources(ctx, st) + if err != nil { + return nil, err + } + + syncResult := SyncResult{ + Destroy: splitResourcesToDelete(actualResources), + } + + return &syncResult, nil +} + +func metadataKey(md resource.Metadata) string { + return fmt.Sprintf("%s/%s/%s", md.Namespace(), md.Type(), md.ID()) +} + +// Sync the template against the resource state. +func (t *Template) Sync(ctx context.Context, st state.State) (*SyncResult, error) { + clusterName, err := t.models.ClusterName() + if err != nil { + return nil, err + } + + expectedResources, err := t.Translate() + if err != nil { + return nil, err + } + + actualResources, err := t.actualResources(ctx, st) + if err != nil { + return nil, err + } + + expectedResourceMap := xslices.ToMap(expectedResources, func(r resource.Resource) (string, resource.Resource) { + return metadataKey(*r.Metadata()), r + }) + + var ( + syncResult SyncResult + toDelete []resource.Resource + ) + + for _, actualResource := range actualResources { + if expectedResource, ok := expectedResourceMap[metadataKey(*actualResource.Metadata())]; ok { + // copy some metadata to minimize the diff + expectedResource.Metadata().SetVersion(actualResource.Metadata().Version()) + expectedResource.Metadata().SetUpdated(actualResource.Metadata().Updated()) + expectedResource.Metadata().SetCreated(actualResource.Metadata().Created()) + expectedResource.Metadata().Finalizers().Set(*actualResource.Metadata().Finalizers()) + + if !resource.Equal(actualResource, expectedResource) { + syncResult.Update = append(syncResult.Update, UpdateChange{Old: actualResource, New: expectedResource}) + } + } else { + // check that actual resource belongs to the cluster to avoid removing resources from other clusters + if actualResource.Metadata().Type() != omni.ClusterType { + if clusterLabel, _ := actualResource.Metadata().Labels().Get(omni.LabelCluster); clusterLabel != clusterName { + return nil, fmt.Errorf("resource %s belongs to cluster %q, but template is for cluster %q", resource.String(actualResource), clusterLabel, clusterName) + } + } + + toDelete = append(toDelete, actualResource) + } + + delete(expectedResourceMap, metadataKey(*actualResource.Metadata())) + } + + for _, expectedResource := range expectedResourceMap { + if _, ok := expectedResourceMap[metadataKey(*expectedResource.Metadata())]; ok { + // check that no such resource exists (for a different cluster) + if actualResource, err := st.Get(ctx, *expectedResource.Metadata()); err == nil { + clusterLabel, _ := actualResource.Metadata().Labels().Get(omni.LabelCluster) + + return nil, fmt.Errorf("resource %s already exists from cluster %q, but template is for cluster %q", resource.String(actualResource), clusterLabel, clusterName) + } + + syncResult.Create = append(syncResult.Create, expectedResource) + } + } + + sortResources(syncResult.Create, func(r resource.Resource) resource.Metadata { return *r.Metadata() }) + sortResources(syncResult.Update, func(u UpdateChange) resource.Metadata { return *u.New.Metadata() }) + syncResult.Destroy = splitResourcesToDelete(toDelete) + + return &syncResult, nil +} + +func deduplicateDeletion(toDelete []resource.Resource) []resource.Resource { + toDeleteMap := xslices.ToMap(toDelete, func(r resource.Resource) (string, resource.Resource) { + return metadataKey(*r.Metadata()), r + }) + + r := xslices.Filter(toDelete, func(r resource.Resource) bool { + switch r.Metadata().Type() { + case omni.ClusterType: + return true + case omni.MachineSetNodeType: + machineSetName, ok := r.Metadata().Labels().Get(omni.LabelMachineSet) + if !ok { + return true + } + + if _, ok := toDeleteMap[metadataKey(resource.NewMetadata(resources.DefaultNamespace, omni.MachineSetType, machineSetName, resource.VersionUndefined))]; ok { + return false + } + default: + clusterName, ok := r.Metadata().Labels().Get(omni.LabelCluster) + if !ok { + return true + } + + if _, ok := toDeleteMap[metadataKey(resource.NewMetadata(resources.DefaultNamespace, omni.ClusterType, clusterName, resource.VersionUndefined))]; ok { + return false + } + } + + return true + }) + + return r +} diff --git a/client/pkg/template/template_test.go b/client/pkg/template/template_test.go new file mode 100644 index 00000000..9f6ce486 --- /dev/null +++ b/client/pkg/template/template_test.go @@ -0,0 +1,441 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package template_test + +import ( + "bytes" + "context" + _ "embed" + "fmt" + "os" + "strings" + "testing" + "time" + + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/state" + "github.com/cosi-project/runtime/pkg/state/impl/inmem" + "github.com/cosi-project/runtime/pkg/state/impl/namespaced" + "github.com/siderolabs/gen/xslices" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "gopkg.in/yaml.v3" + + "github.com/siderolabs/omni/client/pkg/template" +) + +//go:embed testdata/cluster1.yaml +var cluster1 []byte + +//go:embed testdata/cluster2.yaml +var cluster2 []byte + +//go:embed testdata/cluster3.yaml +var cluster3 []byte + +//go:embed testdata/cluster-valid-bootstrapspec.yaml +var clusterValidBootstrapSpec []byte + +//go:embed testdata/cluster-bad-yaml1.yaml +var clusterBadYAML1 []byte + +//go:embed testdata/cluster-bad-yaml2.yaml +var clusterBadYAML2 []byte + +//go:embed testdata/cluster-bad-yaml3.yaml +var clusterBadYAML3 []byte + +//go:embed testdata/cluster-invalid1.yaml +var clusterInvalid1 []byte + +//go:embed testdata/cluster-invalid2.yaml +var clusterInvalid2 []byte + +//go:embed testdata/cluster-invalid3.yaml +var clusterInvalid3 []byte + +//go:embed testdata/cluster-invalid4.yaml +var clusterInvalid4 []byte + +//go:embed testdata/cluster-invalid-bootstrapspec.yaml +var clusterInvalidBootstrapSpec []byte + +//go:embed testdata/cluster1-resources.yaml +var cluster1Resources []byte + +//go:embed testdata/cluster2-resources.yaml +var cluster2Resources []byte + +//go:embed testdata/cluster3-resources.yaml +var cluster3Resources []byte + +//go:embed testdata/cluster-valid-bootstrapspec-resources.yaml +var clusterValidBootstrapSpecResources []byte + +func TestLoad(t *testing.T) { + for _, tt := range []struct { //nolint:govet + name string + data []byte + expectedError string + }{ + { + name: "cluster1", + data: cluster1, + }, + { + name: "cluster2", + data: cluster2, + }, + { + name: "clusterBadYAML1", + data: clusterBadYAML1, + expectedError: "error decoding document at line 1:1: yaml: unmarshal errors:\n line 7: field containerd not found in type models.Cluster", + }, + { + name: "clusterBadYAML2", + data: clusterBadYAML2, + expectedError: "error in document at line 1:1: unknown model kind \"FunnyCluster\"", + }, + { + name: "clusterBadYAML3", + data: clusterBadYAML3, + expectedError: "error in document at line 1:1: kind field not found", + }, + } { + t.Run(tt.name, func(t *testing.T) { + _, err := template.Load(bytes.NewReader(tt.data)) + if tt.expectedError == "" { + require.NoError(t, err) + } else { + require.EqualError(t, err, tt.expectedError) + } + }) + } +} + +func TestValidate(t *testing.T) { + cwd, err := os.Getwd() + require.NoError(t, err) + + require.NoError(t, os.Chdir("testdata")) + t.Cleanup(func() { + os.Chdir(cwd) //nolint:errcheck + }) + + for _, tt := range []struct { //nolint:govet + name string + data []byte + expectedError string + }{ + { + name: "cluster1", + data: cluster1, + }, + { + name: "cluster2", + data: cluster2, + }, + { + name: "cluster3", + data: cluster3, + }, + { + name: "clusterInvalid1", + data: clusterInvalid1, + expectedError: `5 errors occurred: + * error validating cluster "my first cluster": 5 errors occurred: + * name should only contain letters, digits, dashes and underscores + * error validating Kubernetes version: 1 error occurred: + * version should be in semver format: Invalid character(s) found in major number "N" + + + * error validating Talos version: 1 error occurred: + * version should be in semver format: Invalid character(s) found in patch number "0gamma.0" + + + * patch "does-not-exist.yaml" is invalid: 1 error occurred: + * failed to access "does-not-exist.yaml": open does-not-exist.yaml: no such file or directory + + + * patch "" is invalid: 1 error occurred: + * either name or idOverride is required for inline patches + + + + + * controlplane is invalid: 4 errors occurred: + * updateStrategy is not allowed in the controlplane + * deleteStrategy is not allowed in the controlplane + * patch "patches/invalid.yaml" is invalid: 1 error occurred: + * failed to validate patch "patches/invalid.yaml": missing kind + + + * patch "kubespan-enabled" is invalid: 1 error occurred: + * failed to validate inline patch "kubespan-enabled": unknown keys found during decoding: +machine: + network: + kubespan: + running: true + + + + + + * machines [4aed1106-6f44-4be9-9796-d4b5b0b5b0b0] are used in both controlplane and workers + * machine "630d882a-51a8-48b3-ae00-90c5b0b5b0b0" is not used in controlplane or workers + * machine "430d882a-51a8-48b3-ae00-90c5b0b5b0b0" is locked and used in controlplane + +`, + }, + { + name: "clusterInvalid2", + data: clusterInvalid2, + expectedError: `3 errors occurred: + * error validating cluster "": 4 errors occurred: + * name is required + * error validating Kubernetes version: 1 error occurred: + * version is required + + + * error validating Talos version: 1 error occurred: + * version is required + + + * patch "" is invalid: 1 error occurred: + * path or inline is required + + + + + * controlplane is invalid: 1 error occurred: + * patch "patches/prohibited.yaml" is invalid: 1 error occurred: + * failed to validate patch "patches/prohibited.yaml": 1 error occurred: + * overriding "machine.token" is not allowed in the config patch + + + + + + + * template should contain 1 controlplane, got 2 + +`, + }, + { + name: "clusterInvalid3", + data: clusterInvalid3, + expectedError: `3 errors occurred: + * controlplane is invalid: 1 error occurred: + * custom name is not allowed in the controlplane + + + * duplicate workers with name "additional-1" + * machine "b1ed45d8-4e79-4a07-a29a-b1b075843d41" is used in multiple workers: ["additional-1" "additional-2"] + +`, + }, + { + name: "clusterInvalid4", + data: clusterInvalid4, + expectedError: `1 error occurred: + * workers is invalid: 1 error occurred: + * machine set can not have both machines and machine class defined`, + }, + { + name: "clusterInvalidBootstrapSpec", + data: clusterInvalidBootstrapSpec, + expectedError: `2 errors occurred: + * controlplane is invalid: 2 errors occurred: + * clusterUUID is required in bootstrapSpec + * snapshot is required in bootstrapSpec + + + * workers is invalid: 1 error occurred: + * bootstrapSpec is not allowed in workers`, + }, + } { + t.Run(tt.name, func(t *testing.T) { + templ, err := template.Load(bytes.NewReader(tt.data)) + require.NoError(t, err) + + err = templ.Validate() + if tt.expectedError == "" { + require.NoError(t, err) + + return + } + + printMode := false + if printMode { + fmt.Printf("ACTUAL ERROR:\n%s\n", err.Error()) + + return + } + + require.Equal(t, strings.TrimSpace(tt.expectedError), strings.TrimSpace(err.Error()), err.Error()) + }) + } +} + +func TestTranslate(t *testing.T) { + cwd, err := os.Getwd() + require.NoError(t, err) + + require.NoError(t, os.Chdir("testdata")) + t.Cleanup(func() { + os.Chdir(cwd) //nolint:errcheck + }) + + for _, tt := range []struct { + name string + template []byte + expected []byte + }{ + { + name: "cluster1", + template: cluster1, + expected: cluster1Resources, + }, + { + name: "cluster2", + template: cluster2, + expected: cluster2Resources, + }, + { + name: "cluster3", + template: cluster3, + expected: cluster3Resources, + }, + { + name: "clusterValidBootstrapSpec", + template: clusterValidBootstrapSpec, + expected: clusterValidBootstrapSpecResources, + }, + } { + t.Run(tt.name, func(t *testing.T) { + templ, err := template.Load(bytes.NewReader(tt.template)) + require.NoError(t, err) + + require.NoError(t, templ.Validate()) + + resources, err := templ.Translate() + require.NoError(t, err) + + var actual bytes.Buffer + + enc := yaml.NewEncoder(&actual) + + for _, r := range resources { + // zero timestamps for reproducibility + r.Metadata().SetCreated(time.Time{}) + r.Metadata().SetUpdated(time.Time{}) + + m, err := resource.MarshalYAML(r) + require.NoError(t, err) + + require.NoError(t, enc.Encode(m)) + } + + printMode := false + if printMode { + fmt.Printf("ACTUAL:\n%s\n", actual.String()) + + return + } + + require.Equal(t, string(tt.expected), actual.String()) + }) + } +} + +func TestSync(t *testing.T) { + cwd, err := os.Getwd() + require.NoError(t, err) + + require.NoError(t, os.Chdir("testdata")) + t.Cleanup(func() { + os.Chdir(cwd) //nolint:errcheck + }) + + st := state.WrapCore(namespaced.NewState(inmem.Build)) + + ctx := context.Background() + + templ1, err := template.Load(bytes.NewReader(cluster1)) + require.NoError(t, err) + + sync1, err := templ1.Sync(ctx, st) + require.NoError(t, err) + + assert.Equal(t, [][]resource.Resource{nil, nil}, sync1.Destroy) + assert.Empty(t, sync1.Update) + assert.Len(t, sync1.Create, 12) + + for _, r := range sync1.Create { + require.NoError(t, st.Create(ctx, r)) + } + + templ2, err := template.Load(bytes.NewReader(cluster2)) + require.NoError(t, err) + + sync2, err := templ2.Sync(ctx, st) + require.NoError(t, err) + + assert.Equal(t, [][]string{ + { + "MachineSetNodes.omni.sidero.dev(default/4aed1106-6f44-4be9-9796-d4b5b0b5b0b0)", + }, + { + "ConfigPatches.omni.sidero.dev(default/400-my-first-cluster-control-planes-patches/my-cp-patch.yaml)", + "ConfigPatches.omni.sidero.dev(default/401-my-first-cluster-control-planes-kubespan-enabled)", + }, + }, xslices.Map(sync2.Destroy, func(x []resource.Resource) []string { return xslices.Map(x, resource.String) })) + + assert.Equal(t, []string{ + "Clusters.omni.sidero.dev(default/my-first-cluster)", + "ConfigPatches.omni.sidero.dev(default/000-cm-430d882a-51a8-48b3-ae00-90c5b0b5b0b0-install-disk)", + "MachineSetNodes.omni.sidero.dev(default/430d882a-51a8-48b3-ab00-d4b5b0b5b0b0)", + }, xslices.Map(sync2.Update, func(u template.UpdateChange) string { return resource.String(u.New) })) + + assert.Equal(t, []string{ + "ConfigPatches.omni.sidero.dev(default/400-my-first-cluster-control-planes-kubespan-enabled)", + }, xslices.Map(sync2.Create, resource.String)) +} + +func TestDelete(t *testing.T) { + cwd, err := os.Getwd() + require.NoError(t, err) + + require.NoError(t, os.Chdir("testdata")) + t.Cleanup(func() { + os.Chdir(cwd) //nolint:errcheck + }) + + st := state.WrapCore(namespaced.NewState(inmem.Build)) + + ctx := context.Background() + + templ1, err := template.Load(bytes.NewReader(cluster1)) + require.NoError(t, err) + + sync1, err := templ1.Sync(ctx, st) + require.NoError(t, err) + + for _, r := range sync1.Create { + require.NoError(t, st.Create(ctx, r)) + } + + templ2, err := template.Load(bytes.NewReader(cluster2)) + require.NoError(t, err) + + syncDelete, err := templ2.Delete(ctx, st) + require.NoError(t, err) + + assert.Empty(t, syncDelete.Create) + assert.Empty(t, syncDelete.Update) + assert.Len(t, syncDelete.Destroy, 2) + assert.Len(t, syncDelete.Destroy[0], 0) + assert.Len(t, syncDelete.Destroy[1], 1) +} diff --git a/client/pkg/template/testdata/cluster-bad-yaml1.yaml b/client/pkg/template/testdata/cluster-bad-yaml1.yaml new file mode 100644 index 00000000..3262f3e5 --- /dev/null +++ b/client/pkg/template/testdata/cluster-bad-yaml1.yaml @@ -0,0 +1,8 @@ +kind: Cluster +name: my-first-cluster +kubernetes: + version: v1.18.2 +talos: + version: v1.3.0 +containerd: + version: 1.6.12 diff --git a/client/pkg/template/testdata/cluster-bad-yaml2.yaml b/client/pkg/template/testdata/cluster-bad-yaml2.yaml new file mode 100644 index 00000000..45b521d6 --- /dev/null +++ b/client/pkg/template/testdata/cluster-bad-yaml2.yaml @@ -0,0 +1,6 @@ +kind: FunnyCluster +name: my-first-cluster +kubernetes: + version: v1.18.2 +talos: + version: v1.3.0 diff --git a/client/pkg/template/testdata/cluster-bad-yaml3.yaml b/client/pkg/template/testdata/cluster-bad-yaml3.yaml new file mode 100644 index 00000000..64d1face --- /dev/null +++ b/client/pkg/template/testdata/cluster-bad-yaml3.yaml @@ -0,0 +1,5 @@ +name: my-first-cluster +kubernetes: + version: v1.18.2 +talos: + version: v1.3.0 diff --git a/client/pkg/template/testdata/cluster-invalid-bootstrapspec.yaml b/client/pkg/template/testdata/cluster-invalid-bootstrapspec.yaml new file mode 100644 index 00000000..e199a1d4 --- /dev/null +++ b/client/pkg/template/testdata/cluster-invalid-bootstrapspec.yaml @@ -0,0 +1,20 @@ +kind: Cluster +name: my-first-cluster +kubernetes: + version: v1.18.2 +talos: + version: v1.3.0 +--- +kind: ControlPlane +machines: + - 430d882a-51a8-48b3-ae00-90c5b0b5b0b0 +bootstrapSpec: + clusterUUID: "" + snapshot: "" +--- +kind: Workers +machines: + - 18308f52-b833-4376-a7c8-1cb9de2feafd +bootstrapSpec: + clusterUUID: test-cluster-uuid + snapshot: TEST.snapshot diff --git a/client/pkg/template/testdata/cluster-invalid1.yaml b/client/pkg/template/testdata/cluster-invalid1.yaml new file mode 100644 index 00000000..061e9932 --- /dev/null +++ b/client/pkg/template/testdata/cluster-invalid1.yaml @@ -0,0 +1,41 @@ +kind: Cluster +name: my first cluster # invalid: contains spaces +kubernetes: + version: vN.2 # invalid version +talos: + version: v1.3.0gamma.0 # invalid version +patches: + - file: does-not-exist.yaml # doesn't exist + - inline: # no name + machine: + network: +--- +kind: ControlPlane +machines: + - 430d882a-51a8-48b3-ae00-90c5b0b5b0b0 + - 4aed1106-6f44-4be9-9796-d4b5b0b5b0b0 +updateStrategy: + rolling: + maxParallelism: 2 +deleteStrategy: + type: Rolling +patches: + - file: patches/invalid.yaml # invalid content + - name: kubespan-enabled # invalid content + inline: + machine: + network: + kubespan: + running: true +--- +kind: Workers +machines: + - 430d882a-51a8-48b3-ab00-d4b5b0b5b0b0 + - 4aed1106-6f44-4be9-9796-d4b5b0b5b0b0 # duplicate across controlplanes and workers +--- +kind: Machine +name: 630d882a-51a8-48b3-ae00-90c5b0b5b0b0 # machine is not part of controlplane/workers +--- +kind: Machine +name: 430d882a-51a8-48b3-ae00-90c5b0b5b0b0 +locked: true diff --git a/client/pkg/template/testdata/cluster-invalid2.yaml b/client/pkg/template/testdata/cluster-invalid2.yaml new file mode 100644 index 00000000..6b934098 --- /dev/null +++ b/client/pkg/template/testdata/cluster-invalid2.yaml @@ -0,0 +1,15 @@ +kind: Cluster +name: +patches: + - {} +--- +kind: ControlPlane +machines: + - 430d882a-51a8-48b3-ae00-90c5b0b5b0b0 + - 4aed1106-6f44-4be9-9796-d4b5b0b5b0b0 +--- +kind: ControlPlane +machines: + - 430d882a-51a8-48b3-ab00-d4b5b0b5b0b0 +patches: + - file: patches/prohibited.yaml diff --git a/client/pkg/template/testdata/cluster-invalid3.yaml b/client/pkg/template/testdata/cluster-invalid3.yaml new file mode 100644 index 00000000..17c7e8e6 --- /dev/null +++ b/client/pkg/template/testdata/cluster-invalid3.yaml @@ -0,0 +1,53 @@ +kind: Cluster +name: my-first-cluster +kubernetes: + version: v1.18.2 +talos: + version: v1.3.1 + +# control plane +--- +kind: Machine +name: 4b9797ae-55d7-4717-a19e-b322a2d83d39 +--- +kind: ControlPlane +name: dodo +machines: + - 4b9797ae-55d7-4717-a19e-b322a2d83d39 + +# default workers +--- +kind: Machine +name: 947f7a99-0f46-4a9e-ab02-205f4e1b7009 +--- +kind: Workers +machines: + - 947f7a99-0f46-4a9e-ab02-205f4e1b7009 + +# additional workers 1 +--- +kind: Machine +name: b1ed45d8-4e79-4a07-a29a-b1b075843d41 +--- +kind: Workers +name: additional-1 +machines: + - b1ed45d8-4e79-4a07-a29a-b1b075843d41 + +# duplicate additional workers +--- +kind: Machine +name: 919b1d5b-daf8-4b82-bc0d-48929f05a405 +--- +kind: Workers +name: additional-1 +machines: + - 919b1d5b-daf8-4b82-bc0d-48929f05a405 + +# additional workers 2 with machines from additional-1 +--- +kind: Workers +name: additional-2 +machines: + - b1ed45d8-4e79-4a07-a29a-b1b075843d41 + diff --git a/client/pkg/template/testdata/cluster-invalid4.yaml b/client/pkg/template/testdata/cluster-invalid4.yaml new file mode 100644 index 00000000..a16a4c65 --- /dev/null +++ b/client/pkg/template/testdata/cluster-invalid4.yaml @@ -0,0 +1,31 @@ +kind: Cluster +name: my-first-cluster +kubernetes: + version: v1.18.2 +talos: + version: v1.3.0 +features: + diskEncryption: true +patches: + - file: patches/my-cluster-patch.yaml + - file: ../testdata/patches/my-registry-mirrors.yaml +--- +kind: ControlPlane +machineClass: + name: test + size: 1 +patches: + - file: patches/my-cp-patch.yaml # name is derived from the filename + - name: kubespan-enabled # weight is implied (000-999) + inline: + machine: + network: + kubespan: + enabled: true +--- +kind: Workers +machines: + - 430d882a-51a8-48b3-ab00-d4b5b0b5b0b0 +machineClass: + name: test + size: 1 diff --git a/client/pkg/template/testdata/cluster-valid-bootstrapspec-resources.yaml b/client/pkg/template/testdata/cluster-valid-bootstrapspec-resources.yaml new file mode 100644 index 00000000..201fdc0e --- /dev/null +++ b/client/pkg/template/testdata/cluster-valid-bootstrapspec-resources.yaml @@ -0,0 +1,91 @@ +metadata: + namespace: default + type: Clusters.omni.sidero.dev + id: my-cluster-with-bootstrapspec + version: undefined + owner: + phase: running + created: 0001-01-01T00:00:00Z + updated: 0001-01-01T00:00:00Z + annotations: + omni.sidero.dev/managed-by-cluster-templates: +spec: + installimage: "" + kubernetesversion: 1.18.2 + talosversion: 1.3.0 + features: + enableworkloadproxy: false + diskencryption: false + backupconfiguration: null +--- +metadata: + namespace: default + type: MachineSets.omni.sidero.dev + id: my-cluster-with-bootstrapspec-control-planes + version: undefined + owner: + phase: running + created: 0001-01-01T00:00:00Z + updated: 0001-01-01T00:00:00Z + labels: + omni.sidero.dev/cluster: my-cluster-with-bootstrapspec + omni.sidero.dev/role-controlplane: +spec: + updatestrategy: 1 + machineclass: null + bootstrapspec: + clusteruuid: test-cluster-uuid + snapshot: TEST.snapshot + deletestrategy: 0 + updatestrategyconfig: null + deletestrategyconfig: null +--- +metadata: + namespace: default + type: MachineSetNodes.omni.sidero.dev + id: 430d882a-51a8-48b3-ae00-90c5b0b5b0b0 + version: undefined + owner: + phase: running + created: 0001-01-01T00:00:00Z + updated: 0001-01-01T00:00:00Z + labels: + omni.sidero.dev/cluster: my-cluster-with-bootstrapspec + omni.sidero.dev/machine-set: my-cluster-with-bootstrapspec-control-planes + omni.sidero.dev/role-controlplane: +spec: {} +--- +metadata: + namespace: default + type: MachineSets.omni.sidero.dev + id: my-cluster-with-bootstrapspec-workers + version: undefined + owner: + phase: running + created: 0001-01-01T00:00:00Z + updated: 0001-01-01T00:00:00Z + labels: + omni.sidero.dev/cluster: my-cluster-with-bootstrapspec + omni.sidero.dev/role-worker: +spec: + updatestrategy: 1 + machineclass: null + bootstrapspec: null + deletestrategy: 0 + updatestrategyconfig: null + deletestrategyconfig: null +--- +metadata: + namespace: default + type: MachineSetNodes.omni.sidero.dev + id: 18308f52-b833-4376-a7c8-1cb9de2feafd + version: undefined + owner: + phase: running + created: 0001-01-01T00:00:00Z + updated: 0001-01-01T00:00:00Z + labels: + omni.sidero.dev/cluster: my-cluster-with-bootstrapspec + omni.sidero.dev/machine-set: my-cluster-with-bootstrapspec-workers + omni.sidero.dev/role-worker: +spec: {} diff --git a/client/pkg/template/testdata/cluster-valid-bootstrapspec.yaml b/client/pkg/template/testdata/cluster-valid-bootstrapspec.yaml new file mode 100644 index 00000000..c6ae8c61 --- /dev/null +++ b/client/pkg/template/testdata/cluster-valid-bootstrapspec.yaml @@ -0,0 +1,17 @@ +kind: Cluster +name: my-cluster-with-bootstrapspec +kubernetes: + version: v1.18.2 +talos: + version: v1.3.0 +--- +kind: ControlPlane +machines: + - 430d882a-51a8-48b3-ae00-90c5b0b5b0b0 +bootstrapSpec: + clusterUUID: test-cluster-uuid + snapshot: TEST.snapshot +--- +kind: Workers +machines: + - 18308f52-b833-4376-a7c8-1cb9de2feafd diff --git a/client/pkg/template/testdata/cluster1-resources.yaml b/client/pkg/template/testdata/cluster1-resources.yaml new file mode 100644 index 00000000..b98f526d --- /dev/null +++ b/client/pkg/template/testdata/cluster1-resources.yaml @@ -0,0 +1,238 @@ +metadata: + namespace: default + type: Clusters.omni.sidero.dev + id: my-first-cluster + version: undefined + owner: + phase: running + created: 0001-01-01T00:00:00Z + updated: 0001-01-01T00:00:00Z + annotations: + omni.sidero.dev/managed-by-cluster-templates: +spec: + installimage: "" + kubernetesversion: 1.18.2 + talosversion: 1.3.0 + features: + enableworkloadproxy: false + diskencryption: true + backupconfiguration: null +--- +metadata: + namespace: default + type: ConfigPatches.omni.sidero.dev + id: 200-cluster-my-first-cluster-patches/my-cluster-patch.yaml + version: undefined + owner: + phase: running + created: 0001-01-01T00:00:00Z + updated: 0001-01-01T00:00:00Z + labels: + omni.sidero.dev/cluster: my-first-cluster + annotations: + name: patches/my-cluster-patch.yaml +spec: + data: | + machine: + network: + kubespan: + enabled: true +--- +metadata: + namespace: default + type: ConfigPatches.omni.sidero.dev + id: 201-cluster-my-first-cluster-../testdata/patches/my-registry-mirrors.yaml + version: undefined + owner: + phase: running + created: 0001-01-01T00:00:00Z + updated: 0001-01-01T00:00:00Z + labels: + omni.sidero.dev/cluster: my-first-cluster + annotations: + name: ../testdata/patches/my-registry-mirrors.yaml +spec: + data: | + machine: + registries: + mirrors: + ghcr.io: + endpoints: + - https://ghcr.io + - https://ghcr.mirror.com +--- +metadata: + namespace: default + type: MachineSets.omni.sidero.dev + id: my-first-cluster-control-planes + version: undefined + owner: + phase: running + created: 0001-01-01T00:00:00Z + updated: 0001-01-01T00:00:00Z + labels: + omni.sidero.dev/cluster: my-first-cluster + omni.sidero.dev/role-controlplane: +spec: + updatestrategy: 1 + machineclass: null + bootstrapspec: null + deletestrategy: 0 + updatestrategyconfig: null + deletestrategyconfig: null +--- +metadata: + namespace: default + type: MachineSetNodes.omni.sidero.dev + id: 430d882a-51a8-48b3-ae00-90c5b0b5b0b0 + version: undefined + owner: + phase: running + created: 0001-01-01T00:00:00Z + updated: 0001-01-01T00:00:00Z + labels: + omni.sidero.dev/cluster: my-first-cluster + omni.sidero.dev/machine-set: my-first-cluster-control-planes + omni.sidero.dev/role-controlplane: +spec: {} +--- +metadata: + namespace: default + type: MachineSetNodes.omni.sidero.dev + id: 4aed1106-6f44-4be9-9796-d4b5b0b5b0b0 + version: undefined + owner: + phase: running + created: 0001-01-01T00:00:00Z + updated: 0001-01-01T00:00:00Z + labels: + omni.sidero.dev/cluster: my-first-cluster + omni.sidero.dev/machine-set: my-first-cluster-control-planes + omni.sidero.dev/role-controlplane: +spec: {} +--- +metadata: + namespace: default + type: ConfigPatches.omni.sidero.dev + id: 400-my-first-cluster-control-planes-patches/my-cp-patch.yaml + version: undefined + owner: + phase: running + created: 0001-01-01T00:00:00Z + updated: 0001-01-01T00:00:00Z + labels: + omni.sidero.dev/cluster: my-first-cluster + omni.sidero.dev/machine-set: my-first-cluster-control-planes + annotations: + name: patches/my-cp-patch.yaml +spec: + data: | + cluster: + apiServer: + extraArgs: + cloud-provider: external + cloud-config: /etc/kubernetes/cloud-config.yaml +--- +metadata: + namespace: default + type: ConfigPatches.omni.sidero.dev + id: 401-my-first-cluster-control-planes-kubespan-enabled + version: undefined + owner: + phase: running + created: 0001-01-01T00:00:00Z + updated: 0001-01-01T00:00:00Z + labels: + omni.sidero.dev/cluster: my-first-cluster + omni.sidero.dev/machine-set: my-first-cluster-control-planes + annotations: + name: kubespan-enabled +spec: + data: | + machine: + network: + kubespan: + enabled: true +--- +metadata: + namespace: default + type: MachineSets.omni.sidero.dev + id: my-first-cluster-workers + version: undefined + owner: + phase: running + created: 0001-01-01T00:00:00Z + updated: 0001-01-01T00:00:00Z + labels: + omni.sidero.dev/cluster: my-first-cluster + omni.sidero.dev/role-worker: +spec: + updatestrategy: 1 + machineclass: null + bootstrapspec: null + deletestrategy: 0 + updatestrategyconfig: null + deletestrategyconfig: null +--- +metadata: + namespace: default + type: MachineSetNodes.omni.sidero.dev + id: 430d882a-51a8-48b3-ab00-d4b5b0b5b0b0 + version: undefined + owner: + phase: running + created: 0001-01-01T00:00:00Z + updated: 0001-01-01T00:00:00Z + labels: + omni.sidero.dev/cluster: my-first-cluster + omni.sidero.dev/machine-set: my-first-cluster-workers + omni.sidero.dev/role-worker: + annotations: + omni.sidero.dev/locked: +spec: {} +--- +metadata: + namespace: default + type: ConfigPatches.omni.sidero.dev + id: 000-cm-430d882a-51a8-48b3-ae00-90c5b0b5b0b0-install-disk + version: undefined + owner: + phase: running + created: 0001-01-01T00:00:00Z + updated: 0001-01-01T00:00:00Z + labels: + omni.sidero.dev/cluster: my-first-cluster + omni.sidero.dev/cluster-machine: 430d882a-51a8-48b3-ae00-90c5b0b5b0b0 + omni.sidero.dev/system-patch: + annotations: + name: install-disk +spec: + data: | + machine: + install: + disk: /dev/vda +--- +metadata: + namespace: default + type: ConfigPatches.omni.sidero.dev + id: 400-cm-430d882a-51a8-48b3-ae00-90c5b0b5b0b0-my-address + version: undefined + owner: + phase: running + created: 0001-01-01T00:00:00Z + updated: 0001-01-01T00:00:00Z + labels: + omni.sidero.dev/cluster: my-first-cluster + omni.sidero.dev/cluster-machine: 430d882a-51a8-48b3-ae00-90c5b0b5b0b0 + annotations: + name: my-address +spec: + data: | + machine: + network: + interfaces: + - addresses: + - 192.168.0.2/24 + interface: eth0 + routes: + - gateway: 192.168.0.1 diff --git a/client/pkg/template/testdata/cluster1.yaml b/client/pkg/template/testdata/cluster1.yaml new file mode 100644 index 00000000..475cd1c5 --- /dev/null +++ b/client/pkg/template/testdata/cluster1.yaml @@ -0,0 +1,47 @@ +kind: Cluster +name: my-first-cluster +kubernetes: + version: v1.18.2 +talos: + version: v1.3.0 +features: + diskEncryption: true +patches: + - file: patches/my-cluster-patch.yaml + - file: ../testdata/patches/my-registry-mirrors.yaml +--- +kind: ControlPlane +machines: + - 430d882a-51a8-48b3-ae00-90c5b0b5b0b0 + - 4aed1106-6f44-4be9-9796-d4b5b0b5b0b0 +patches: + - file: patches/my-cp-patch.yaml # name is derived from the filename + - name: kubespan-enabled # weight is implied (000-999) + inline: + machine: + network: + kubespan: + enabled: true +--- +kind: Workers +machines: + - 430d882a-51a8-48b3-ab00-d4b5b0b5b0b0 +--- +kind: Machine +name: 430d882a-51a8-48b3-ae00-90c5b0b5b0b0 +install: + disk: /dev/vda +patches: # ClusterMachine ConfigPatch + - name: my-address + inline: + machine: + network: + interfaces: + - interface: eth0 + addresses: [192.168.0.2/24] + routes: + - gateway: "192.168.0.1" +--- +kind: Machine +name: 430d882a-51a8-48b3-ab00-d4b5b0b5b0b0 +locked: true diff --git a/client/pkg/template/testdata/cluster2-resources.yaml b/client/pkg/template/testdata/cluster2-resources.yaml new file mode 100644 index 00000000..1ac50176 --- /dev/null +++ b/client/pkg/template/testdata/cluster2-resources.yaml @@ -0,0 +1,199 @@ +metadata: + namespace: default + type: Clusters.omni.sidero.dev + id: my-first-cluster + version: undefined + owner: + phase: running + created: 0001-01-01T00:00:00Z + updated: 0001-01-01T00:00:00Z + annotations: + omni.sidero.dev/managed-by-cluster-templates: +spec: + installimage: "" + kubernetesversion: 1.18.2 + talosversion: 1.3.1 + features: + enableworkloadproxy: true + diskencryption: false + backupconfiguration: null +--- +metadata: + namespace: default + type: ConfigPatches.omni.sidero.dev + id: 200-cluster-my-first-cluster-patches/my-cluster-patch.yaml + version: undefined + owner: + phase: running + created: 0001-01-01T00:00:00Z + updated: 0001-01-01T00:00:00Z + labels: + omni.sidero.dev/cluster: my-first-cluster + annotations: + name: patches/my-cluster-patch.yaml +spec: + data: | + machine: + network: + kubespan: + enabled: true +--- +metadata: + namespace: default + type: ConfigPatches.omni.sidero.dev + id: 201-cluster-my-first-cluster-../testdata/patches/my-registry-mirrors.yaml + version: undefined + owner: + phase: running + created: 0001-01-01T00:00:00Z + updated: 0001-01-01T00:00:00Z + labels: + omni.sidero.dev/cluster: my-first-cluster + annotations: + name: ../testdata/patches/my-registry-mirrors.yaml +spec: + data: | + machine: + registries: + mirrors: + ghcr.io: + endpoints: + - https://ghcr.io + - https://ghcr.mirror.com +--- +metadata: + namespace: default + type: MachineSets.omni.sidero.dev + id: my-first-cluster-control-planes + version: undefined + owner: + phase: running + created: 0001-01-01T00:00:00Z + updated: 0001-01-01T00:00:00Z + labels: + omni.sidero.dev/cluster: my-first-cluster + omni.sidero.dev/role-controlplane: +spec: + updatestrategy: 1 + machineclass: null + bootstrapspec: null + deletestrategy: 0 + updatestrategyconfig: null + deletestrategyconfig: null +--- +metadata: + namespace: default + type: MachineSetNodes.omni.sidero.dev + id: 430d882a-51a8-48b3-ae00-90c5b0b5b0b0 + version: undefined + owner: + phase: running + created: 0001-01-01T00:00:00Z + updated: 0001-01-01T00:00:00Z + labels: + omni.sidero.dev/cluster: my-first-cluster + omni.sidero.dev/machine-set: my-first-cluster-control-planes + omni.sidero.dev/role-controlplane: +spec: {} +--- +metadata: + namespace: default + type: ConfigPatches.omni.sidero.dev + id: 400-my-first-cluster-control-planes-kubespan-enabled + version: undefined + owner: + phase: running + created: 0001-01-01T00:00:00Z + updated: 0001-01-01T00:00:00Z + labels: + omni.sidero.dev/cluster: my-first-cluster + omni.sidero.dev/machine-set: my-first-cluster-control-planes + annotations: + name: kubespan-enabled +spec: + data: | + machine: + network: + kubespan: + enabled: false +--- +metadata: + namespace: default + type: MachineSets.omni.sidero.dev + id: my-first-cluster-workers + version: undefined + owner: + phase: running + created: 0001-01-01T00:00:00Z + updated: 0001-01-01T00:00:00Z + labels: + omni.sidero.dev/cluster: my-first-cluster + omni.sidero.dev/role-worker: +spec: + updatestrategy: 1 + machineclass: null + bootstrapspec: null + deletestrategy: 0 + updatestrategyconfig: null + deletestrategyconfig: null +--- +metadata: + namespace: default + type: MachineSetNodes.omni.sidero.dev + id: 430d882a-51a8-48b3-ab00-d4b5b0b5b0b0 + version: undefined + owner: + phase: running + created: 0001-01-01T00:00:00Z + updated: 0001-01-01T00:00:00Z + labels: + omni.sidero.dev/cluster: my-first-cluster + omni.sidero.dev/machine-set: my-first-cluster-workers + omni.sidero.dev/role-worker: +spec: {} +--- +metadata: + namespace: default + type: ConfigPatches.omni.sidero.dev + id: 000-cm-430d882a-51a8-48b3-ae00-90c5b0b5b0b0-install-disk + version: undefined + owner: + phase: running + created: 0001-01-01T00:00:00Z + updated: 0001-01-01T00:00:00Z + labels: + omni.sidero.dev/cluster: my-first-cluster + omni.sidero.dev/cluster-machine: 430d882a-51a8-48b3-ae00-90c5b0b5b0b0 + omni.sidero.dev/system-patch: + annotations: + name: install-disk +spec: + data: | + machine: + install: + disk: /dev/vdb +--- +metadata: + namespace: default + type: ConfigPatches.omni.sidero.dev + id: 400-cm-430d882a-51a8-48b3-ae00-90c5b0b5b0b0-my-address + version: undefined + owner: + phase: running + created: 0001-01-01T00:00:00Z + updated: 0001-01-01T00:00:00Z + labels: + omni.sidero.dev/cluster: my-first-cluster + omni.sidero.dev/cluster-machine: 430d882a-51a8-48b3-ae00-90c5b0b5b0b0 + annotations: + name: my-address +spec: + data: | + machine: + network: + interfaces: + - addresses: + - 192.168.0.2/24 + interface: eth0 + routes: + - gateway: 192.168.0.1 diff --git a/client/pkg/template/testdata/cluster2.yaml b/client/pkg/template/testdata/cluster2.yaml new file mode 100644 index 00000000..1d935a28 --- /dev/null +++ b/client/pkg/template/testdata/cluster2.yaml @@ -0,0 +1,41 @@ +kind: Cluster +name: my-first-cluster +kubernetes: + version: v1.18.2 +talos: + version: v1.3.1 +features: + enableWorkloadProxy: true +patches: + - file: patches/my-cluster-patch.yaml + - file: ../testdata/patches/my-registry-mirrors.yaml +--- +kind: ControlPlane +machines: + - 430d882a-51a8-48b3-ae00-90c5b0b5b0b0 +patches: + - name: kubespan-enabled # weight is implied (000-999) + inline: + machine: + network: + kubespan: + enabled: false +--- +kind: Workers +machines: + - 430d882a-51a8-48b3-ab00-d4b5b0b5b0b0 +--- +kind: Machine +name: 430d882a-51a8-48b3-ae00-90c5b0b5b0b0 +install: + disk: /dev/vdb +patches: # ClusterMachine ConfigPatch + - name: my-address + inline: + machine: + network: + interfaces: + - interface: eth0 + addresses: [192.168.0.2/24] + routes: + - gateway: "192.168.0.1" diff --git a/client/pkg/template/testdata/cluster3-resources.yaml b/client/pkg/template/testdata/cluster3-resources.yaml new file mode 100644 index 00000000..102e57eb --- /dev/null +++ b/client/pkg/template/testdata/cluster3-resources.yaml @@ -0,0 +1,249 @@ +metadata: + namespace: default + type: Clusters.omni.sidero.dev + id: my-first-cluster + version: undefined + owner: + phase: running + created: 0001-01-01T00:00:00Z + updated: 0001-01-01T00:00:00Z + annotations: + omni.sidero.dev/managed-by-cluster-templates: +spec: + installimage: "" + kubernetesversion: 1.18.2 + talosversion: 1.3.1 + features: + enableworkloadproxy: false + diskencryption: false + backupconfiguration: null +--- +metadata: + namespace: default + type: MachineSets.omni.sidero.dev + id: my-first-cluster-control-planes + version: undefined + owner: + phase: running + created: 0001-01-01T00:00:00Z + updated: 0001-01-01T00:00:00Z + labels: + omni.sidero.dev/cluster: my-first-cluster + omni.sidero.dev/role-controlplane: +spec: + updatestrategy: 1 + machineclass: null + bootstrapspec: null + deletestrategy: 0 + updatestrategyconfig: null + deletestrategyconfig: null +--- +metadata: + namespace: default + type: MachineSetNodes.omni.sidero.dev + id: 4b9797ae-55d7-4717-a19e-b322a2d83d39 + version: undefined + owner: + phase: running + created: 0001-01-01T00:00:00Z + updated: 0001-01-01T00:00:00Z + labels: + omni.sidero.dev/cluster: my-first-cluster + omni.sidero.dev/machine-set: my-first-cluster-control-planes + omni.sidero.dev/role-controlplane: +spec: {} +--- +metadata: + namespace: default + type: MachineSets.omni.sidero.dev + id: my-first-cluster-workers + version: undefined + owner: + phase: running + created: 0001-01-01T00:00:00Z + updated: 0001-01-01T00:00:00Z + labels: + omni.sidero.dev/cluster: my-first-cluster + omni.sidero.dev/role-worker: +spec: + updatestrategy: 1 + machineclass: null + bootstrapspec: null + deletestrategy: 0 + updatestrategyconfig: null + deletestrategyconfig: null +--- +metadata: + namespace: default + type: MachineSetNodes.omni.sidero.dev + id: 947f7a99-0f46-4a9e-ab02-205f4e1b7009 + version: undefined + owner: + phase: running + created: 0001-01-01T00:00:00Z + updated: 0001-01-01T00:00:00Z + labels: + omni.sidero.dev/cluster: my-first-cluster + omni.sidero.dev/machine-set: my-first-cluster-workers + omni.sidero.dev/role-worker: +spec: {} +--- +metadata: + namespace: default + type: MachineSets.omni.sidero.dev + id: my-first-cluster-additional-1 + version: undefined + owner: + phase: running + created: 0001-01-01T00:00:00Z + updated: 0001-01-01T00:00:00Z + labels: + omni.sidero.dev/cluster: my-first-cluster + omni.sidero.dev/role-worker: +spec: + updatestrategy: 1 + machineclass: null + bootstrapspec: null + deletestrategy: 1 + updatestrategyconfig: + rolling: + maxparallelism: 3 + deletestrategyconfig: + rolling: + maxparallelism: 5 +--- +metadata: + namespace: default + type: MachineSetNodes.omni.sidero.dev + id: b1ed45d8-4e79-4a07-a29a-b1b075843d41 + version: undefined + owner: + phase: running + created: 0001-01-01T00:00:00Z + updated: 0001-01-01T00:00:00Z + labels: + omni.sidero.dev/cluster: my-first-cluster + omni.sidero.dev/machine-set: my-first-cluster-additional-1 + omni.sidero.dev/role-worker: +spec: {} +--- +metadata: + namespace: default + type: MachineSetNodes.omni.sidero.dev + id: 7d75e61c-ebc8-4faa-a763-6e2b14714720 + version: undefined + owner: + phase: running + created: 0001-01-01T00:00:00Z + updated: 0001-01-01T00:00:00Z + labels: + omni.sidero.dev/cluster: my-first-cluster + omni.sidero.dev/machine-set: my-first-cluster-additional-1 + omni.sidero.dev/role-worker: +spec: {} +--- +metadata: + namespace: default + type: ConfigPatches.omni.sidero.dev + id: 400-my-first-cluster-additional-1-my-address + version: undefined + owner: + phase: running + created: 0001-01-01T00:00:00Z + updated: 0001-01-01T00:00:00Z + labels: + omni.sidero.dev/cluster: my-first-cluster + omni.sidero.dev/machine-set: my-first-cluster-additional-1 + annotations: + name: my-address +spec: + data: | + machine: + network: + interfaces: + - addresses: + - 192.168.0.2/24 + interface: eth0 + routes: + - gateway: 192.168.0.1 +--- +metadata: + namespace: default + type: MachineSets.omni.sidero.dev + id: my-first-cluster-additional-2 + version: undefined + owner: + phase: running + created: 0001-01-01T00:00:00Z + updated: 0001-01-01T00:00:00Z + labels: + omni.sidero.dev/cluster: my-first-cluster + omni.sidero.dev/role-worker: +spec: + updatestrategy: 0 + machineclass: null + bootstrapspec: null + deletestrategy: 0 + updatestrategyconfig: null + deletestrategyconfig: null +--- +metadata: + namespace: default + type: MachineSetNodes.omni.sidero.dev + id: 919b1d5b-daf8-4b82-bc0d-48929f05a405 + version: undefined + owner: + phase: running + created: 0001-01-01T00:00:00Z + updated: 0001-01-01T00:00:00Z + labels: + omni.sidero.dev/cluster: my-first-cluster + omni.sidero.dev/machine-set: my-first-cluster-additional-2 + omni.sidero.dev/role-worker: +spec: {} +--- +metadata: + namespace: default + type: MachineSets.omni.sidero.dev + id: my-first-cluster-additional-3 + version: undefined + owner: + phase: running + created: 0001-01-01T00:00:00Z + updated: 0001-01-01T00:00:00Z + labels: + omni.sidero.dev/cluster: my-first-cluster + omni.sidero.dev/role-worker: +spec: + updatestrategy: 1 + machineclass: + name: test + machinecount: 1 + allocationtype: 0 + bootstrapspec: null + deletestrategy: 0 + updatestrategyconfig: null + deletestrategyconfig: null +--- +metadata: + namespace: default + type: MachineSets.omni.sidero.dev + id: my-first-cluster-additional-4 + version: undefined + owner: + phase: running + created: 0001-01-01T00:00:00Z + updated: 0001-01-01T00:00:00Z + labels: + omni.sidero.dev/cluster: my-first-cluster + omni.sidero.dev/role-worker: +spec: + updatestrategy: 1 + machineclass: + name: test + machinecount: 0 + allocationtype: 1 + bootstrapspec: null + deletestrategy: 0 + updatestrategyconfig: null + deletestrategyconfig: null diff --git a/client/pkg/template/testdata/cluster3.yaml b/client/pkg/template/testdata/cluster3.yaml new file mode 100644 index 00000000..8278be40 --- /dev/null +++ b/client/pkg/template/testdata/cluster3.yaml @@ -0,0 +1,79 @@ +kind: Cluster +name: my-first-cluster +kubernetes: + version: v1.18.2 +talos: + version: v1.3.1 + +# control plane +--- +kind: Machine +name: 4b9797ae-55d7-4717-a19e-b322a2d83d39 +--- +kind: ControlPlane +machines: + - 4b9797ae-55d7-4717-a19e-b322a2d83d39 + +# default workers +--- +kind: Machine +name: 947f7a99-0f46-4a9e-ab02-205f4e1b7009 +--- +kind: Workers +machines: + - 947f7a99-0f46-4a9e-ab02-205f4e1b7009 + +# additional workers 1 +--- +kind: Machine +name: b1ed45d8-4e79-4a07-a29a-b1b075843d41 +--- +kind: Machine +name: 7d75e61c-ebc8-4faa-a763-6e2b14714720 +--- +kind: Workers +name: additional-1 +machines: + - b1ed45d8-4e79-4a07-a29a-b1b075843d41 + - 7d75e61c-ebc8-4faa-a763-6e2b14714720 +updateStrategy: + rolling: + maxParallelism: 3 +deleteStrategy: + type: Rolling + rolling: + maxParallelism: 5 +patches: # ClusterMachine ConfigPatch + - name: my-address + inline: + machine: + network: + interfaces: + - interface: eth0 + addresses: [192.168.0.2/24] + routes: + - gateway: "192.168.0.1" + +# additional workers 2 +--- +kind: Machine +name: 919b1d5b-daf8-4b82-bc0d-48929f05a405 +--- +kind: Workers +name: additional-2 +updateStrategy: + type: Unset +machines: + - 919b1d5b-daf8-4b82-bc0d-48929f05a405 +--- +kind: Workers +name: additional-3 +machineClass: + name: test + size: 1 +--- +kind: Workers +name: additional-4 +machineClass: + name: test + size: unlimited diff --git a/client/pkg/template/testdata/patches/invalid.yaml b/client/pkg/template/testdata/patches/invalid.yaml new file mode 100644 index 00000000..ba23b4d7 --- /dev/null +++ b/client/pkg/template/testdata/patches/invalid.yaml @@ -0,0 +1,2 @@ +spaceship: + deployed: true diff --git a/client/pkg/template/testdata/patches/my-cluster-patch.yaml b/client/pkg/template/testdata/patches/my-cluster-patch.yaml new file mode 100644 index 00000000..a86dd401 --- /dev/null +++ b/client/pkg/template/testdata/patches/my-cluster-patch.yaml @@ -0,0 +1,4 @@ +machine: + network: + kubespan: + enabled: true diff --git a/client/pkg/template/testdata/patches/my-cp-patch.yaml b/client/pkg/template/testdata/patches/my-cp-patch.yaml new file mode 100644 index 00000000..9ad8a85b --- /dev/null +++ b/client/pkg/template/testdata/patches/my-cp-patch.yaml @@ -0,0 +1,5 @@ +cluster: + apiServer: + extraArgs: + cloud-provider: external + cloud-config: /etc/kubernetes/cloud-config.yaml diff --git a/client/pkg/template/testdata/patches/my-registry-mirrors.yaml b/client/pkg/template/testdata/patches/my-registry-mirrors.yaml new file mode 100644 index 00000000..deff5dc9 --- /dev/null +++ b/client/pkg/template/testdata/patches/my-registry-mirrors.yaml @@ -0,0 +1,7 @@ +machine: + registries: + mirrors: + ghcr.io: + endpoints: + - https://ghcr.io + - https://ghcr.mirror.com diff --git a/client/pkg/template/testdata/patches/prohibited.yaml b/client/pkg/template/testdata/patches/prohibited.yaml new file mode 100644 index 00000000..77988493 --- /dev/null +++ b/client/pkg/template/testdata/patches/prohibited.yaml @@ -0,0 +1,2 @@ +machine: + token: haha diff --git a/client/pkg/version/version.go b/client/pkg/version/version.go new file mode 100644 index 00000000..11d6db70 --- /dev/null +++ b/client/pkg/version/version.go @@ -0,0 +1,32 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +// Package version provides version information. +package version + +import ( + "fmt" +) + +var ( + // Upstream omnictl build copies these values from the parent project. + + // Name is set at build time. + Name string + // Tag is set at build time. + Tag string + // SHA should be set to the build hash. + SHA string + + // API is the supported backend API version. + API uint32 + + // SuppressVersionWarning disable logs that warn library users that the pkg is built without version set. + SuppressVersionWarning bool +) + +// String returns the textual representation of the version. +func String() string { + return fmt.Sprintf("%s (API Version: %d)", Tag, API) +} diff --git a/cmd/omni-integration-test/main.go b/cmd/omni-integration-test/main.go new file mode 100644 index 00000000..d5d7d00e --- /dev/null +++ b/cmd/omni-integration-test/main.go @@ -0,0 +1,15 @@ +// Copyright (c) 2024 Sidero Labs, Inc. +// +// Use of this software is governed by the Business Source License +// included in the LICENSE file. + +// Package main provides the entrypoint for the omni-integration-test binary. +package main + +import "os" + +func main() { + if err := rootCmd.Execute(); err != nil { + os.Exit(1) + } +} diff --git a/cmd/omni-integration-test/pkg/clientconfig/clientconfig.go b/cmd/omni-integration-test/pkg/clientconfig/clientconfig.go new file mode 100644 index 00000000..b8bd4a10 --- /dev/null +++ b/cmd/omni-integration-test/pkg/clientconfig/clientconfig.go @@ -0,0 +1,199 @@ +// Copyright (c) 2024 Sidero Labs, Inc. +// +// Use of this software is governed by the Business Source License +// included in the LICENSE file. + +// Package clientconfig holds the configuration for the test client for Omni API. +package clientconfig + +import ( + "context" + "fmt" + "net/http" + "os" + "path/filepath" + "time" + + "github.com/adrg/xdg" + "github.com/hashicorp/go-multierror" + "github.com/siderolabs/gen/containers" + authpb "github.com/siderolabs/go-api-signature/api/auth" + authcli "github.com/siderolabs/go-api-signature/pkg/client/auth" + "github.com/siderolabs/go-api-signature/pkg/client/interceptor" + "github.com/siderolabs/go-api-signature/pkg/message" + "github.com/siderolabs/go-api-signature/pkg/pgp" + "google.golang.org/grpc" + + "github.com/siderolabs/omni/client/pkg/client" +) + +const ( + defaultEmail = "test-user@siderolabs.com" +) + +type clientCacheKey struct { + role string + email string + skipUserRole bool +} + +type clientOrError struct { + client *client.Client + err error +} + +var clientCache = containers.ConcurrentMap[clientCacheKey, clientOrError]{} + +// ClientConfig is a test client. +type ClientConfig struct { + endpoint string +} + +// New creates a new test client config. +func New(endpoint string) *ClientConfig { + return &ClientConfig{ + endpoint: endpoint, + } +} + +// GetClient returns a test client for the default test email. +// +// Clients are cached by their configuration, so if a client with the +// given configuration was created before, the cached one will be returned. +func (t *ClientConfig) GetClient(ctx context.Context, publicKeyOpts ...authcli.RegisterPGPPublicKeyOption) (*client.Client, error) { + return t.GetClientForEmail(ctx, defaultEmail, publicKeyOpts...) +} + +// GetClientForEmail returns a test client for the given email. +// +// Clients are cached by their configuration, so if a client with the +// given configuration was created before, the cached one will be returned. +func (t *ClientConfig) GetClientForEmail(ctx context.Context, email string, publicKeyOpts ...authcli.RegisterPGPPublicKeyOption) (*client.Client, error) { + cacheKey := t.buildCacheKey(email, publicKeyOpts) + + cliOrErr, _ := clientCache.GetOrCall(cacheKey, func() clientOrError { + signatureInterceptor := buildSignatureInterceptor(email, publicKeyOpts...) + + cli, err := client.New(ctx, t.endpoint, + client.WithGrpcOpts( + grpc.WithUnaryInterceptor(signatureInterceptor.Unary()), + grpc.WithStreamInterceptor(signatureInterceptor.Stream()), + ), + ) + + return clientOrError{ + client: cli, + err: err, + } + }) + + return cliOrErr.client, cliOrErr.err +} + +// Close closes all the clients created by this config. +func (t *ClientConfig) Close() error { + var multiErr error + + clientCache.ForEach(func(_ clientCacheKey, cliOrErr clientOrError) { + if cliOrErr.client != nil { + if err := cliOrErr.client.Close(); err != nil { + multiErr = multierror.Append(multiErr, err) + } + } + }) + + return multiErr +} + +func (t *ClientConfig) buildCacheKey(email string, publicKeyOpts []authcli.RegisterPGPPublicKeyOption) clientCacheKey { + var req authpb.RegisterPublicKeyRequest + + for _, o := range publicKeyOpts { + o(&req) + } + + return clientCacheKey{ + role: req.Role, + email: email, + skipUserRole: req.SkipUserRole, + } +} + +// SignHTTPRequest signs the regular HTTP request using the default test email. +func SignHTTPRequest(ctx context.Context, client *client.Client, req *http.Request) error { + return SignHTTPRequestWithEmail(ctx, client, req, defaultEmail) +} + +// SignHTTPRequestWithEmail signs the regular HTTP request using the given email. +func SignHTTPRequestWithEmail(ctx context.Context, client *client.Client, req *http.Request, email string) error { + newKey, err := pgp.GenerateKey("", "", email, 4*time.Hour) + if err != nil { + return err + } + + err = registerKey(ctx, client.Auth(), newKey, email) + if err != nil { + return err + } + + msg, err := message.NewHTTP(req) + if err != nil { + return err + } + + return msg.Sign(email, newKey) +} + +// TalosAPIKeyPrepare prepares a public key to be used with tests interacting via Talos API client using the default test email. +func TalosAPIKeyPrepare(ctx context.Context, client *client.Client, contextName string) error { + return TalosAPIKeyPrepareWithEmail(ctx, client, contextName, defaultEmail) +} + +// TalosAPIKeyPrepareWithEmail prepares a public key to be used with tests interacting via Talos API client using the given email. +func TalosAPIKeyPrepareWithEmail(ctx context.Context, client *client.Client, contextName, email string) error { + newKey, err := pgp.GenerateKey("", "", email, 4*time.Hour) + if err != nil { + return err + } + + err = registerKey(ctx, client.Auth(), newKey, email) + if err != nil { + return err + } + + path, err := xdg.DataFile(filepath.Join("talos", "keys", fmt.Sprintf("%s-%s.pgp", contextName, email))) + if err != nil { + return err + } + + keyArmored, err := newKey.Armor() + if err != nil { + return err + } + + return os.WriteFile(path, []byte(keyArmored), 0o600) +} + +func buildSignatureInterceptor(email string, publicKeyOpts ...authcli.RegisterPGPPublicKeyOption) *interceptor.Interceptor { + userKeyFunc := func(ctx context.Context, cc *grpc.ClientConn, _ *interceptor.Options) (message.Signer, error) { + newKey, err := pgp.GenerateKey("", "", email, 4*time.Hour) + if err != nil { + return nil, err + } + + authCli := authcli.NewClient(cc) + + err = registerKey(ctx, authCli, newKey, email, publicKeyOpts...) + if err != nil { + return nil, err + } + + return newKey, nil + } + + return interceptor.New(interceptor.Options{ + GetUserKeyFunc: userKeyFunc, + RenewUserKeyFunc: userKeyFunc, + Identity: email, + }) +} diff --git a/cmd/omni-integration-test/pkg/clientconfig/register_key_debug.go b/cmd/omni-integration-test/pkg/clientconfig/register_key_debug.go new file mode 100644 index 00000000..d13e66c8 --- /dev/null +++ b/cmd/omni-integration-test/pkg/clientconfig/register_key_debug.go @@ -0,0 +1,43 @@ +// Copyright (c) 2024 Sidero Labs, Inc. +// +// Use of this software is governed by the Business Source License +// included in the LICENSE file. + +//go:build sidero.debug + +package clientconfig + +import ( + "context" + "time" + + "github.com/siderolabs/go-api-signature/pkg/client/auth" + "github.com/siderolabs/go-api-signature/pkg/pgp" + "google.golang.org/grpc/metadata" + + grpcomni "github.com/siderolabs/omni/internal/backend/grpc" +) + +func registerKey(ctx context.Context, cli *auth.Client, key *pgp.Key, email string, opts ...auth.RegisterPGPPublicKeyOption) error { + armoredPublicKey, err := key.ArmorPublic() + if err != nil { + return err + } + + _, err = cli.RegisterPGPPublicKey(ctx, email, []byte(armoredPublicKey), opts...) + if err != nil { + return err + } + + debugCtx := metadata.AppendToOutgoingContext(ctx, grpcomni.DebugVerifiedEmailHeaderKey, email) + + err = cli.ConfirmPublicKey(debugCtx, key.Fingerprint()) + if err != nil { + return err + } + + timeoutCtx, timeoutCtxCancel := context.WithTimeout(ctx, 10*time.Second) + defer timeoutCtxCancel() + + return cli.AwaitPublicKeyConfirmation(timeoutCtx, key.Fingerprint()) +} diff --git a/cmd/omni-integration-test/pkg/clientconfig/register_key_no_debug.go b/cmd/omni-integration-test/pkg/clientconfig/register_key_no_debug.go new file mode 100644 index 00000000..ed73a052 --- /dev/null +++ b/cmd/omni-integration-test/pkg/clientconfig/register_key_no_debug.go @@ -0,0 +1,20 @@ +// Copyright (c) 2024 Sidero Labs, Inc. +// +// Use of this software is governed by the Business Source License +// included in the LICENSE file. + +//go:build !sidero.debug + +package clientconfig + +import ( + "context" + "errors" + + "github.com/siderolabs/go-api-signature/pkg/client/auth" + "github.com/siderolabs/go-api-signature/pkg/pgp" +) + +func registerKey(context.Context, *auth.Client, *pgp.Key, string, ...auth.RegisterPGPPublicKeyOption) error { + return errors.New("registerKey is not implemented in non-debug builds") +} diff --git a/cmd/omni-integration-test/pkg/tests/auth.go b/cmd/omni-integration-test/pkg/tests/auth.go new file mode 100644 index 00000000..b3979701 --- /dev/null +++ b/cmd/omni-integration-test/pkg/tests/auth.go @@ -0,0 +1,1244 @@ +// Copyright (c) 2024 Sidero Labs, Inc. +// +// Use of this software is governed by the Business Source License +// included in the LICENSE file. + +package tests + +import ( + "context" + "errors" + "fmt" + "io" + "runtime" + "slices" + "strings" + "testing" + "time" + + pgpcrypto "github.com/ProtonMail/gopenpgp/v2/crypto" + "github.com/cosi-project/runtime/pkg/controller/generic" + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/rtestutils" + "github.com/cosi-project/runtime/pkg/safe" + "github.com/cosi-project/runtime/pkg/state" + "github.com/google/uuid" + "github.com/siderolabs/gen/maps" + "github.com/siderolabs/gen/xslices" + authcli "github.com/siderolabs/go-api-signature/pkg/client/auth" + "github.com/siderolabs/go-api-signature/pkg/client/interceptor" + "github.com/siderolabs/go-api-signature/pkg/pgp" + "github.com/siderolabs/go-api-signature/pkg/serviceaccount" + "github.com/siderolabs/go-retry/retry" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.uber.org/zap/zapcore" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/types/known/emptypb" + + "github.com/siderolabs/omni/client/api/omni/management" + "github.com/siderolabs/omni/client/api/omni/specs" + pkgaccess "github.com/siderolabs/omni/client/pkg/access" + "github.com/siderolabs/omni/client/pkg/client" + managementcli "github.com/siderolabs/omni/client/pkg/client/management" + "github.com/siderolabs/omni/client/pkg/constants" + "github.com/siderolabs/omni/client/pkg/omni/resources" + authres "github.com/siderolabs/omni/client/pkg/omni/resources/auth" + "github.com/siderolabs/omni/client/pkg/omni/resources/k8s" + "github.com/siderolabs/omni/client/pkg/omni/resources/oidc" + "github.com/siderolabs/omni/client/pkg/omni/resources/omni" + "github.com/siderolabs/omni/client/pkg/omni/resources/registry" + "github.com/siderolabs/omni/client/pkg/omni/resources/siderolink" + "github.com/siderolabs/omni/client/pkg/omni/resources/system" + "github.com/siderolabs/omni/client/pkg/omni/resources/virtual" + "github.com/siderolabs/omni/cmd/omni-integration-test/pkg/clientconfig" + "github.com/siderolabs/omni/internal/backend/runtime/omni/validated" + "github.com/siderolabs/omni/internal/pkg/auth" + "github.com/siderolabs/omni/internal/pkg/auth/role" + "github.com/siderolabs/omni/internal/pkg/grpcutil" +) + +// AssertAnonymousAuthenication tests the authentication without any credentials. +func AssertAnonymousAuthenication(testCtx context.Context, client *client.Client) TestFunc { + return func(t *testing.T) { + ctx, cancel := context.WithTimeout(testCtx, 300*time.Second) + defer cancel() + + ctx = context.WithValue(ctx, interceptor.SkipInterceptorContextKey{}, struct{}{}) + + _, err := client.Omni().State().List(ctx, resource.NewMetadata(resources.DefaultNamespace, omni.ClusterType, "", resource.VersionUndefined)) + assert.Error(t, err) + + assert.Equal(t, codes.Unauthenticated, status.Code(err)) + } +} + +// AssertAPIInvalidSignature tests the authentication with invalid credentials. +func AssertAPIInvalidSignature(testCtx context.Context, client *client.Client) TestFunc { + return func(t *testing.T) { + ctx, cancel := context.WithTimeout(testCtx, 300*time.Second) + defer cancel() + + ctx = context.WithValue(ctx, interceptor.SkipInterceptorContextKey{}, struct{}{}) + + ctx = metadata.AppendToOutgoingContext(ctx, "x-sidero-signature", "invalid") + + _, err := client.Omni().State().List(ctx, resource.NewMetadata(resources.DefaultNamespace, omni.ClusterType, "", resource.VersionUndefined)) + assert.Error(t, err) + + assert.Equal(t, codes.Unauthenticated, status.Code(err)) + } +} + +// AssertPublicKeyWithoutLifetimeNotRegistered tests the registration of a public key without a lifetime. +func AssertPublicKeyWithoutLifetimeNotRegistered(testCtx context.Context, cli *client.Client) TestFunc { + return func(t *testing.T) { + ctx, cancel := context.WithTimeout(testCtx, 10*time.Second) + defer cancel() + + ctx = context.WithValue(ctx, interceptor.SkipInterceptorContextKey{}, struct{}{}) + + email := "test-user-invalid@siderolabs.com" + + key, err := pgpcrypto.GenerateKey("", email, "x25519", 0) + require.NoError(t, err) + + armored, err := key.GetArmoredPublicKey() + require.NoError(t, err) + + _, err = cli.Auth().RegisterPGPPublicKey(ctx, email, []byte(armored)) + assert.ErrorContains(t, err, "key does not contain a valid key lifetime") + } +} + +// AssertPublicKeyWithLongLifetimeNotRegistered tests the registration of a public key +// with a longer than maximum allowed lifetime. +func AssertPublicKeyWithLongLifetimeNotRegistered(testCtx context.Context, cli *client.Client) TestFunc { + return func(t *testing.T) { + ctx, cancel := context.WithTimeout(testCtx, 10*time.Second) + defer cancel() + + ctx = context.WithValue(ctx, interceptor.SkipInterceptorContextKey{}, struct{}{}) + + email := "test-user-invalid@siderolabs.com" + + key, err := pgp.GenerateKey("", "", email, 9*time.Hour) + require.NoError(t, err) + + armored, err := key.ArmorPublic() + require.NoError(t, err) + + _, err = cli.Auth().RegisterPGPPublicKey(ctx, email, []byte(armored)) + assert.ErrorContains(t, err, "key lifetime is too long") + } +} + +// AssertRegisterPublicKeyWithUnknownEmail tests the registration of a public key with an unknown email. +// It should not fail explicitly to avoid leaking information about registered emails. +func AssertRegisterPublicKeyWithUnknownEmail(testCtx context.Context, cli *client.Client) TestFunc { + return func(t *testing.T) { + ctx, cancel := context.WithTimeout(testCtx, 10*time.Second) + defer cancel() + + ctx = context.WithValue(ctx, interceptor.SkipInterceptorContextKey{}, struct{}{}) + + email := "test-user-unknown@siderolabs.com" + + key, err := pgp.GenerateKey("", "", email, 4*time.Hour) + require.NoError(t, err) + + armored, err := key.ArmorPublic() + require.NoError(t, err) + + _, err = cli.Auth().RegisterPGPPublicKey(ctx, email, []byte(armored)) + + // an explicit error must not be returned to avoid leaking information + assert.NoError(t, err) + } +} + +// AssertServiceAccountAPIFlow tests the service account lifecycle and API calls using it. +func AssertServiceAccountAPIFlow(testCtx context.Context, cli *client.Client) TestFunc { + return func(t *testing.T) { + name := fmt.Sprintf("test-%d", time.Now().UnixMilli()) + + saCli, armoredPublicKey, err := newServiceAccountClient(testCtx, cli, name) + require.NoError(t, err) + + defer saCli.Close() //nolint:errcheck + + // create service account with the generated key + _, err = cli.Management().CreateServiceAccount(testCtx, armoredPublicKey, string(role.None), true) + assert.NoError(t, err) + + // make an API call using the registered service account + _, err = saCli.Omni().State().List(testCtx, resource.NewMetadata(resources.DefaultNamespace, omni.ClusterType, "", resource.VersionUndefined)) + assert.NoError(t, err) + + // renew service account + renewedSACli, renewedArmoredPublicKey, err := newServiceAccountClient(testCtx, cli, name) + require.NoError(t, err) + + defer renewedSACli.Close() //nolint:errcheck + + _, err = cli.Management().RenewServiceAccount(testCtx, name, renewedArmoredPublicKey) + assert.NoError(t, err) + + // make an API call using the renewed service account + _, err = renewedSACli.Omni().State().List(testCtx, resource.NewMetadata(resources.DefaultNamespace, omni.ClusterType, "", resource.VersionUndefined)) + assert.NoError(t, err) + + // list service accounts and ensure that the created service account is present + saList, err := cli.Management().ListServiceAccounts(testCtx) + assert.NoError(t, err) + + filtered := xslices.Filter(saList, func(sa *management.ListServiceAccountsResponse_ServiceAccount) bool { + return sa.Name == name + }) + + assert.Len(t, filtered, 1, "service account not found") + + // assert service account properties + foundSA := filtered[0] + + // expect 2 keys: 1 from the creation and 1 from renewal + require.Len(t, foundSA.PgpPublicKeys, 2, "unexpected number of PGP public keys") + + assertTime := func(t *testing.T, expected, actual time.Time, allowedSkew time.Duration) bool { + return assert.True(t, actual.After(expected.Add(-allowedSkew)) && actual.Before(expected.Add(allowedSkew))) + } + + for _, pgpPublicKey := range foundSA.PgpPublicKeys { + assertTime(t, pgpPublicKey.Expiration.AsTime(), time.Now().Add(auth.ServiceAccountMaxAllowedLifetime), 1*time.Minute) + } + + assert.Equal(t, string(role.Admin), foundSA.Role) + + // destroy service account + err = cli.Management().DestroyServiceAccount(testCtx, name) + assert.NoError(t, err) + + // list service accounts and ensure that the deleted service account is no more present + saList, err = cli.Management().ListServiceAccounts(testCtx) + assert.NoError(t, err) + + assert.False(t, slices.ContainsFunc(saList, func(sa *management.ListServiceAccountsResponse_ServiceAccount) bool { + return sa.Name == name + })) + } +} + +func newServiceAccountClient(testCtx context.Context, cli *client.Client, name string) (*client.Client, string, error) { + // generate a new PGP key with long lifetime + comment := fmt.Sprintf("%s/%s", runtime.GOOS, runtime.GOARCH) + + serviceAccountEmail := name + pkgaccess.ServiceAccountNameSuffix + + key, err := pgp.GenerateKey(name, comment, serviceAccountEmail, auth.ServiceAccountMaxAllowedLifetime) + if err != nil { + return nil, "", err + } + + armoredPublicKey, err := key.ArmorPublic() + if err != nil { + return nil, "", err + } + + encodedServiceAccount, err := serviceaccount.Encode(name, key) + if err != nil { + return nil, "", err + } + + interceptors := interceptor.New(interceptor.Options{ + ClientName: "omni-test", + ServiceAccountBase64: encodedServiceAccount, + }) + + // create a new API client with the service account PGP signing interceptors + saCli, err := client.New( + testCtx, + cli.Endpoint(), + client.WithGrpcOpts( + grpc.WithUnaryInterceptor(interceptors.Unary()), + grpc.WithStreamInterceptor(interceptors.Stream()), + ), + ) + if err != nil { + return nil, "", err + } + + return saCli, armoredPublicKey, nil +} + +type apiAuthzTestCase struct { + namePrefix string + fn func(context.Context, *client.Client) error + assertSuccess func(*testing.T, error) + assertFailure func(*testing.T, error) + requiredRole role.Role + isPublic bool +} + +// AssertAPIAuthz tests the authorization checks of the API endpoints. +// +//nolint:gocognit,gocyclo,cyclop,maintidx +func AssertAPIAuthz(rootCtx context.Context, rootCli *client.Client, clientConfig *clientconfig.ClientConfig, clusterName string) TestFunc { + rootCtx = metadata.NewOutgoingContext(rootCtx, metadata.Pairs(grpcutil.LogLevelOverrideMetadataKey, zapcore.PanicLevel.String())) + + assertSuccess := func(t *testing.T, err error) { + expectedConditions := err == nil || + state.IsNotFoundError(err) || + state.IsConflictError(err) || + validated.IsValidationError(err) + + assert.Truef(t, expectedConditions, "unexpected error: %v", err) + } + + assertMissingRoleFailure := func(t *testing.T, err error) { + correctErrorType := status.Code(err) == codes.PermissionDenied || state.IsOwnerConflictError(err) + + assert.Truef(t, correctErrorType, "unexpected error: %v", err) + assert.ErrorContainsf(t, err, "insufficient role", "unexpected error: %v", err) + } + + return func(t *testing.T) { + testCases := []apiAuthzTestCase{ + // Management API tests - global + { + namePrefix: "mgmt-talosconfig", + requiredRole: role.Reader, + assertSuccess: assertSuccess, + assertFailure: assertMissingRoleFailure, + fn: func(ctx context.Context, cli *client.Client) error { + _, err := cli.Management().Talosconfig(ctx) + + return err + }, + }, + { + namePrefix: "mgmt-create-service-account", + requiredRole: role.Admin, + assertSuccess: assertSuccess, + assertFailure: assertMissingRoleFailure, + fn: func(ctx context.Context, cli *client.Client) error { + _, err := cli.Management().CreateServiceAccount(ctx, "doesntmatter", string(role.None), true) + + // ignore the armored pgp key parse error + if err != nil && strings.Contains(err.Error(), "no armored data found") { + return nil + } + + return err + }, + }, + { + namePrefix: "mgmt-renew-service-account", + requiredRole: role.Admin, + assertSuccess: assertSuccess, + assertFailure: assertMissingRoleFailure, + fn: func(ctx context.Context, cli *client.Client) error { + _, err := cli.Management().RenewServiceAccount(ctx, "doesntmatter", "doesntmatter") + + // ignore "identity not found" error + if err != nil && strings.Contains(err.Error(), "doesn't exist") { + return nil + } + + return err + }, + }, + { + namePrefix: "mgmt-list-service-accounts", + requiredRole: role.Admin, + assertSuccess: assertSuccess, + assertFailure: assertMissingRoleFailure, + fn: func(ctx context.Context, cli *client.Client) error { + _, err := cli.Management().ListServiceAccounts(ctx) + + return err + }, + }, + { + namePrefix: "mgmt-destroy-service-account", + requiredRole: role.Admin, + assertSuccess: assertSuccess, + assertFailure: assertMissingRoleFailure, + fn: func(ctx context.Context, cli *client.Client) error { + err := cli.Management().DestroyServiceAccount(ctx, "doesntmatter") + + // ignore "service account not found" error + if status.Code(err) == codes.NotFound { + return nil + } + + return err + }, + }, + { + namePrefix: "mgmt-logs", + requiredRole: role.Reader, + assertSuccess: assertSuccess, + assertFailure: assertMissingRoleFailure, + fn: func(ctx context.Context, cli *client.Client) error { + machineIDs := rtestutils.ResourceIDs[*omni.Machine](rootCtx, t, rootCli.Omni().State()) + + require.NotEmpty(t, machineIDs) + + randomMachineID := machineIDs[0] + + reader, err := cli.Management().LogsReader(ctx, randomMachineID, false, 0) + if err != nil { + return err + } + + buffer := make([]byte, 1) + _, err = reader.Read(buffer) + + if status.Code(err) != codes.NotFound && !errors.Is(err, io.EOF) { + return err + } + + return nil + }, + }, + // Management API tests - cluster-specific + { + namePrefix: "mgmt-cluster-kubeconfig-user", + requiredRole: role.Reader, + assertSuccess: assertSuccess, + assertFailure: assertMissingRoleFailure, + fn: func(ctx context.Context, cli *client.Client) error { + _, err := cli.Management().WithCluster(clusterName).Kubeconfig(ctx) + + return err + }, + }, + { + namePrefix: "mgmt-cluster-kubeconfig-service-account", + requiredRole: role.Operator, + assertSuccess: assertSuccess, + assertFailure: assertMissingRoleFailure, + fn: func(ctx context.Context, cli *client.Client) error { + _, err := cli.Management().WithCluster(clusterName).Kubeconfig( + ctx, + managementcli.WithServiceAccount(24*time.Hour, "authz-integration-test", constants.DefaultAccessGroup), + ) + + return err + }, + }, + { + namePrefix: "mgmt-cluster-talosconfig", + requiredRole: role.Reader, + assertSuccess: assertSuccess, + assertFailure: assertMissingRoleFailure, + fn: func(ctx context.Context, cli *client.Client) error { + _, err := cli.Management().WithCluster(clusterName).Talosconfig(ctx) + + return err + }, + }, + { + namePrefix: "talos-version", + requiredRole: role.Reader, + assertSuccess: assertSuccess, + assertFailure: assertMissingRoleFailure, + fn: func(ctx context.Context, cli *client.Client) error { + _, err := cli.Talos().WithCluster(clusterName).Version(ctx, &emptypb.Empty{}) + + return err + }, + }, + { + namePrefix: "talos-etcd-status", + requiredRole: role.Operator, + assertSuccess: assertSuccess, + assertFailure: func(t *testing.T, err error) { + assert.Truef(t, status.Code(err) == codes.PermissionDenied, "unexpected error: %v", err) + }, + fn: func(ctx context.Context, cli *client.Client) error { + _, err := cli.Talos().WithCluster(clusterName).EtcdStatus(ctx, &emptypb.Empty{}) + + return err + }, + }, + // OIDC API tests + { + namePrefix: "oidc-authenticate", + requiredRole: role.None, + assertSuccess: assertSuccess, + fn: func(ctx context.Context, cli *client.Client) error { + _, err := cli.OIDC().Authenticate(ctx, "test-token") + + // silence the error on 'token not found' + if errStatus, ok := status.FromError(err); ok { + if errStatus.Code() == codes.PermissionDenied && errStatus.Message() == "failed to authenticate request: request not found" { + return nil + } + } + + return err + }, + }, + } + + for _, tc := range testCases { + // test each test case without signature + t.Run(fmt.Sprintf("%s-no-signature", tc.namePrefix), func(t *testing.T) { + scopedClient, testErr := clientConfig.GetClient(rootCtx) + require.NoError(t, testErr) + + // skip signing the request + ctx := context.WithValue(rootCtx, interceptor.SkipInterceptorContextKey{}, struct{}{}) + + testErr = tc.fn(ctx, scopedClient) + + // public resources will either succeed or fail with a permission denied if they are read-only resources + if tc.isPublic { + expectedCondition := testErr == nil || strings.Contains(testErr.Error(), "only read access is permitted") + + assert.Truef(t, expectedCondition, "error did not meet condition: %v", testErr) + + return + } + + // protected resources must always fail with unauthenticated + + expectedCondition := testErr != nil && strings.Contains(testErr.Error(), "Unauthenticated") + + assert.Truef(t, expectedCondition, "error did not meet condition: %v", testErr) + }) + + // public resources are not subject to role restrictions + if tc.isPublic { + continue + } + + // test with the role which should succeed + t.Run(fmt.Sprintf("%s-success", tc.namePrefix), func(t *testing.T) { + scopedClient, testErr := clientConfig.GetClient( + rootCtx, + authcli.WithRole(string(tc.requiredRole)), + authcli.WithSkipUserRole(true), + ) + require.NoError(t, testErr) + + assertCurrentUserRole(rootCtx, t, scopedClient.Omni().State(), tc.requiredRole) + + testErr = tc.fn(rootCtx, scopedClient) + + tc.assertSuccess(t, testErr) + }) + + if tc.assertFailure == nil || tc.requiredRole == role.None { + continue + } + + // test with the role which should fail + + var err error + + // one less than the required role + failureRole, err := tc.requiredRole.Previous() + require.NoError(t, err) + + t.Run(fmt.Sprintf("%s-failure", tc.namePrefix), func(t *testing.T) { + scopedClient, testErr := clientConfig.GetClient( + rootCtx, + authcli.WithRole(string(failureRole)), + authcli.WithSkipUserRole(true)) + require.NoError(t, testErr) + + assertCurrentUserRole(rootCtx, t, scopedClient.Omni().State(), failureRole) + + testErr = tc.fn(rootCtx, scopedClient) + + tc.assertFailure(t, testErr) + }) + } + } +} + +type resourceAuthzTestCase struct { + resource resource.Resource + allowedVerbSet map[state.Verb]struct{} + isAdminOnly bool + isSignatureSufficient bool + isPublic bool +} + +// AssertResourceAuthz tests the authorization checks of the resources (state). +// +//nolint:gocognit,gocyclo,cyclop,maintidx +func AssertResourceAuthz(rootCtx context.Context, rootCli *client.Client, clientConfig *clientconfig.ClientConfig) TestFunc { + return func(t *testing.T) { + rootCtx = metadata.NewOutgoingContext(rootCtx, metadata.Pairs(grpcutil.LogLevelOverrideMetadataKey, zapcore.PanicLevel.String())) + + allRoles := []role.Role{role.None, role.Reader, role.Operator, role.Admin} + allVerbs := []state.Verb{state.Get, state.List, state.Create, state.Update, state.Destroy} + + allVerbsSet := xslices.ToSet(allVerbs) + readOnlyVerbSet := xslices.ToSet([]state.Verb{state.Get, state.List}) + + // fully client-managed resources + + identity := authres.NewIdentity(resources.DefaultNamespace, uuid.New().String()) + accessPolicy := authres.NewAccessPolicy() + samlLabelRule := authres.NewSAMLLabelRule(resources.DefaultNamespace, uuid.New().String()) + cluster := omni.NewCluster(resources.DefaultNamespace, uuid.New().String()) + cluster.TypedSpec().Value.TalosVersion = "1.2.2" + configPatch := omni.NewConfigPatch(resources.DefaultNamespace, uuid.New().String()) + machineLabels := omni.NewMachineLabels(resources.DefaultNamespace, uuid.New().String()) + machineSet := omni.NewMachineSet(resources.DefaultNamespace, uuid.New().String()) + machineSet.Metadata().Labels().Set(omni.LabelCluster, cluster.Metadata().ID()) + machineSetNode := omni.NewMachineSetNode(resources.DefaultNamespace, uuid.New().String(), machineSet) + machineClass := omni.NewMachineClass(resources.DefaultNamespace, uuid.New().String()) + schematicConfiguration := omni.NewSchematicConfiguration(resources.DefaultNamespace, uuid.New().String()) + schematicConfiguration.TypedSpec().Value.Target = specs.SchematicConfigurationSpec_ClusterMachine + + testCases := []resourceAuthzTestCase{ + { + resource: identity, + allowedVerbSet: allVerbsSet, + isAdminOnly: true, + }, + { + resource: authres.NewUser(resources.DefaultNamespace, uuid.New().String()), + allowedVerbSet: allVerbsSet, + isAdminOnly: true, + }, + { + resource: accessPolicy, + allowedVerbSet: allVerbsSet, + isAdminOnly: true, + }, + { + resource: samlLabelRule, + allowedVerbSet: allVerbsSet, + isAdminOnly: true, + }, + { + resource: cluster, + allowedVerbSet: allVerbsSet, + }, + { + resource: configPatch, + allowedVerbSet: allVerbsSet, + }, + { + resource: machineLabels, + allowedVerbSet: allVerbsSet, + }, + { + resource: machineSet, + allowedVerbSet: allVerbsSet, + }, + { + resource: machineSetNode, + allowedVerbSet: allVerbsSet, + }, + { + resource: machineClass, + allowedVerbSet: allVerbsSet, + }, + { + resource: omni.NewEtcdManualBackup(uuid.New().String()), + allowedVerbSet: allVerbsSet, + }, + { + resource: omni.NewEtcdBackupS3Conf(), + allowedVerbSet: allVerbsSet, + isAdminOnly: true, + }, + { + resource: schematicConfiguration, + allowedVerbSet: allVerbsSet, + }, + } + + // read-only resources + + resourceDefinition, err := meta.NewResourceDefinition(meta.ResourceDefinitionSpec{ + Type: "Tests.cosi.dev", + }) + require.NoError(t, err) + + testCases = append(testCases, []resourceAuthzTestCase{ + { + resource: resourceDefinition, + allowedVerbSet: readOnlyVerbSet, + isSignatureSufficient: true, + }, + { + resource: meta.NewNamespace("test", meta.NamespaceSpec{}), + allowedVerbSet: readOnlyVerbSet, + isSignatureSufficient: true, + }, + { + resource: omni.NewClusterBootstrapStatus(resources.DefaultNamespace, uuid.New().String()), + allowedVerbSet: readOnlyVerbSet, + }, + { + resource: omni.NewClusterDestroyStatus(resources.DefaultNamespace, uuid.New().String()), + allowedVerbSet: readOnlyVerbSet, + }, + { + resource: omni.NewClusterEndpoint(resources.DefaultNamespace, uuid.New().String()), + allowedVerbSet: readOnlyVerbSet, + }, + { + resource: omni.NewClusterMachineIdentity(resources.DefaultNamespace, uuid.New().String()), + allowedVerbSet: readOnlyVerbSet, + }, + { + resource: omni.NewClusterMachineStatus(resources.DefaultNamespace, uuid.New().String()), + allowedVerbSet: readOnlyVerbSet, + }, + { + resource: omni.NewClusterMachineConfigPatches(resources.DefaultNamespace, uuid.New().String()), + allowedVerbSet: readOnlyVerbSet, + }, + { + resource: omni.NewClusterMachineTalosVersion(resources.DefaultNamespace, uuid.New().String()), + allowedVerbSet: readOnlyVerbSet, + }, + { + resource: omni.NewClusterMachine(resources.DefaultNamespace, uuid.New().String()), + allowedVerbSet: readOnlyVerbSet, + }, + { + resource: omni.NewClusterMachineTemplate(resources.DefaultNamespace, uuid.New().String()), + allowedVerbSet: readOnlyVerbSet, + }, + { + resource: omni.NewClusterStatus(resources.DefaultNamespace, uuid.New().String()), + allowedVerbSet: readOnlyVerbSet, + }, + { + resource: omni.NewClusterUUID(uuid.New().String()), + allowedVerbSet: readOnlyVerbSet, + }, + { + resource: omni.NewEtcdBackup(uuid.New().String(), time.Now()), + allowedVerbSet: readOnlyVerbSet, + }, + { + resource: omni.NewControlPlaneStatus(resources.DefaultNamespace, uuid.New().String()), + allowedVerbSet: readOnlyVerbSet, + }, + { + resource: omni.NewExposedService(resources.DefaultNamespace, uuid.New().String()), + allowedVerbSet: readOnlyVerbSet, + }, + { + resource: omni.NewFeaturesConfig(resources.DefaultNamespace, uuid.New().String()), + allowedVerbSet: readOnlyVerbSet, + isSignatureSufficient: true, + }, + { + resource: omni.NewKubernetesStatus(resources.DefaultNamespace, uuid.New().String()), + allowedVerbSet: readOnlyVerbSet, + }, + { + resource: virtual.NewKubernetesUsage(resources.MetricsNamespace, uuid.New().String()), + allowedVerbSet: readOnlyVerbSet, + }, + { + resource: omni.NewKubernetesUpgradeManifestStatus(resources.DefaultNamespace, uuid.New().String()), + allowedVerbSet: readOnlyVerbSet, + }, + { + resource: omni.NewKubernetesUpgradeStatus(resources.DefaultNamespace, uuid.New().String()), + allowedVerbSet: readOnlyVerbSet, + }, + { + resource: omni.NewLoadBalancerConfig(resources.DefaultNamespace, uuid.New().String()), + allowedVerbSet: readOnlyVerbSet, + }, + { + resource: omni.NewLoadBalancerStatus(resources.DefaultNamespace, uuid.New().String()), + allowedVerbSet: readOnlyVerbSet, + }, + { + resource: omni.NewMachine(resources.DefaultNamespace, uuid.New().String()), + allowedVerbSet: readOnlyVerbSet, + }, + { + resource: omni.NewMachineSetStatus(resources.DefaultNamespace, uuid.New().String()), + allowedVerbSet: readOnlyVerbSet, + }, + { + resource: omni.NewMachineStatus(resources.DefaultNamespace, uuid.New().String()), + allowedVerbSet: readOnlyVerbSet, + }, + { + resource: omni.NewMachineStatusLink(resources.MetricsNamespace, uuid.New().String()), + allowedVerbSet: readOnlyVerbSet, + }, + { + resource: omni.NewMachineStatusSnapshot(resources.DefaultNamespace, uuid.New().String()), + allowedVerbSet: readOnlyVerbSet, + }, + { + resource: omni.NewMachineConfigGenOptions(resources.DefaultNamespace, uuid.New().String()), + allowedVerbSet: readOnlyVerbSet, + }, + { + resource: omni.NewOngoingTask(resources.DefaultNamespace, "res"), + allowedVerbSet: readOnlyVerbSet, + isSignatureSufficient: true, + }, + { + resource: omni.NewKubernetesVersion(resources.DefaultNamespace, uuid.New().String()), + allowedVerbSet: readOnlyVerbSet, + isSignatureSufficient: true, + }, + { + resource: omni.NewTalosVersion(resources.DefaultNamespace, uuid.New().String()), + allowedVerbSet: readOnlyVerbSet, + isSignatureSufficient: true, + }, + { + resource: omni.NewTalosUpgradeStatus(resources.DefaultNamespace, uuid.New().String()), + allowedVerbSet: readOnlyVerbSet, + }, + { + resource: omni.NewInstallationMedia(resources.DefaultNamespace, uuid.New().String()), + allowedVerbSet: readOnlyVerbSet, + isSignatureSufficient: true, + }, + { + resource: omni.NewRedactedClusterMachineConfig(resources.DefaultNamespace, uuid.New().String()), + allowedVerbSet: readOnlyVerbSet, + }, + { + resource: omni.NewImagePullRequest(resources.DefaultNamespace, uuid.New().String()), + allowedVerbSet: readOnlyVerbSet, + }, + { + resource: omni.NewImagePullStatus(resources.DefaultNamespace, uuid.New().String()), + allowedVerbSet: readOnlyVerbSet, + }, + { + resource: authres.NewAuthConfig(), + allowedVerbSet: readOnlyVerbSet, + isPublic: true, + }, + { + resource: siderolink.NewConnectionParams(resources.DefaultNamespace, uuid.New().String()), + allowedVerbSet: readOnlyVerbSet, + }, + { + resource: system.NewSysVersion(resources.DefaultNamespace, uuid.New().String()), + allowedVerbSet: readOnlyVerbSet, + isSignatureSufficient: true, + }, + { + resource: virtual.NewCurrentUser(), + allowedVerbSet: readOnlyVerbSet, + isSignatureSufficient: true, + }, + { + resource: virtual.NewClusterPermissions(uuid.New().String()), + allowedVerbSet: readOnlyVerbSet, + isSignatureSufficient: true, + }, + { + resource: virtual.NewPermissions(), + allowedVerbSet: readOnlyVerbSet, + isSignatureSufficient: true, + }, + { + resource: omni.NewEtcdBackupStatus(uuid.New().String()), + allowedVerbSet: readOnlyVerbSet, + }, + { + resource: omni.NewEtcdBackupOverallStatus(), + allowedVerbSet: readOnlyVerbSet, + }, + { + resource: omni.NewMachineSetDestroyStatus(resources.EphemeralNamespace, uuid.New().String()), + allowedVerbSet: readOnlyVerbSet, + }, + { + resource: omni.NewEtcdBackupStoreStatus(), + allowedVerbSet: readOnlyVerbSet, + }, + { + resource: omni.NewSchematic(resources.DefaultNamespace, uuid.New().String()), + allowedVerbSet: readOnlyVerbSet, + }, + { + resource: omni.NewTalosExtensions(resources.DefaultNamespace, uuid.New().String()), + allowedVerbSet: readOnlyVerbSet, + isSignatureSufficient: true, + }, + }...) + + // no access resources + testCases = append(testCases, []resourceAuthzTestCase{ + { + resource: omni.NewClusterConfigVersion(resources.DefaultNamespace, uuid.New().String()), + }, + { + resource: oidc.NewJWTPublicKey(resources.DefaultNamespace, uuid.New().String()), + }, + { + resource: system.NewDBVersion(resources.DefaultNamespace, uuid.New().String()), + }, + { + resource: system.NewCertRefreshTick(resources.DefaultNamespace, uuid.New().String()), + }, + { + resource: authres.NewPublicKey(resources.DefaultNamespace, uuid.New().String()), + }, + { + resource: omni.NewClusterMachineConfigStatus(resources.DefaultNamespace, uuid.New().String()), + }, + { + resource: omni.NewEtcdAuditResult(resources.DefaultNamespace, uuid.New().String()), + }, + { + resource: omni.NewKubeconfig(resources.DefaultNamespace, uuid.New().String()), + }, + { + resource: omni.NewTalosConfig(resources.DefaultNamespace, uuid.New().String()), + }, + { + resource: siderolink.NewConfig(resources.DefaultNamespace), + }, + { + resource: omni.NewClusterMachineConfig(resources.DefaultNamespace, uuid.New().String()), + }, + { + resource: omni.NewClusterSecrets(resources.DefaultNamespace, uuid.New().String()), + }, + { + resource: authres.NewSAMLAssertion(resources.DefaultNamespace, uuid.New().String()), + }, + { + resource: omni.NewClusterMachineEncryptionKey(resources.DefaultNamespace, uuid.New().String()), + }, + { + resource: omni.NewEtcdBackupEncryption(resources.DefaultNamespace, uuid.New().String()), + }, + { + resource: omni.NewBackupData(uuid.New().String()), + }, + }...) + + // custom resources + + testCases = append(testCases, []resourceAuthzTestCase{ + { + resource: siderolink.NewLink(resources.DefaultNamespace, uuid.New().String(), &specs.SiderolinkSpec{}), + allowedVerbSet: xslices.ToSet([]state.Verb{state.Get, state.List, state.Update, state.Destroy}), + }, + }...) + + untestedResourceTypes := xslices.ToSetFunc(registry.Resources, func(rd generic.ResourceWithRD) resource.Type { + return rd.ResourceDefinition().Type + }) + + // delete excluded resources from the untested set + delete(untestedResourceTypes, k8s.KubernetesResourceType) + delete(untestedResourceTypes, siderolink.DeprecatedLinkCounterType) + + for _, tc := range testCases { + for _, testVerb := range allVerbs { + for _, testRole := range allRoles { + name := fmt.Sprintf("resource-authz-%s-%s-%s", testRole, tc.resource.Metadata().Type(), verbToString(testVerb)) + + // delete the resource type from the untested set + delete(untestedResourceTypes, tc.resource.Metadata().Type()) + + t.Run(name, func(t *testing.T) { + scopedCli, testErr := clientConfig.GetClient( + rootCtx, + authcli.WithRole(string(testRole)), + authcli.WithSkipUserRole(true), + ) + require.NoError(t, testErr) + + // ensure that scopedCli is operating with the correct role + assertCurrentUserRole(rootCtx, t, scopedCli.Omni().State(), testRole) + + noSignatureCtx := context.WithValue(rootCtx, interceptor.SkipInterceptorContextKey{}, struct{}{}) + + accessErr := accessResource(noSignatureCtx, t, rootCli, scopedCli, tc.resource, testVerb) + + if len(tc.allowedVerbSet) == 0 { + assert.ErrorContains(t, accessErr, "no access is permitted") + + return + } + + if !tc.isPublic { + assert.ErrorContains(t, accessErr, "missing valid signature") + + // refresh the error but with a signature this time + accessErr = accessResource(rootCtx, t, rootCli, scopedCli, tc.resource, testVerb) + } + + isVerbError := accessErr != nil && strings.Contains(accessErr.Error(), "only") && strings.Contains(accessErr.Error(), "access is permitted") + isRoleError := accessErr != nil && strings.Contains(accessErr.Error(), "insufficient role:") + + // assert the error + + isReader := testRole.Check(role.Reader) == nil + isOperator := testRole.Check(role.Operator) == nil + isAdmin := testRole.Check(role.Admin) == nil + _, verbAllowed := tc.allowedVerbSet[testVerb] + sufficientRole := true + + if tc.isAdminOnly { + if !isAdmin { + sufficientRole = false + } + } else { + if testVerb.Readonly() { + if !isReader { + sufficientRole = false + } + } else { + if !isOperator { + sufficientRole = false + } + } + } + + if tc.isSignatureSufficient || tc.isPublic { + sufficientRole = true + } + + switch { + case !verbAllowed && !sufficientRole: + // we check for either of these errors because their order is not guaranteed + assert.Truef(t, isVerbError || isRoleError, "expected verb not allowed or insufficient role error, got: %v", accessErr) + case !verbAllowed: + assert.Truef(t, isVerbError, "expected verb not allowed error, got: %v", accessErr) + case !sufficientRole: + assert.Truef(t, isRoleError, "expected insufficient role error, got: %v", accessErr) + default: + if accessErr != nil { + toleratedErrors := map[string]string{ + "NotFoundError": "doesn't exist", + "ValidationError": "failed to validate", + "UnsupportedError": "unsupported resource type", + "AlreadyExists(AccessPolicy)": "resource AccessPolicies.omni.sidero.dev(default/access-policy@undefined) already exists", + "VersionConflict(AccessPolicy)": "failed to update: resource AccessPolicies.omni.sidero.dev(default/access-policy@1) update conflict: expected version", + } + + isExpectedError := false + + for _, toleratedErrorSubstring := range toleratedErrors { + if strings.Contains(accessErr.Error(), toleratedErrorSubstring) { + isExpectedError = true + + break + } + } + + assert.Truef(t, isExpectedError, "expected one of: %q, got: %v", maps.Keys(toleratedErrors), accessErr) + } + } + }) + } + } + } + + // ensure that all resources are tested + for untestedResourceType := range untestedResourceTypes { + assert.Failf(t, "resource-authz", "resource type %s is not tested", untestedResourceType) + } + } +} + +// AssertResourceAuthzWithACL tests the authorization checks of with ACLs. +func AssertResourceAuthzWithACL(ctx context.Context, rootCli *client.Client, clientConfig *clientconfig.ClientConfig) TestFunc { + return func(t *testing.T) { + ctx = metadata.NewOutgoingContext(ctx, metadata.Pairs(grpcutil.LogLevelOverrideMetadataKey, zapcore.PanicLevel.String())) + + rootState := rootCli.Omni().State() + + testID := "acl-test-" + uuid.NewString() + + user := authres.NewUser(resources.DefaultNamespace, testID) + + user.TypedSpec().Value.Role = string(role.Reader) + + require.NoError(t, rootState.Create(ctx, user)) + + t.Cleanup(func() { destroy(ctx, t, rootCli, user.Metadata()) }) + + identity := authres.NewIdentity(resources.DefaultNamespace, fmt.Sprintf("user-%s@siderolabs.com", testID)) + + identity.TypedSpec().Value.UserId = user.Metadata().ID() + + require.NoError(t, rootState.Create(ctx, identity)) + + t.Cleanup(func() { destroy(ctx, t, rootCli, identity.Metadata()) }) + + accessPolicy := authres.NewAccessPolicy() + + err := rootState.Destroy(ctx, accessPolicy.Metadata()) + require.Truef(t, err == nil || state.IsNotFoundError(err), "unexpected error: %v", err) + + clusterAuthorizedID := "authorized-" + testID + + accessPolicy.TypedSpec().Value.Rules = []*specs.AccessPolicyRule{ + { + Users: []string{identity.Metadata().ID()}, + Clusters: []string{clusterAuthorizedID}, + Role: string(role.Operator), + }, + } + + err = rootState.Create(ctx, accessPolicy) + require.NoError(t, err) + + t.Cleanup(func() { destroy(ctx, t, rootCli, accessPolicy.Metadata()) }) + + userCli, err := clientConfig.GetClientForEmail(ctx, identity.Metadata().ID()) + require.NoError(t, err) + + t.Cleanup(func() { userCli.Close() }) //nolint:errcheck + + clusterUnauthorized := omni.NewCluster(resources.DefaultNamespace, "unauthorized-"+testID) + clusterUnauthorized.TypedSpec().Value.TalosVersion = constants.DefaultTalosVersion + clusterUnauthorized.TypedSpec().Value.KubernetesVersion = "1.27.3" + + userState := userCli.Omni().State() + + // try to create an unauthorized cluster using the user client + err = userState.Create(ctx, clusterUnauthorized) + assert.ErrorContains(t, err, "insufficient role") + + // create it using the admin client + require.NoError(t, rootState.Create(ctx, clusterUnauthorized)) + + t.Cleanup(func() { destroy(ctx, t, rootCli, clusterUnauthorized.Metadata()) }) + + // create a cluster that is authorized to the user by the ACL + clusterAuthorized := omni.NewCluster(resources.DefaultNamespace, clusterAuthorizedID) + clusterAuthorized.TypedSpec().Value.TalosVersion = constants.DefaultTalosVersion + clusterAuthorized.TypedSpec().Value.KubernetesVersion = "1.27.3" + + err = userState.Create(ctx, clusterAuthorized) + assert.NoError(t, err) + + t.Cleanup(func() { destroy(ctx, t, rootCli, clusterAuthorized.Metadata()) }) + + // try to get the unauthorized cluster using the user client - should work, as the user has the Reader role + _, err = userState.Get(ctx, clusterUnauthorized.Metadata()) + assert.NoError(t, err) + + // try to modify the unauthorized cluster using the user client + clusterUnauthorized.TypedSpec().Value.TalosVersion = "1.4.5" + + err = userState.Update(ctx, clusterUnauthorized) + assert.ErrorContains(t, err, "insufficient role") + + // try to get the authorized cluster using the user client + _, err = userState.Get(ctx, clusterAuthorized.Metadata()) + assert.NoError(t, err) + + // test the logic for a config patch without any cluster association + configPatchUnauthorized := omni.NewConfigPatch(resources.DefaultNamespace, "unauthorized-"+testID) + + err = userState.Create(ctx, configPatchUnauthorized) + assert.ErrorContains(t, err, "insufficient role") + + // test the logic for a config patch with an authorized cluster association + configPatchAuthorized := omni.NewConfigPatch(resources.DefaultNamespace, "authorized"+testID) + configPatchAuthorized.Metadata().Labels().Set(omni.LabelCluster, clusterAuthorized.Metadata().ID()) + + configPatchAuthorized.TypedSpec().Value.Data = "debug: true" + + err = userState.Create(ctx, configPatchAuthorized) + assert.NoError(t, err) + + t.Cleanup(func() { destroy(ctx, t, rootCli, configPatchAuthorized.Metadata()) }) + } +} + +func accessResource(ctx context.Context, t *testing.T, rootCli *client.Client, cli *client.Client, res resource.Resource, verb state.Verb) error { + var err error + + md := res.Metadata() + + switch verb { //nolint:exhaustive + case state.List: + _, err = cli.Omni().State().List(ctx, md) + case state.Get: + _, err = cli.Omni().State().Get(ctx, md) + case state.Destroy: + err = cli.Omni().State().Destroy(ctx, md) + case state.Create: + err = cli.Omni().State().Create(ctx, res) + if err == nil { + defer destroy(ctx, t, rootCli, md) + } + case state.Update: + err = cli.Omni().State().Update(ctx, res) + default: + assert.Fail(t, "unsupported test verb: %s", verbToString(verb)) + } + + return err +} + +func assertCurrentUserRole(ctx context.Context, t *testing.T, st state.State, expected role.Role) { + currentUser, currentUserErr := safe.StateGet[*virtual.CurrentUser](ctx, st, virtual.NewCurrentUser().Metadata()) + require.NoError(t, currentUserErr) + + assert.Equal(t, string(expected), currentUser.TypedSpec().Value.GetRole(), "invalid role on current user virtual resource: %v", currentUser.TypedSpec().Value.GetRole()) +} + +func destroy(ctx context.Context, t *testing.T, rootClient *client.Client, md *resource.Metadata) { + t.Logf("destroying created resource %s", md.String()) + + _, err := rootClient.Omni().State().Teardown(ctx, md) + if state.IsNotFoundError(err) { + return + } + + require.NoError(t, err) + + err = retry.Constant(5*time.Second, retry.WithUnits(100*time.Millisecond)).RetryWithContext(ctx, func(ctx context.Context) error { + err = rootClient.Omni().State().Destroy(ctx, md) + if err != nil { + if state.IsNotFoundError(err) { + return nil + } + + return retry.ExpectedError(err) + } + + return nil + }) + require.NoError(t, err) +} + +func verbToString(verb state.Verb) string { + switch verb { + case state.List: + return "list" + case state.Get: + return "get" + case state.Create: + return "create" + case state.Update: + return "update" + case state.Destroy: + return "destroy" + case state.Watch: + return "watch" + default: + return "unknown" + } +} diff --git a/cmd/omni-integration-test/pkg/tests/backup.go b/cmd/omni-integration-test/pkg/tests/backup.go new file mode 100644 index 00000000..9c27b44d --- /dev/null +++ b/cmd/omni-integration-test/pkg/tests/backup.go @@ -0,0 +1,269 @@ +// Copyright (c) 2024 Sidero Labs, Inc. +// +// Use of this software is governed by the Business Source License +// included in the LICENSE file. + +package tests + +import ( + "context" + "testing" + "time" + + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/rtestutils" + "github.com/cosi-project/runtime/pkg/safe" + "github.com/cosi-project/runtime/pkg/state" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "google.golang.org/protobuf/types/known/timestamppb" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources" + "github.com/siderolabs/omni/client/pkg/omni/resources/omni" +) + +// AssertEtcdManualBackupIsCreated creates a manual etcd backup and asserts the status. +func AssertEtcdManualBackupIsCreated(testCtx context.Context, st state.State, clusterName string) func(t *testing.T) { + return func(t *testing.T) { + ctx, cancel := context.WithTimeout(testCtx, 120*time.Second) + defer cancel() + + // drop the previous EtcdManualBackup resource if it exists + rtestutils.Destroy[*omni.EtcdManualBackup](ctx, t, st, []string{clusterName}) + + // Take existing backups into account when asserting the length after creating a new backup. + existingBackups, err := safe.StateListAll[*omni.EtcdBackup](ctx, st, state.WithLabelQuery(resource.LabelEqual(omni.LabelCluster, clusterName))) + require.NoError(t, err) + + backup := omni.NewEtcdManualBackup(clusterName) + backup.TypedSpec().Value.BackupAt = timestamppb.New(time.Now()) + + start := time.Now() + + require.NoError(t, st.Create(ctx, backup)) + + assertLength[*omni.EtcdBackup]( + ctx, + t, + st, + existingBackups.Len()+1, + state.WatchWithLabelQuery(resource.LabelEqual(omni.LabelCluster, clusterName)), + ) + + var backupTime time.Time + + rtestutils.AssertResources( + ctx, + t, + st, + []resource.ID{clusterName}, + func(es *omni.EtcdBackupStatus, assertion *assert.Assertions) { + l := es.TypedSpec().Value.GetLastBackupTime().AsTime() + + assertion.Equal(clusterName, es.Metadata().ID()) + assertion.Equal(specs.EtcdBackupStatusSpec_Ok, es.TypedSpec().Value.Status) + assertion.Zero(es.TypedSpec().Value.Error) + assertion.Truef(l.After(start), "last backup time %q is not after start time %q", l, start) + assertion.WithinDuration(time.Now(), l, 300*time.Second) + + backupTime = l + }, + ) + + rtestutils.AssertResources( + ctx, + t, + st, + []resource.ID{omni.EtcdBackupOverallStatusID}, + func(res *omni.EtcdBackupOverallStatus, assertion *assert.Assertions) { + assertion.Zero(res.TypedSpec().Value.GetConfigurationError()) + assertion.Zero(res.TypedSpec().Value.GetLastBackupStatus().GetError()) + assertion.EqualValues(1, res.TypedSpec().Value.GetLastBackupStatus().GetStatus()) + assertion.Equal(backupTime, res.TypedSpec().Value.GetLastBackupStatus().GetLastBackupAttempt().AsTime()) + assertion.Equal(backupTime, res.TypedSpec().Value.GetLastBackupStatus().GetLastBackupTime().AsTime()) + }, + ) + } +} + +// AssertEtcdAutomaticBackupIsCreated asserts that automatic etcd backups are created. +func AssertEtcdAutomaticBackupIsCreated(testCtx context.Context, st state.State, clusterName string) func(t *testing.T) { + return func(t *testing.T) { + ctx, cancel := context.WithTimeout(testCtx, 120*time.Second) + defer cancel() + + // drop the previous EtcdBackupS3Conf resource if it exists + rtestutils.Destroy[*omni.EtcdBackupS3Conf](ctx, t, st, []string{omni.EtcdBackupS3ConfID}) + + conf := createS3Conf() + start := time.Now() + + require.NoError(t, st.Create(ctx, conf)) + + t.Logf("waiting for backup for cluster %q to be created", clusterName) + + assertLength[*omni.EtcdBackup]( + ctx, + t, + st, + 1, + state.WatchWithLabelQuery(resource.LabelEqual(omni.LabelCluster, clusterName)), + ) + + var backupTime time.Time + + rtestutils.AssertResources( + testCtx, + t, + st, + []resource.ID{clusterName}, + func(es *omni.EtcdBackupStatus, assertion *assert.Assertions) { + l := es.TypedSpec().Value.GetLastBackupTime().AsTime() + + assertion.Equal(specs.EtcdBackupStatusSpec_Ok, es.TypedSpec().Value.Status) + assertion.Zero(es.TypedSpec().Value.Error) + assertion.Truef(l.After(start), "last backup time %q is not after start time %q", l, start) + assertion.WithinDuration(time.Now(), l, 120*time.Second) + + backupTime = l + }, + ) + + rtestutils.AssertResources( + ctx, + t, + st, + []resource.ID{omni.EtcdBackupOverallStatusID}, + func(res *omni.EtcdBackupOverallStatus, assertion *assert.Assertions) { + assertion.Zero(res.TypedSpec().Value.GetConfigurationError()) + assertion.Zero(res.TypedSpec().Value.GetLastBackupStatus().GetError()) + assertion.EqualValues(1, res.TypedSpec().Value.GetLastBackupStatus().GetStatus()) + assertion.Equal(backupTime, res.TypedSpec().Value.GetLastBackupStatus().GetLastBackupAttempt().AsTime()) + assertion.Equal(backupTime, res.TypedSpec().Value.GetLastBackupStatus().GetLastBackupTime().AsTime()) + }, + ) + } +} + +// AssertControlPlaneCanBeRestoredFromBackup asserts that the control plane +// is recreated with the bootstrap spec pointing to the most recent etcd backup. +// It does not add any machines to the newly created control plane. +func AssertControlPlaneCanBeRestoredFromBackup(testCtx context.Context, st state.State, clusterName string) func(t *testing.T) { + return func(t *testing.T) { + ctx, cancel := context.WithTimeout(testCtx, 120*time.Second) + defer cancel() + + clusterUUID, err := safe.StateGetByID[*omni.ClusterUUID](ctx, st, clusterName) + require.NoError(t, err) + + backupList, err := safe.StateListAll[*omni.EtcdBackup](ctx, st, state.WithLabelQuery(resource.LabelEqual(omni.LabelCluster, clusterName))) + require.NoError(t, err) + + require.NotEmpty(t, backupList.Len()) + + snapshotName := backupList.Get(0).TypedSpec().Value.GetSnapshot() // the first backup is the most recent one + cpMachineSet := omni.NewMachineSet(resources.DefaultNamespace, omni.ControlPlanesResourceID(clusterName)) + + cpMachineSet.Metadata().Labels().Set(omni.LabelCluster, clusterName) + cpMachineSet.Metadata().Labels().Set(omni.LabelControlPlaneRole, "") + + t.Logf("snapshot name: %q", snapshotName) + + cpMachineSet.TypedSpec().Value.UpdateStrategy = specs.MachineSetSpec_Rolling + cpMachineSet.TypedSpec().Value.BootstrapSpec = &specs.MachineSetSpec_BootstrapSpec{ + ClusterUuid: clusterUUID.TypedSpec().Value.GetUuid(), + Snapshot: snapshotName, + } + + require.NoError(t, st.Create(ctx, cpMachineSet)) + } +} + +// assertLength asserts on the length of a resource list. It's a specialized version of [rtestutils.AssertLength] which +// restarts WatchKind on each ticker tick. It here because [rtestutils.AssertLength] does not support [state.WatchKindOption] +// and because WatchKind on external resource does not send new events. +func assertLength[R meta.ResourceWithRD](ctx context.Context, t *testing.T, st state.State, expectedLength int, watchOpts ...state.WatchKindOption) { + var r R + + rds := r.ResourceDefinition() + + watchOpts = append( + watchOpts[:len(watchOpts):len(watchOpts)], + state.WithBootstrapContents(true), + ) + + reportTicker := time.NewTicker(5 * time.Second) + defer reportTicker.Stop() + + ctx, cancel := context.WithCancel(ctx) + defer cancel() + + for { + req := require.New(t) + + innerCtx, cancel := context.WithCancel(ctx) + + watchCh := make(chan state.Event) + + req.NoError(st.WatchKind( + innerCtx, + resource.NewMetadata(rds.DefaultNamespace, rds.Type, "", resource.VersionUndefined), + watchCh, + watchOpts...)) + + length := 0 + bootstrapped := false + + for { + shouldBreak := false + + select { + case event := <-watchCh: + switch event.Type { //nolint:exhaustive + case state.Created: + length++ + case state.Destroyed: + length-- + case state.Bootstrapped: + bootstrapped = true + case state.Errored: + req.NoError(event.Error) + } + + if bootstrapped && length == expectedLength { + cancel() + + return + } + case <-reportTicker.C: + t.Logf("length: expected %d, actual %d", expectedLength, length) + + shouldBreak = true + case <-innerCtx.Done(): + t.Fatalf("timeout: expected %d, actual %d", expectedLength, length) + } + + if shouldBreak { + cancel() + + break + } + } + } +} + +func createS3Conf() *omni.EtcdBackupS3Conf { + conf := omni.NewEtcdBackupS3Conf() + + conf.TypedSpec().Value = &specs.EtcdBackupS3ConfSpec{ + Bucket: "mybucket", + Region: "us-east-1", + Endpoint: "http://127.0.0.1:9000", + AccessKeyId: "access", + SecretAccessKey: "secret123", + } + + return conf +} diff --git a/cmd/omni-integration-test/pkg/tests/blocks.go b/cmd/omni-integration-test/pkg/tests/blocks.go new file mode 100644 index 00000000..de180274 --- /dev/null +++ b/cmd/omni-integration-test/pkg/tests/blocks.go @@ -0,0 +1,260 @@ +// Copyright (c) 2024 Sidero Labs, Inc. +// +// Use of this software is governed by the Business Source License +// included in the LICENSE file. + +package tests + +import ( + "context" + "strings" + "time" + + "github.com/cosi-project/runtime/pkg/resource" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/client" + "github.com/siderolabs/omni/client/pkg/client/management" + "github.com/siderolabs/omni/client/pkg/omni/resources/omni" +) + +// TestBlockClusterShouldBeReady is a reusable block of assertions that can be used to verify that a cluster is fully ready. +func TestBlockClusterShouldBeReady(ctx context.Context, rootClient *client.Client, clusterName, expectedTalosVersion string, talosAPIKeyPrepare TalosAPIKeyPrepareFunc) subTestList { //nolint:revive + return subTestList{ + { + "ClusterMachinesShouldBeRunning", + AssertClusterMachinesStage(ctx, rootClient.Omni().State(), clusterName, specs.ClusterMachineStatusSpec_RUNNING), + }, + { + "ClusterMachinesShouldBeReady", + AssertClusterMachinesReady(ctx, rootClient.Omni().State(), clusterName), + }, + { + "MachinesStatusShouldBeNotAvailable", + AssertMachineStatus(ctx, rootClient.Omni().State(), false, clusterName, map[string]string{ + omni.MachineStatusLabelConnected: "", + omni.MachineStatusLabelReportingEvents: "", + }, + []string{omni.MachineStatusLabelAvailable}, + ), + }, + { + "ClusterShouldHaveStatusReady", + AssertClusterStatusReady(ctx, rootClient.Omni().State(), clusterName), + }, + { + "ClusterLoadBalancerShouldBeReady", + AssertClusterLoadBalancerReady(ctx, rootClient.Omni().State(), clusterName), + }, + { + "EtcdMembersShouldMatchOmniResources", + AssertEtcdMembershipMatchesOmniResources(ctx, rootClient, clusterName, talosAPIKeyPrepare), + }, + { + "TalosMembersShouldMatchOmniResources", + AssertTalosMembersMatchOmni(ctx, rootClient, clusterName, talosAPIKeyPrepare), + }, + { + "TalosVersionShouldMatchExpected", + AssertTalosVersion(ctx, rootClient, clusterName, expectedTalosVersion, talosAPIKeyPrepare), + }, + } +} + +// TestBlockProxyAPIAccessShouldWork is a reusable block of assertions that can be used to verify that Omni API proxies work. +func TestBlockProxyAPIAccessShouldWork(ctx context.Context, rootClient *client.Client, clusterName string, talosAPIKeyPrepare TalosAPIKeyPrepareFunc) []subTest { //nolint:revive + return []subTest{ + { + "ClusterKubernetesAPIShouldBeAccessibleViaOmni", + AssertKubernetesAPIAccessViaOmni(ctx, rootClient, clusterName, true, 30*time.Second), + }, + { + "ClusterTalosAPIShouldBeAccessibleViaOmni", + AssertTalosAPIAccessViaOmni(ctx, rootClient, clusterName, talosAPIKeyPrepare), + }, + } +} + +// TestBlockClusterAndTalosAPIAndKubernetesShouldBeReady is a reusable block of assertions that can be used to verify +// that a cluster is fully ready and that Omni API proxies work, and Kubernetes version is correct, and Kubernetes usage +// metrics were collected. +// +// This block is a bit slower than TestBlockClusterShouldBeReady, because it also verifies Kubernetes version. +func TestBlockClusterAndTalosAPIAndKubernetesShouldBeReady( + ctx context.Context, rootClient *client.Client, + clusterName, expectedTalosVersion, expectedKubernetesVersion string, + talosAPIKeyPrepare TalosAPIKeyPrepareFunc, +) []subTest { //nolint:revive + return TestBlockClusterShouldBeReady(ctx, rootClient, clusterName, expectedTalosVersion, talosAPIKeyPrepare). + Append(TestBlockProxyAPIAccessShouldWork(ctx, rootClient, clusterName, talosAPIKeyPrepare)...). + Append( + subTest{ + "ClusterKubernetesVersionShouldBeCorrect", + AssertClusterKubernetesVersion(ctx, rootClient.Omni().State(), clusterName, expectedKubernetesVersion), + }, + subTest{ + "ClusterBootstrapManifestsShouldBeInSync", + AssertClusterBootstrapManifestStatus(ctx, rootClient.Omni().State(), clusterName), + }, + ). + Append( + subTest{ + "ClusterKubernetesUsageShouldBeCorrect", + AssertClusterKubernetesUsage(ctx, rootClient.Omni().State(), clusterName), + }, + ) +} + +// TestBlockRestoreEtcdFromLatestBackup is a reusable block of assertions that can be used to verify that a +// cluster's control plane can be broken, destroyed and then restored from an etcd backup. +func TestBlockRestoreEtcdFromLatestBackup(ctx context.Context, rootClient *client.Client, talosAPIKeyPrepare TalosAPIKeyPrepareFunc, + options Options, controlPlaneNodeCount int, clusterName, assertDeploymentNS, assertDeploymentName string, +) subTestList { //nolint:revive + return subTestList{ + subTest{ + "ControlPlaneShouldBeBrokenThenDestroyed", + AssertBreakAndDestroyControlPlane(ctx, rootClient.Omni().State(), clusterName, options), + }, + subTest{ + "ControlPlaneShouldBeRestoredFromBackup", + AssertControlPlaneCanBeRestoredFromBackup(ctx, rootClient.Omni().State(), clusterName), + }, + subTest{ + "ControlPlaneShouldBeScaledUp", + ScaleClusterUp(ctx, rootClient.Omni().State(), ClusterOptions{ + Name: clusterName, + ControlPlanes: controlPlaneNodeCount, + MachineOptions: options.MachineOptions, + }), + }, + }.Append( + subTest{ + "ClusterShouldHaveStatusReady", + AssertClusterStatusReady(ctx, rootClient.Omni().State(), clusterName), + }, + subTest{ + "ClusterLoadBalancerShouldBeReady", + AssertClusterLoadBalancerReady(ctx, rootClient.Omni().State(), clusterName), + }, + subTest{ + "EtcdMembersShouldMatchOmniResources", + AssertEtcdMembershipMatchesOmniResources(ctx, rootClient, clusterName, talosAPIKeyPrepare), + }, + ).Append( + subTest{ + "KubernetesAPIShouldBeAccessible", + AssertKubernetesAPIAccessViaOmni(ctx, rootClient, clusterName, false, 300*time.Second), + }, + subTest{ + "ClusterNodesShouldBeInDesiredState", + AssertKubernetesNodesState(ctx, rootClient, clusterName), + }, + subTest{ + "KubeletShouldBeRestartedOnWorkers", + AssertTalosServiceIsRestarted(ctx, rootClient, clusterName, talosAPIKeyPrepare, "kubelet", resource.LabelExists(omni.LabelWorkerRole)), + }, + subTest{ + "KubernetesDeploymentShouldHaveRunningPods", + AssertKubernetesDeploymentHasRunningPods(ctx, rootClient.Management(), clusterName, assertDeploymentNS, assertDeploymentName), + }, + ).Append( + TestBlockKubernetesDeploymentCreateAndRunning(ctx, rootClient.Management(), clusterName, assertDeploymentNS, assertDeploymentName+"-after-restore")..., + ) +} + +// TestBlockCreateClusterFromEtcdBackup is a reusable block of assertions that can be used to verify that a +// new cluster can be created from another cluster's etcd backup. +func TestBlockCreateClusterFromEtcdBackup(ctx context.Context, rootClient *client.Client, talosAPIKeyPrepare TalosAPIKeyPrepareFunc, options Options, + sourceClusterName, newClusterName, assertDeploymentNS, assertDeploymentName string, +) subTestList { //nolint:revive + return subTestList{ + subTest{ + "ClusterShouldBeCreatedFromEtcdBackup", + CreateCluster(ctx, rootClient, ClusterOptions{ + Name: newClusterName, + ControlPlanes: 1, + Workers: 1, + + RestoreFromEtcdBackupClusterID: sourceClusterName, + + MachineOptions: options.MachineOptions, + }), + }, + }.Append( + subTest{ + "ClusterShouldHaveStatusReady", + AssertClusterStatusReady(ctx, rootClient.Omni().State(), newClusterName), + }, + subTest{ + "ClusterLoadBalancerShouldBeReady", + AssertClusterLoadBalancerReady(ctx, rootClient.Omni().State(), newClusterName), + }, + subTest{ + "EtcdMembersShouldMatchOmniResources", + AssertEtcdMembershipMatchesOmniResources(ctx, rootClient, newClusterName, talosAPIKeyPrepare), + }, + ).Append( + subTest{ + "KubernetesAPIShouldBeAccessible", + AssertKubernetesAPIAccessViaOmni(ctx, rootClient, newClusterName, false, 300*time.Second), + }, + subTest{ + "ClusterNodesShouldBeInDesiredState", + AssertKubernetesNodesState(ctx, rootClient, newClusterName), + }, + subTest{ + "KubernetesDeploymentShouldHaveRunningPods", + AssertKubernetesDeploymentHasRunningPods(ctx, rootClient.Management(), newClusterName, assertDeploymentNS, assertDeploymentName), + }, + ).Append( + TestBlockKubernetesDeploymentCreateAndRunning(ctx, rootClient.Management(), newClusterName, assertDeploymentNS, assertDeploymentName+"-after-restore")..., + ) +} + +// TestBlockKubernetesDeploymentCreateAndRunning is a reusable block of assertions that can be used to verify that a +// Kubernetes deployment is created and has running pods. +func TestBlockKubernetesDeploymentCreateAndRunning(ctx context.Context, managementClient *management.Client, clusterName, ns, name string) []subTest { //nolint:revive + return []subTest{ + { + "KubernetesDeploymentShouldBeCreated", + AssertKubernetesDeploymentIsCreated(ctx, managementClient, clusterName, ns, name), + }, + { + "KubernetesDeploymentShouldHaveRunningPods", + AssertKubernetesDeploymentHasRunningPods(ctx, managementClient, clusterName, ns, name), + }, + } +} + +// TestGroupClusterCreateAndReady is a reusable group of tests that can be used to verify that a cluster is created and ready. +func TestGroupClusterCreateAndReady( + ctx context.Context, + rootClient *client.Client, + talosAPIKeyPrepare TalosAPIKeyPrepareFunc, + name, description string, + options ClusterOptions, +) testGroup { //nolint:revive + clusterName := "integration-" + name + options.Name = clusterName + + return testGroup{ + Name: strings.ToUpper(name[0:1]) + name[1:] + "Cluster", + Description: description, + Parallel: true, + MachineClaim: options.ControlPlanes + options.Workers, + Subtests: subTests( + subTest{ + "ClusterShouldBeCreated", + CreateCluster(ctx, rootClient, options), + }, + ).Append( + TestBlockClusterAndTalosAPIAndKubernetesShouldBeReady(ctx, rootClient, clusterName, options.MachineOptions.TalosVersion, options.MachineOptions.KubernetesVersion, talosAPIKeyPrepare)..., + ).Append( + subTest{ + "ClusterShouldBeDestroyed", + AssertDestroyCluster(ctx, rootClient.Omni().State(), clusterName), + }, + ), + Finalizer: DestroyCluster(ctx, rootClient.Omni().State(), clusterName), + } +} diff --git a/cmd/omni-integration-test/pkg/tests/cleanup.go b/cmd/omni-integration-test/pkg/tests/cleanup.go new file mode 100644 index 00000000..dbbd3f90 --- /dev/null +++ b/cmd/omni-integration-test/pkg/tests/cleanup.go @@ -0,0 +1,33 @@ +// Copyright (c) 2024 Sidero Labs, Inc. +// +// Use of this software is governed by the Business Source License +// included in the LICENSE file. + +package tests + +import ( + "context" + "testing" + "time" + + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/rtestutils" + "github.com/cosi-project/runtime/pkg/state" + + "github.com/siderolabs/omni/client/pkg/omni/resources/omni" +) + +// DestroyAllClusterRelatedResources cleans up the state from the previous runs. +func DestroyAllClusterRelatedResources(testCtx context.Context, st state.State) TestFunc { + return func(t *testing.T) { + ctx, cancel := context.WithTimeout(testCtx, 300*time.Second) + defer cancel() + + rtestutils.Teardown[*omni.MachineSet](ctx, t, st, rtestutils.ResourceIDs[*omni.MachineSet](ctx, t, st)) + rtestutils.DestroyAll[*omni.MachineSetNode](ctx, t, st) + rtestutils.DestroyAll[*omni.ConfigPatch](ctx, t, st) + rtestutils.DestroyAll[*omni.MachineSet](ctx, t, st) + rtestutils.DestroyAll[*omni.Cluster](ctx, t, st) + rtestutils.Destroy[*omni.EtcdBackupS3Conf](ctx, t, st, []resource.ID{omni.EtcdBackupS3ConfID}) + } +} diff --git a/cmd/omni-integration-test/pkg/tests/cluster.go b/cmd/omni-integration-test/pkg/tests/cluster.go new file mode 100644 index 00000000..6ff31f89 --- /dev/null +++ b/cmd/omni-integration-test/pkg/tests/cluster.go @@ -0,0 +1,839 @@ +// Copyright (c) 2024 Sidero Labs, Inc. +// +// Use of this software is governed by the Business Source License +// included in the LICENSE file. + +package tests + +import ( + "context" + "fmt" + "math/rand" + "sync" + "testing" + "time" + + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/rtestutils" + "github.com/cosi-project/runtime/pkg/safe" + "github.com/cosi-project/runtime/pkg/state" + "github.com/siderolabs/gen/pair" + "github.com/siderolabs/gen/xslices" + "github.com/siderolabs/go-retry/retry" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "gopkg.in/yaml.v3" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/client" + "github.com/siderolabs/omni/client/pkg/cosi/labels" + "github.com/siderolabs/omni/client/pkg/omni/resources" + "github.com/siderolabs/omni/client/pkg/omni/resources/omni" + "github.com/siderolabs/omni/client/pkg/omni/resources/siderolink" + "github.com/siderolabs/omni/client/pkg/omni/resources/virtual" +) + +// ClusterOptions are the options for cluster creation. +// +//nolint:govet +type ClusterOptions struct { + Name string + + // RestoreFromEtcdBackupClusterID is the cluster ID of the cluster to restore from. + // When specified, the cluster will be created with the etcd from the latest etcd backup of the specified cluster. + RestoreFromEtcdBackupClusterID string + + ControlPlanes, Workers int + Features *specs.ClusterSpec_Features + EtcdBackup *specs.EtcdBackupConf + + MachineOptions MachineOptions +} + +// MachineOptions are the options for machine creation. +type MachineOptions struct { + TalosVersion string + KubernetesVersion string +} + +// CreateCluster verifies cluster creation. +func CreateCluster(testCtx context.Context, cli *client.Client, options ClusterOptions) TestFunc { + return func(t *testing.T) { + ctx, cancel := context.WithTimeout(testCtx, 150*time.Second) + defer cancel() + + st := cli.Omni().State() + require := require.New(t) + + pickUnallocatedMachines(ctx, t, st, options.ControlPlanes+options.Workers, func(machineIDs []resource.ID) { + checkExtensionWithRetries(ctx, t, cli, HelloWorldServiceExtensionName, machineIDs...) + + cluster := omni.NewCluster(resources.DefaultNamespace, options.Name) + cluster.TypedSpec().Value.TalosVersion = options.MachineOptions.TalosVersion + cluster.TypedSpec().Value.KubernetesVersion = options.MachineOptions.KubernetesVersion + cluster.TypedSpec().Value.Features = options.Features + cluster.TypedSpec().Value.BackupConfiguration = options.EtcdBackup + + require.NoError(st.Create(ctx, cluster)) + + for i := 0; i < options.ControlPlanes; i++ { + t.Logf("Adding machine '%s' to control plane (cluster %q)", machineIDs[i], options.Name) + bindMachine(ctx, t, st, bindMachineOptions{ + clusterName: options.Name, + role: omni.LabelControlPlaneRole, + machineID: machineIDs[i], + restoreFromEtcdBackupClusterID: options.RestoreFromEtcdBackupClusterID, + }) + } + + for i := options.ControlPlanes; i < options.ControlPlanes+options.Workers; i++ { + t.Logf("Adding machine '%s' to workers (cluster %q)", machineIDs[i], options.Name) + bindMachine(ctx, t, st, bindMachineOptions{ + clusterName: options.Name, + role: omni.LabelWorkerRole, + machineID: machineIDs[i], + }) + } + + // assert that machines got allocated (label available is removed) + rtestutils.AssertResources(ctx, t, st, machineIDs, func(machineStatus *omni.MachineStatus, assert *assert.Assertions) { + assert.True(machineStatus.Metadata().Labels().Matches( + resource.LabelTerm{ + Key: omni.MachineStatusLabelAvailable, + Op: resource.LabelOpExists, + Invert: true, + }, + ), resourceDetails(machineStatus)) + }) + }) + } +} + +// CreateClusterWithMachineClass verifies cluster creation. +func CreateClusterWithMachineClass(testCtx context.Context, st state.State, options ClusterOptions) TestFunc { + return func(t *testing.T) { + ctx, cancel := context.WithTimeout(testCtx, 150*time.Second) + defer cancel() + + require := require.New(t) + + cluster := omni.NewCluster(resources.DefaultNamespace, options.Name) + cluster.TypedSpec().Value.TalosVersion = options.MachineOptions.TalosVersion + cluster.TypedSpec().Value.KubernetesVersion = options.MachineOptions.KubernetesVersion + cluster.TypedSpec().Value.Features = options.Features + cluster.TypedSpec().Value.BackupConfiguration = options.EtcdBackup + + kubespanEnabler := omni.NewConfigPatch(resources.DefaultNamespace, fmt.Sprintf("%s-kubespan-enabler", options.Name)) + kubespanEnabler.Metadata().Labels().Set(omni.LabelCluster, options.Name) + + kubespanEnabler.TypedSpec().Value.Data = `machine: + network: + kubespan: + enabled: true +` + + require.NoError(st.Create(ctx, cluster)) + require.NoError(st.Create(ctx, kubespanEnabler)) + + machineClass := omni.NewMachineClass(resources.DefaultNamespace, options.Name) + + createOrUpdate(ctx, t, st, machineClass, func(r *omni.MachineClass) error { + r.TypedSpec().Value.MatchLabels = []string{omni.MachineStatusLabelConnected} + + return nil + }) + + query, err := labels.ParseSelectors(machineClass.TypedSpec().Value.MatchLabels) + + require.NoError(err) + + opts := xslices.Map(query, func(q resource.LabelQuery) state.ListOption { + return state.WithLabelQuery(resource.RawLabelQuery(q)) + }) + + ids := rtestutils.ResourceIDs[*omni.MachineStatus](ctx, t, st, opts...) + + // populate uuid patches for each machine matching the machine class + for _, machineID := range ids { + configPatch := omni.NewConfigPatch( + resources.DefaultNamespace, + fmt.Sprintf("000-%s-uuid-patch", machineID), + pair.MakePair(omni.LabelCluster, options.Name), + pair.MakePair(omni.LabelClusterMachine, machineID), + ) + + createOrUpdate(ctx, t, st, configPatch, func(cps *omni.ConfigPatch) error { + cps.Metadata().Labels().Set(omni.LabelCluster, options.Name) + cps.Metadata().Labels().Set(omni.LabelClusterMachine, machineID) + + cps.TypedSpec().Value.Data = fmt.Sprintf(`machine: + kubelet: + extraArgs: + node-labels: %s=%s`, nodeLabel, machineID) + + return nil + }) + } + + updateMachineClassMachineSets(ctx, t, st, options, machineClass) + } +} + +// ScaleClusterMachineSets scales the cluster with machine sets which are using machine classes. +func ScaleClusterMachineSets(testCtx context.Context, st state.State, options ClusterOptions) TestFunc { + return func(t *testing.T) { + ctx, cancel := context.WithTimeout(testCtx, 30*time.Second) + defer cancel() + + updateMachineClassMachineSets(ctx, t, st, options, nil) + } +} + +// ScaleClusterUp scales up the cluster. +func ScaleClusterUp(testCtx context.Context, st state.State, options ClusterOptions) TestFunc { + return func(t *testing.T) { + ctx, cancel := context.WithTimeout(testCtx, 30*time.Second) + defer cancel() + + pickUnallocatedMachines(ctx, t, st, options.ControlPlanes+options.Workers, func(machineIDs []resource.ID) { + for i := 0; i < options.ControlPlanes; i++ { + t.Logf("Adding machine '%s' to control plane (cluster %q)", machineIDs[i], options.Name) + + bindMachine(ctx, t, st, bindMachineOptions{ + clusterName: options.Name, + role: omni.LabelControlPlaneRole, + machineID: machineIDs[i], + }) + } + + for i := options.ControlPlanes; i < options.ControlPlanes+options.Workers; i++ { + t.Logf("Adding machine '%s' to workers (cluster %q)", machineIDs[i], options.Name) + + bindMachine(ctx, t, st, bindMachineOptions{ + clusterName: options.Name, + role: omni.LabelWorkerRole, + machineID: machineIDs[i], + }) + } + + // assert that machines got allocated (label available is removed) + rtestutils.AssertResources(ctx, t, st, machineIDs, func(machineStatus *omni.MachineStatus, assert *assert.Assertions) { + assert.True(machineStatus.Metadata().Labels().Matches( + resource.LabelTerm{ + Key: omni.MachineStatusLabelAvailable, + Op: resource.LabelOpExists, + Invert: true, + }, + ), resourceDetails(machineStatus)) + }) + + // assert that ClusterMachines got created + rtestutils.AssertResources(ctx, t, st, machineIDs, func(*omni.ClusterMachine, *assert.Assertions) {}) + }) + } +} + +// ScaleClusterDown scales cluster down. +// +// Pass < 0 to scale down machine set. +// Pass 0 to leave machine set as is. +func ScaleClusterDown(testCtx context.Context, st state.State, options ClusterOptions) TestFunc { + return func(t *testing.T) { + ctx, cancel := context.WithTimeout(testCtx, 10*time.Second) + defer cancel() + + controlPlanes := rtestutils.ResourceIDs[*omni.MachineSetNode](ctx, t, st, + state.WithLabelQuery(resource.LabelEqual(omni.LabelCluster, options.Name), resource.LabelExists(omni.LabelControlPlaneRole))) + + workers := rtestutils.ResourceIDs[*omni.MachineSetNode](ctx, t, st, + state.WithLabelQuery(resource.LabelEqual(omni.LabelCluster, options.Name), resource.LabelExists(omni.LabelWorkerRole))) + + if options.ControlPlanes < 0 { + finalCount := len(controlPlanes) + options.ControlPlanes + + require.Greaterf(t, finalCount, 0, "can't scale down") + controlPlanes = controlPlanes[finalCount:] + + t.Logf("Removing machines '%s' from control planes (cluster %q)", controlPlanes, options.Name) + + rtestutils.Destroy[*omni.MachineSetNode](ctx, t, st, controlPlanes) + } + + if options.Workers < 0 { + finalCount := len(workers) + options.Workers + + require.GreaterOrEqualf(t, finalCount, 0, "can't scale down") + workers = workers[finalCount:] + + t.Logf("Removing machines '%s' from workers (cluster %q)", workers, options.Name) + + rtestutils.Destroy[*omni.MachineSetNode](ctx, t, st, workers) + } + } +} + +// ReplaceControlPlanes replaces controlplane nodes. +func ReplaceControlPlanes(testCtx context.Context, st state.State, options ClusterOptions) TestFunc { + return func(t *testing.T) { + ctx, cancel := context.WithTimeout(testCtx, 30*time.Second) + defer cancel() + + existingControlPlanes := rtestutils.ResourceIDs[*omni.MachineSetNode](ctx, t, st, + state.WithLabelQuery(resource.LabelEqual(omni.LabelCluster, options.Name), resource.LabelExists(omni.LabelControlPlaneRole)), + ) + + pickUnallocatedMachines(ctx, t, st, len(existingControlPlanes), func(machineIDs []resource.ID) { + for _, machineID := range machineIDs { + t.Logf("Adding machine '%s' to control plane (cluster %q)", machineID, options.Name) + + bindMachine(ctx, t, st, bindMachineOptions{ + clusterName: options.Name, + role: omni.LabelControlPlaneRole, + machineID: machineID, + }) + } + + t.Logf("Removing machines '%s' from control planes (cluster %q)", existingControlPlanes, options.Name) + + rtestutils.Destroy[*omni.MachineSetNode](ctx, t, st, existingControlPlanes) + + // assert that machines got allocated (label available is removed) + rtestutils.AssertResources(ctx, t, st, machineIDs, func(machineStatus *omni.MachineStatus, assert *assert.Assertions) { + assert.True(machineStatus.Metadata().Labels().Matches( + resource.LabelTerm{ + Key: omni.MachineStatusLabelAvailable, + Op: resource.LabelOpExists, + Invert: true, + }, + ), resourceDetails(machineStatus)) + }) + + // assert that ClusterMachines got created + rtestutils.AssertResources(ctx, t, st, machineIDs, func(*omni.ClusterMachine, *assert.Assertions) {}) + }) + } +} + +// AssertClusterMachinesStage verifies that cluster machines reach a specified phase. +func AssertClusterMachinesStage(testCtx context.Context, st state.State, clusterName string, stage specs.ClusterMachineStatusSpec_Stage) TestFunc { + return func(t *testing.T) { + ctx, cancel := context.WithTimeout(testCtx, 6*time.Minute) + defer cancel() + + require := require.New(t) + + machineIDs := getMachineSetNodes(ctx, t, st, clusterName) + require.NotEmpty(machineIDs, "no machine set nodes found for cluster %q", clusterName) + + // assert that all machinesetnodes are present as cluster machines + rtestutils.AssertResources(ctx, t, st, machineIDs, func(*omni.ClusterMachine, *assert.Assertions) {}) + + // assert that there are not clustermachines which are not machinesetnodes + cmIDs := rtestutils.ResourceIDs[*omni.ClusterMachine](ctx, t, st, state.WithLabelQuery(resource.LabelEqual(omni.LabelCluster, clusterName))) + + machineIDMap := xslices.ToSet(machineIDs) + + for _, cmID := range cmIDs { + if _, ok := machineIDMap[cmID]; ok { + // cluster machine matches expected machine set node + continue + } + + // wait for the cluster machine to be cleaned up + rtestutils.AssertNoResource[*omni.ClusterMachine](ctx, t, st, cmID) + } + + rtestutils.AssertResources(ctx, t, st, machineIDs, func(status *omni.ClusterMachineStatus, assert *assert.Assertions) { + spec := status.TypedSpec().Value + + assert.Equal(stage, spec.Stage, "%s != %s, %s", stage.String(), spec.Stage.String(), resourceDetails(status)) + }) + } +} + +// AssertClusterMachinesReady verifies that cluster machines reach ready state. +func AssertClusterMachinesReady(testCtx context.Context, st state.State, clusterName string) TestFunc { + return func(t *testing.T) { + ctx, cancel := context.WithTimeout(testCtx, 4*time.Minute) + defer cancel() + + require := require.New(t) + + machineIDs := getMachineSetNodes(ctx, t, st, clusterName) + require.NotEmpty(machineIDs) + + rtestutils.AssertResources(ctx, t, st, machineIDs, func(*omni.ClusterMachine, *assert.Assertions) {}) + + rtestutils.AssertResources(ctx, t, st, machineIDs, func(status *omni.ClusterMachineStatus, assert *assert.Assertions) { + spec := status.TypedSpec().Value + + assert.Truef(spec.Ready, "cluster machine status not ready: %s", resourceDetails(status)) + }) + + rtestutils.AssertResources(ctx, t, st, machineIDs, func(status *omni.ClusterMachineIdentity, assert *assert.Assertions) { + spec := status.TypedSpec().Value + + assert.NotEmptyf(spec.NodeIdentity, "no node identity: %s", resourceDetails(status)) + }) + } +} + +// AssertClusterStatusReady verifies that cluster status reaches ready state. +func AssertClusterStatusReady(testCtx context.Context, st state.State, clusterName string) TestFunc { + return func(t *testing.T) { + ctx, cancel := context.WithTimeout(testCtx, time.Minute*5) + defer cancel() + + require := require.New(t) + + machineIDs := getMachineSetNodes(ctx, t, st, clusterName) + require.NotEmpty(machineIDs) + + rtestutils.AssertResources(ctx, t, st, []string{clusterName}, func(status *omni.ClusterStatus, assert *assert.Assertions) { + spec := status.TypedSpec().Value + + assert.Truef(spec.Available, "not available: %s", resourceDetails(status)) + assert.Equalf(specs.ClusterStatusSpec_RUNNING, spec.Phase, "cluster is not in phase running: %s", resourceDetails(status)) + assert.Equalf(spec.GetMachines().Total, spec.GetMachines().Healthy, "not all machines are healthy: %s", resourceDetails(status)) + assert.Truef(spec.Ready, "cluster is not ready: %s", resourceDetails(status)) + assert.Truef(spec.ControlplaneReady, "cluster controlplane is not ready: %s", resourceDetails(status)) + assert.Truef(spec.KubernetesAPIReady, "cluster kubernetes API is not ready: %s", resourceDetails(status)) + assert.EqualValuesf(len(machineIDs), spec.GetMachines().Total, "total machines is not the same as in the machine sets: %s", resourceDetails(status)) + }) + } +} + +// AssertClusterLoadBalancerReady verifies that cluster load balancer reaches ready state. +func AssertClusterLoadBalancerReady(testCtx context.Context, st state.State, clusterName string) TestFunc { + return func(t *testing.T) { + ctx, cancel := context.WithTimeout(testCtx, 30*time.Second) + defer cancel() + + rtestutils.AssertResources(ctx, t, st, []string{clusterName}, func(status *omni.LoadBalancerStatus, assert *assert.Assertions) { + spec := status.TypedSpec().Value + + assert.Truef(spec.Healthy, "lb not healthy: %s", resourceDetails(status)) + }) + } +} + +// AssertClusterKubernetesVersion verifies that Kubernetes version matches expectations. +func AssertClusterKubernetesVersion(testCtx context.Context, st state.State, clusterName, expectedKubernetesVersion string) TestFunc { + return func(t *testing.T) { + ctx, cancel := context.WithTimeout(testCtx, 180*time.Second) + defer cancel() + + rtestutils.AssertResources(ctx, t, st, []string{clusterName}, func(status *omni.KubernetesUpgradeStatus, assert *assert.Assertions) { + spec := status.TypedSpec().Value + + assert.Equal(expectedKubernetesVersion, spec.LastUpgradeVersion, resourceDetails(status)) + assert.Equal(specs.KubernetesUpgradeStatusSpec_Done, spec.Phase, resourceDetails(status)) + }) + } +} + +// AssertClusterBootstrapManifestStatus verifies that Kubernetes boostrap manifests are in sync. +func AssertClusterBootstrapManifestStatus(testCtx context.Context, st state.State, clusterName string) TestFunc { + return func(t *testing.T) { + ctx, cancel := context.WithTimeout(testCtx, 60*time.Second) + defer cancel() + + rtestutils.AssertResources(ctx, t, st, []string{clusterName}, func(status *omni.KubernetesUpgradeManifestStatus, assert *assert.Assertions) { + spec := status.TypedSpec().Value + + assert.EqualValues(0, spec.OutOfSync, resourceDetails(status)) + }) + } +} + +// AssertClusterKubernetesUsage verifies that Kubernetes usage matches expectations. +func AssertClusterKubernetesUsage(testCtx context.Context, st state.State, clusterName string) TestFunc { + return func(t *testing.T) { + ctx, cancel := context.WithTimeout(testCtx, 180*time.Second) + defer cancel() + + rtestutils.AssertResource(ctx, t, st, clusterName, func(status *virtual.KubernetesUsage, assert *assert.Assertions) { + spec := status.TypedSpec().Value + + assert.NotNil(spec.Cpu, resourceDetails(status)) + assert.NotNil(spec.Mem, resourceDetails(status)) + assert.NotNil(spec.Storage, resourceDetails(status)) + assert.NotNil(spec.Pods, resourceDetails(status)) + + assert.Greater(spec.Cpu.Requests, float64(0), resourceDetails(status)) + assert.Greater(spec.Cpu.Capacity, float64(0), resourceDetails(status)) + + assert.Greater(spec.Mem.Requests, float64(0), resourceDetails(status)) + assert.Greater(spec.Mem.Capacity, float64(0), resourceDetails(status)) + + assert.Greater(spec.Storage.Capacity, float64(0), resourceDetails(status)) + + assert.Greater(spec.Pods.Count, int32(0), resourceDetails(status)) + assert.Greater(spec.Pods.Capacity, int32(0), resourceDetails(status)) + }, rtestutils.WithNamespace(resources.VirtualNamespace)) + } +} + +// DestroyCluster destroys a cluster and waits for it to be destroyed. +// +// It is used as a finalizer when the test group fails. +func DestroyCluster(testCtx context.Context, st state.State, clusterName string) TestFunc { + return func(t *testing.T) { + ctx, cancel := context.WithTimeout(testCtx, 300*time.Second) + defer cancel() + + clusterMachineIDs := rtestutils.ResourceIDs[*omni.ClusterMachine](ctx, t, st, state.WithLabelQuery( + resource.LabelEqual(omni.LabelCluster, clusterName), + )) + + t.Log("destroying cluster", clusterName) + + rtestutils.Teardown[*omni.Cluster](ctx, t, st, []resource.ID{clusterName}) + + rtestutils.AssertNoResource[*omni.Cluster](ctx, t, st, clusterName) + + // wait for all machines to returned to the pool as 'available' or be part of a different cluster + rtestutils.AssertResources(ctx, t, st, clusterMachineIDs, func(machine *omni.MachineStatus, asrt *assert.Assertions) { + _, isAvailable := machine.Metadata().Labels().Get(omni.MachineStatusLabelAvailable) + machineCluster, machineBound := machine.Metadata().Labels().Get(omni.LabelCluster) + + asrt.True(isAvailable || (machineBound && machineCluster != clusterName), + "machine %q: available %v, bound %v, cluster %q", machine.Metadata().ID(), isAvailable, machineBound, machineCluster, + ) + }) + + _, err := st.Get(ctx, omni.NewMachineClass(resources.DefaultNamespace, clusterName).Metadata()) + if state.IsNotFoundError(err) { + return + } + + require.NoError(t, err) + + t.Log("destroying related machine class", clusterName) + + rtestutils.Destroy[*omni.MachineClass](ctx, t, st, []string{clusterName}) + } +} + +// AssertDestroyCluster destroys a cluster and verifies that all dependent resources are gone. +func AssertDestroyCluster(testCtx context.Context, st state.State, clusterName string) TestFunc { + return func(t *testing.T) { + ctx, cancel := context.WithTimeout(testCtx, 300*time.Second) + defer cancel() + + patches := rtestutils.ResourceIDs[*omni.ConfigPatch](ctx, t, st, state.WithLabelQuery( + resource.LabelEqual(omni.LabelCluster, clusterName), + )) + + machineSets := rtestutils.ResourceIDs[*omni.MachineSet](ctx, t, st, state.WithLabelQuery( + resource.LabelEqual(omni.LabelCluster, clusterName), + )) + + clusterMachineIDs := rtestutils.ResourceIDs[*omni.ClusterMachine](ctx, t, st, state.WithLabelQuery( + resource.LabelEqual(omni.LabelCluster, clusterName), + )) + + t.Log("destroying cluster", clusterName) + + _, err := st.Teardown(ctx, resource.NewMetadata(resources.DefaultNamespace, omni.ClusterType, clusterName, resource.VersionUndefined)) + + require.NoError(t, err) + + rtestutils.AssertNoResource[*omni.Cluster](ctx, t, st, clusterName) + + for _, id := range patches { + rtestutils.AssertNoResource[*omni.ConfigPatch](ctx, t, st, id) + } + + for _, id := range machineSets { + rtestutils.AssertNoResource[*omni.MachineSet](ctx, t, st, id) + } + + // wait for all machines to returned to the pool as 'available' or be part of a different cluster + rtestutils.AssertResources(ctx, t, st, clusterMachineIDs, func(machine *omni.MachineStatus, asrt *assert.Assertions) { + _, isAvailable := machine.Metadata().Labels().Get(omni.MachineStatusLabelAvailable) + machineCluster, machineBound := machine.Metadata().Labels().Get(omni.LabelCluster) + asrt.True(isAvailable || (machineBound && machineCluster != clusterName), + "machine %q: available %v, bound %v, cluster %q", machine.Metadata().ID(), isAvailable, machineBound, machineCluster, + ) + }) + } +} + +// AssertBreakAndDestroyControlPlane breaks the control plane of the given cluster +// by freezing all control plane machines, then destroys its control plane. +func AssertBreakAndDestroyControlPlane(testCtx context.Context, st state.State, clusterName string, options Options) TestFunc { + return func(t *testing.T) { + ctx, cancel := context.WithTimeout(testCtx, 300*time.Second) + defer cancel() + + rtestutils.AssertResource[*omni.ClusterBootstrapStatus](ctx, t, st, clusterName, func(status *omni.ClusterBootstrapStatus, assert *assert.Assertions) { + assert.True(status.TypedSpec().Value.GetBootstrapped()) + }) + + // break the control plane + frozenMachineIDs := freezeMachinesOfType(ctx, t, st, clusterName, options.FreezeAMachineFunc, omni.LabelControlPlaneRole) + + // remove the broken machines + rtestutils.Teardown[*siderolink.Link](ctx, t, st, frozenMachineIDs) + + // destroy the control plane + rtestutils.Destroy[*omni.MachineSet](ctx, t, st, []string{omni.ControlPlanesResourceID(clusterName)}) + rtestutils.Destroy[*siderolink.Link](ctx, t, st, frozenMachineIDs) + + // assert that the bootstrapped flag is set to false + rtestutils.AssertResource[*omni.ClusterBootstrapStatus](ctx, t, st, clusterName, func(status *omni.ClusterBootstrapStatus, assert *assert.Assertions) { + assert.False(status.TypedSpec().Value.GetBootstrapped()) + }) + + // wipe the frozen machines to bring them back to the pool + for _, machineID := range frozenMachineIDs { + wipeMachine(ctx, t, st, machineID, options.WipeAMachineFunc) + } + } +} + +const nodeLabel = "omni-uuid" + +type bindMachineOptions struct { + clusterName, role, machineID, restoreFromEtcdBackupClusterID string +} + +func bindMachine(ctx context.Context, t *testing.T, st state.State, bindOpts bindMachineOptions) { + configPatch := omni.NewConfigPatch( + resources.DefaultNamespace, + fmt.Sprintf("000-%s-%s-install-disk", bindOpts.clusterName, bindOpts.machineID), + pair.MakePair(omni.LabelCluster, bindOpts.clusterName), + pair.MakePair(omni.LabelClusterMachine, bindOpts.machineID), + ) + + createOrUpdate(ctx, t, st, configPatch, func(cps *omni.ConfigPatch) error { + cps.Metadata().Labels().Set(omni.LabelCluster, bindOpts.clusterName) + cps.Metadata().Labels().Set(omni.LabelClusterMachine, bindOpts.machineID) + + var shortRole string + + switch bindOpts.role { + case omni.LabelControlPlaneRole: + shortRole = "cp" + case omni.LabelWorkerRole: + shortRole = "w" + } + + hostname := fmt.Sprintf("%s-%s-%s", bindOpts.clusterName, shortRole, bindOpts.machineID) + + if len(hostname) > 63 { + // trim left, to keep the UUID intact + hostname = hostname[len(hostname)-63:] + } + + patch := map[string]any{ + "machine": map[string]any{ + "install": map[string]any{ + "disk": "/dev/vda", + }, + "network": map[string]any{ + "hostname": hostname, + }, + "kubelet": map[string]any{ + "extraArgs": map[string]any{ + "node-labels": fmt.Sprintf("%s=%s", nodeLabel, bindOpts.machineID), + }, + }, + }, + } + + patchBytes, err := yaml.Marshal(patch) + if err != nil { + return err + } + + cps.TypedSpec().Value.Data = string(patchBytes) + + return nil + }) + + id := omni.WorkersResourceID(bindOpts.clusterName) + if bindOpts.role == omni.LabelControlPlaneRole { + id = omni.ControlPlanesResourceID(bindOpts.clusterName) + } + + ms := omni.NewMachineSet(resources.DefaultNamespace, id) + ms.Metadata().Labels().Set(omni.LabelCluster, bindOpts.clusterName) + ms.Metadata().Labels().Set(bindOpts.role, "") + + var bootstrapSpec *specs.MachineSetSpec_BootstrapSpec + + if bindOpts.restoreFromEtcdBackupClusterID != "" && bindOpts.role == omni.LabelControlPlaneRole { // not a fresh cluster - restore from the etcd backup of another cluster + backupList, err := safe.StateListAll[*omni.EtcdBackup](ctx, st, state.WithLabelQuery(resource.LabelEqual(omni.LabelCluster, bindOpts.restoreFromEtcdBackupClusterID))) + require.NoError(t, err) + + require.NotEmpty(t, backupList.Len(), "no etcd backup found for cluster %q", bindOpts.restoreFromEtcdBackupClusterID) + + clusterUUID, err := safe.StateGetByID[*omni.ClusterUUID](ctx, st, bindOpts.restoreFromEtcdBackupClusterID) + require.NoError(t, err) + + backup := backupList.Get(0) + + bootstrapSpec = &specs.MachineSetSpec_BootstrapSpec{ + ClusterUuid: clusterUUID.TypedSpec().Value.GetUuid(), + Snapshot: backup.TypedSpec().Value.GetSnapshot(), + } + } + + createOrUpdate(ctx, t, st, ms, func(ms *omni.MachineSet) error { + ms.Metadata().Labels().Set(omni.LabelCluster, bindOpts.clusterName) + ms.Metadata().Labels().Set(bindOpts.role, "") + + ms.TypedSpec().Value.UpdateStrategy = specs.MachineSetSpec_Rolling + + if bootstrapSpec != nil { + ms.TypedSpec().Value.BootstrapSpec = bootstrapSpec + } + + return nil + }) + + machineSetNode := omni.NewMachineSetNode(resources.DefaultNamespace, bindOpts.machineID, ms) + + _, ok := machineSetNode.Metadata().Labels().Get(omni.LabelCluster) + require.Truef(t, ok, "the machine label cluster is not set on the machine set node") + + createOrUpdate(ctx, t, st, machineSetNode, func(*omni.MachineSetNode) error { + return nil + }) +} + +func getMachineSetNodes(ctx context.Context, t *testing.T, st state.State, clusterName string) []string { + require := require.New(t) + + machineIDs := rtestutils.ResourceIDs[*omni.MachineSetNode](ctx, t, st, state.WithLabelQuery(resource.LabelEqual(omni.LabelCluster, clusterName))) + require.NotEmpty(machineIDs) + + return machineIDs +} + +// machineAllocationLock makes sure that only one test allocates machines at a time. +var machineAllocationLock sync.Mutex + +func pickUnallocatedMachines(ctx context.Context, t *testing.T, st state.State, count int, f func([]resource.ID)) { + machineAllocationLock.Lock() + defer machineAllocationLock.Unlock() + + result := make([]resource.ID, 0, count) + + err := retry.Constant(time.Minute).RetryWithContext(ctx, func(ctx context.Context) error { + machineIDs := rtestutils.ResourceIDs[*omni.MachineStatus](ctx, t, st, state.WithLabelQuery(resource.LabelExists(omni.MachineStatusLabelAvailable))) + + if len(machineIDs) < count { + return retry.ExpectedErrorf("not enough machines: available %d, requested %d", len(machineIDs), count) + } + + for _, j := range rand.Perm(len(machineIDs))[:count] { + result = append(result, machineIDs[j]) + } + + return nil + }) + + require.NoError(t, err) + + f(result) +} + +func createOrUpdate[T resource.Resource](ctx context.Context, t *testing.T, s state.State, res T, update func(T) error, createOpts ...state.CreateOption) { + require := require.New(t) + + cb := func(r T) error { + for key, value := range res.Metadata().Labels().Raw() { + r.Metadata().Labels().Set(key, value) + } + + return update(r) + } + + // try getting the resource first, and if it exists, skip attempting to create, + // as relying on create to fail with conflict might not give the expected result due to validation errors + _, err := s.Get(ctx, res.Metadata()) + notFound := state.IsNotFoundError(err) + + if err != nil && !notFound { + require.NoError(err) + } + + if notFound { + toCreate := res.DeepCopy().(T) //nolint:forcetypeassert,errcheck + + require.NoError(cb(toCreate)) + + err = s.Create(ctx, toCreate, createOpts...) + if err == nil { + return + } + + if !state.IsConflictError(err) { + require.NoError(err) + } + } + + if _, err = safe.StateUpdateWithConflicts(ctx, s, res.Metadata(), cb); err != nil { + require.NoError(err) + } +} + +func waitMachineSetNodesSync(ctx context.Context, t *testing.T, st state.State, options ClusterOptions) { + machineSets := []resource.ID{ + omni.ControlPlanesResourceID(options.Name), + omni.WorkersResourceID(options.Name), + } + + rtestutils.AssertResources(ctx, t, st, machineSets, func(status *omni.MachineSetStatus, assert *assert.Assertions) { + spec := status.TypedSpec().Value + + ids := rtestutils.ResourceIDs[*omni.MachineSetNode](ctx, t, st, state.WithLabelQuery( + resource.LabelEqual(omni.LabelMachineSet, status.Metadata().ID()), + )) + + assert.Equal(int(spec.Machines.Requested), len(ids), resourceDetails(status)) + }) +} + +func updateMachineClassMachineSets(ctx context.Context, t *testing.T, st state.State, options ClusterOptions, machineClass *omni.MachineClass) { + machineAllocationLock.Lock() + defer machineAllocationLock.Unlock() + + for _, role := range []string{omni.LabelControlPlaneRole, omni.LabelWorkerRole} { + id := omni.WorkersResourceID(options.Name) + machineCount := options.Workers + + if role == omni.LabelControlPlaneRole { + id = omni.ControlPlanesResourceID(options.Name) + machineCount = options.ControlPlanes + } + + ms := omni.NewMachineSet(resources.DefaultNamespace, id) + + createOrUpdate(ctx, t, st, ms, func(r *omni.MachineSet) error { + r.Metadata().Labels().Set(omni.LabelCluster, options.Name) + r.Metadata().Labels().Set(role, "") + + switch { + case machineClass != nil: + r.TypedSpec().Value.MachineClass = &specs.MachineSetSpec_MachineClass{ + MachineCount: uint32(machineCount), + Name: machineClass.Metadata().ID(), + } + case r.TypedSpec().Value.MachineClass != nil: + r.TypedSpec().Value.MachineClass.MachineCount += uint32(machineCount) + } + + require.NotNilf(t, r.TypedSpec().Value.MachineClass, "the machine set doesn't have machine class set") + + r.TypedSpec().Value.UpdateStrategy = specs.MachineSetSpec_Rolling + + return nil + }) + } + + waitMachineSetNodesSync(ctx, t, st, options) +} diff --git a/cmd/omni-integration-test/pkg/tests/common.go b/cmd/omni-integration-test/pkg/tests/common.go new file mode 100644 index 00000000..cb0825de --- /dev/null +++ b/cmd/omni-integration-test/pkg/tests/common.go @@ -0,0 +1,183 @@ +// Copyright (c) 2024 Sidero Labs, Inc. +// +// Use of this software is governed by the Business Source License +// included in the LICENSE file. + +package tests + +import ( + "context" + "crypto/tls" + "errors" + "fmt" + "net" + "strings" + + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/safe" + "github.com/cosi-project/runtime/pkg/state" + talosclient "github.com/siderolabs/talos/pkg/machinery/client" + clientconfig "github.com/siderolabs/talos/pkg/machinery/client/config" + "github.com/siderolabs/talos/pkg/machinery/resources/cluster" + + "github.com/siderolabs/omni/client/pkg/client" + "github.com/siderolabs/omni/client/pkg/omni/resources" + "github.com/siderolabs/omni/client/pkg/omni/resources/omni" + "github.com/siderolabs/omni/internal/backend/runtime/talos" +) + +func resourceDetails(res resource.Resource) string { + parts := []string{ + fmt.Sprintf("metadata: %s", res.Metadata().String()), + } + + hostname, ok := res.Metadata().Labels().Get(omni.LabelHostname) + if !ok { + parts = append(parts, fmt.Sprintf("hostname: %s", hostname)) + } + + if res.Metadata().Type() == omni.MachineStatusType { + network := res.Spec().(*omni.MachineStatusSpec).Value.Network //nolint:forcetypeassert + if network != nil { + parts = append(parts, fmt.Sprintf("hostname: %s", network.Hostname)) + } + } + + return strings.Join(parts, ", ") +} + +type node struct { + machine *omni.Machine + machineStatus *omni.MachineStatus + clusterMachine *omni.ClusterMachine + clusterMachineStatus *omni.ClusterMachineStatus + talosIP string +} + +func nodes(ctx context.Context, cli *client.Client, clusterName string, labels ...resource.LabelQueryOption) ([]node, error) { + talosCli, err := talosClient(ctx, cli, clusterName) + if err != nil { + return nil, err + } + + st := cli.Omni().State() + + nodeIPs, err := talosNodeIPs(ctx, talosCli.COSI) + if err != nil { + return nil, err + } + + labelQueryOptions := make([]resource.LabelQueryOption, 0, len(labels)+1) + labelQueryOptions = append(labelQueryOptions, labels...) + labelQueryOptions = append(labelQueryOptions, resource.LabelEqual(omni.LabelCluster, clusterName)) + + clusterMachineList, err := safe.StateListAll[*omni.ClusterMachine]( + ctx, + st, + state.WithLabelQuery(labelQueryOptions...), + ) + if err != nil { + return nil, err + } + + nodeList := make([]node, 0, clusterMachineList.Len()) + + for iter := clusterMachineList.Iterator(); iter.Next(); { + clusterMachine := iter.Value() + + machine, err := safe.StateGet[*omni.Machine](ctx, st, omni.NewMachine(resources.DefaultNamespace, clusterMachine.Metadata().ID()).Metadata()) + if err != nil && !state.IsNotFoundError(err) { + return nil, err + } + + machineStatus, err := safe.StateGet[*omni.MachineStatus](ctx, st, omni.NewMachineStatus(resources.DefaultNamespace, clusterMachine.Metadata().ID()).Metadata()) + if err != nil && !state.IsNotFoundError(err) { + return nil, err + } + + clusterMachineStatus, err := safe.StateGet[*omni.ClusterMachineStatus](ctx, st, omni.NewClusterMachineStatus(resources.DefaultNamespace, clusterMachine.Metadata().ID()).Metadata()) + if err != nil && !state.IsNotFoundError(err) { + return nil, err + } + + var talosIP string + + for _, address := range machineStatus.TypedSpec().Value.GetNetwork().GetAddresses() { + for _, nodeIP := range nodeIPs { + ip, _, err := net.ParseCIDR(address) + if err != nil { + continue + } + + if ip.String() == nodeIP { + talosIP = nodeIP + + break + } + } + } + + nodeList = append(nodeList, node{ + machine: machine, + machineStatus: machineStatus, + clusterMachine: clusterMachine, + clusterMachineStatus: clusterMachineStatus, + talosIP: talosIP, + }) + } + + return nodeList, nil +} + +func talosClient(ctx context.Context, cli *client.Client, clusterName string) (*talosclient.Client, error) { + data, err := cli.Management().Talosconfig(ctx) + if err != nil { + return nil, err + } + + if len(data) == 0 { + return nil, errors.New("empty talosconfig") + } + + config, err := clientconfig.FromBytes(data) + if err != nil { + return nil, err + } + + return talosclient.New( + ctx, + talosclient.WithConfig(config), + talosclient.WithCluster(clusterName), + ) +} + +func talosClientMaintenance(ctx context.Context, endpoint string) (*talosclient.Client, error) { + opts := talos.GetSocketOptions(endpoint) + + opts = append(opts, talosclient.WithTLSConfig(&tls.Config{ + InsecureSkipVerify: true, + }), talosclient.WithEndpoints(endpoint)) + + return talosclient.New(ctx, opts...) +} + +func talosNodeIPs(ctx context.Context, talosState state.State) ([]string, error) { + list, err := safe.StateListAll[*cluster.Member](ctx, talosState) + if err != nil { + return nil, err + } + + nodeIPs := make([]string, 0, list.Len()) + + for iter := list.Iterator(); iter.Next(); { + member := iter.Value() + + if len(member.TypedSpec().Addresses) == 0 { + return nil, fmt.Errorf("no addresses for member %q", member.Metadata().ID()) + } + + nodeIPs = append(nodeIPs, member.TypedSpec().Addresses[0].String()) + } + + return nodeIPs, nil +} diff --git a/cmd/omni-integration-test/pkg/tests/config_patch.go b/cmd/omni-integration-test/pkg/tests/config_patch.go new file mode 100644 index 00000000..13bfb54b --- /dev/null +++ b/cmd/omni-integration-test/pkg/tests/config_patch.go @@ -0,0 +1,437 @@ +// Copyright (c) 2024 Sidero Labs, Inc. +// +// Use of this software is governed by the Business Source License +// included in the LICENSE file. + +package tests + +import ( + "context" + "errors" + "fmt" + "io" + "path/filepath" + "strings" + "testing" + "time" + + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/rtestutils" + "github.com/cosi-project/runtime/pkg/state" + "github.com/dustin/go-humanize" + "github.com/siderolabs/gen/pair" + "github.com/siderolabs/go-retry/retry" + "github.com/siderolabs/talos/pkg/machinery/api/machine" + talosclient "github.com/siderolabs/talos/pkg/machinery/client" + "github.com/siderolabs/talos/pkg/machinery/resources/network" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/client" + "github.com/siderolabs/omni/client/pkg/omni/resources" + "github.com/siderolabs/omni/client/pkg/omni/resources/omni" +) + +const ( + dummyIfacePatchTemplate = `machine: + network: + interfaces: + - interface: %s + dummy: true` +) + +// AssertLargeImmediateConfigApplied tests that config patch that be applied immediately (without reboot) gets applied to all the nodes. +// +// Config patch is generated to be large to test the edge case. +// The patch is removed on finalize. +func AssertLargeImmediateConfigApplied(testCtx context.Context, cli *client.Client, clusterName string, talosAPIKeyPrepare TalosAPIKeyPrepareFunc) TestFunc { + return func(t *testing.T) { + ctx, cancel := context.WithTimeout(testCtx, 3*time.Minute) + defer cancel() + + require.NoError(t, talosAPIKeyPrepare(ctx, "default")) + + talosCli, err := talosClient(ctx, cli, clusterName) + require.NoError(t, err) + + nodeIPs, err := talosNodeIPs(ctx, talosCli.COSI) + require.NoError(t, err) + + st := cli.Omni().State() + + epochSeconds := time.Now().Unix() + id := fmt.Sprintf("000-config-patch-test-dummy-iface-%d", epochSeconds) + iface := fmt.Sprintf("dummy%d", epochSeconds) + configPatchYAML := fmt.Sprintf(dummyIfacePatchTemplate, iface) + + var sb strings.Builder + + for i := 0; i < 40_000; i++ { + sb.WriteString("################################################################################\n") + } + + sb.WriteString(configPatchYAML) + sb.WriteString("\n") + + sizeHumanReadable := humanize.Bytes(uint64(sb.Len())) + + require.LessOrEqual(t, sb.Len(), 4*1024*1024, "generated config patch is too large (%v), abort", sizeHumanReadable) + + t.Logf("creating large config patch with size: %v", sizeHumanReadable) + + configPatch := omni.NewConfigPatch(resources.DefaultNamespace, id, pair.MakePair(omni.LabelCluster, clusterName)) + + // apply large config patch that creates a dummy interface + createOrUpdate(ctx, t, st, configPatch, func(p *omni.ConfigPatch) error { + p.TypedSpec().Value.Data = sb.String() + + return nil + }) + + t.Logf("created large config patch with dummy interface: %q", iface) + + // assert that the patch is propagated to all clustermachines + cmIDs := rtestutils.ResourceIDs[*omni.ClusterMachineConfigPatches](ctx, t, st, state.WithLabelQuery(resource.LabelEqual(omni.LabelCluster, clusterName))) + + rtestutils.AssertResources(ctx, t, st, cmIDs, func(cm *omni.ClusterMachineConfigPatches, assertion *assert.Assertions) { + assertion.True(clusterMachinePatchesContainsString(cm, iface), "cluster machine %q patches don't contain string %q", cm.Metadata().ID(), iface) + }) + + linkStatus := network.NewLinkStatus(network.NamespaceName, "") + + containsDummyIface := func(node string) (bool, error) { + links, linksErr := talosCli.COSI.List(talosclient.WithNode(ctx, node), linkStatus.Metadata()) + if linksErr != nil { + return false, linksErr + } + + for _, res := range links.Items { + if res.Metadata().ID() == iface { + return true, nil + } + } + + return false, nil + } + + for _, node := range nodeIPs { + err = retry.Constant(3*time.Minute, retry.WithUnits(1*time.Second)).RetryWithContext(ctx, func(context.Context) error { + contains, containsErr := containsDummyIface(node) + if containsErr != nil { + return containsErr + } + + if !contains { + return retry.ExpectedError(fmt.Errorf("%q: dummy interface %q not found", node, iface)) + } + + return nil + }) + + assert.NoError(t, err) + } + + rtestutils.Destroy[*omni.ConfigPatch](ctx, t, st, []string{configPatch.Metadata().ID()}) + + t.Logf("destroyed config patch with dummy interface: %q", iface) + + // assert that the patch deletion is propagated to all clustermachines + rtestutils.AssertResources(ctx, t, st, cmIDs, func(cm *omni.ClusterMachineConfigPatches, assertion *assert.Assertions) { + assertion.False(clusterMachinePatchesContainsString(cm, iface), "cluster machine %q patches contain string %q", cm.Metadata().ID(), iface) + }) + } +} + +// AssertConfigPatchWithReboot tests that config patch that requires reboot gets applied to a single node, the node reboots and gets back. +// +// The patch is NOT removed. +func AssertConfigPatchWithReboot(testCtx context.Context, cli *client.Client, clusterName string, talosAPIKeyPrepare TalosAPIKeyPrepareFunc) TestFunc { + return func(t *testing.T) { + // just a single machine with a reboot, so it should take no more than 3 minutes + ctx, cancel := context.WithTimeout(testCtx, 3*time.Minute) + defer cancel() + + require.NoError(t, talosAPIKeyPrepare(ctx, "default")) + + talosCli, err := talosClient(ctx, cli, clusterName) + require.NoError(t, err) + + st := cli.Omni().State() + + nodeList, err := nodes(ctx, cli, clusterName, resource.LabelExists(omni.LabelWorkerRole)) + require.NoError(t, err) + require.Greater(t, len(nodeList), 0) + + node := nodeList[0] + + nodeID := node.machine.Metadata().ID() + + epochSeconds := time.Now().Unix() + id := fmt.Sprintf("000-config-patch-test-file-%d", epochSeconds) + file := fmt.Sprintf("/var/config-patch-test-file-%d.txt", epochSeconds) + configPatchYAML := fmt.Sprintf(`machine: + files: + - content: test + permissions: 0o666 + path: %s + op: create`, file) + configPatch := omni.NewConfigPatch(resources.DefaultNamespace, id, + pair.MakePair(omni.LabelCluster, clusterName), + pair.MakePair(omni.LabelClusterMachine, nodeID)) + + // apply config patch that creates a file + createOrUpdate(ctx, t, st, configPatch, func(p *omni.ConfigPatch) error { + p.TypedSpec().Value.Data = configPatchYAML + + return nil + }) + + t.Logf("created config patch with file: %q", file) + + // skip cleanup to avoid waiting for an additional reboot + + // assert that the patch is propagated to all clustermachines + rtestutils.AssertResources(ctx, t, st, []resource.ID{nodeID}, func(cm *omni.ClusterMachineConfigPatches, assertion *assert.Assertions) { + assertion.True(clusterMachinePatchesContainsString(cm, file), "cluster machine %q patches don't contain string %q", file, cm.Metadata().ID()) + }) + + // assert that machine set enters into reconfiguring phase + rtestutils.AssertResources(ctx, t, st, []resource.ID{omni.WorkersResourceID(clusterName)}, func(mss *omni.MachineSetStatus, assert *assert.Assertions) { + assert.Equal(specs.MachineSetPhase_Reconfiguring, mss.TypedSpec().Value.GetPhase()) + }) + + // assert that the file is created on the node + err = retry.Constant(3*time.Minute, retry.WithUnits(1*time.Second)).RetryWithContext(ctx, func(ctx context.Context) error { + exists, existsErr := talosFileExists(ctx, talosCli, node.talosIP, file) + if existsErr != nil { + if strings.Contains(existsErr.Error(), "not reachable") || status.Code(existsErr) == codes.Unavailable { + return retry.ExpectedError(existsErr) + } + + return existsErr + } + + if !exists { + return retry.ExpectedError(fmt.Errorf("%q: file %q is not found", node.talosIP, file)) + } + + t.Logf("file %q is found on node %q", file, node.talosIP) + + return nil + }) + + assert.NoError(t, err) + + // wait cluster machine status to be running + rtestutils.AssertResources(ctx, t, st, []resource.ID{nodeID}, func(cms *omni.ClusterMachineStatus, assertion *assert.Assertions) { + assertion.Equal(specs.ClusterMachineStatusSpec_RUNNING, cms.TypedSpec().Value.GetStage()) + }) + } +} + +// AssertConfigPatchWithInvalidConfig tests that a machine is able to recover from a patch with broken config when the broken patch is deleted. +func AssertConfigPatchWithInvalidConfig(testCtx context.Context, cli *client.Client, clusterName string, talosAPIKeyPrepare TalosAPIKeyPrepareFunc) TestFunc { + return func(t *testing.T) { + ctx, cancel := context.WithTimeout(testCtx, 8*time.Minute) + defer cancel() + + require.NoError(t, talosAPIKeyPrepare(ctx, "default")) + + st := cli.Omni().State() + + cmIDs := rtestutils.ResourceIDs[*omni.ClusterMachine](ctx, t, st, + state.WithLabelQuery( + resource.LabelEqual(omni.LabelCluster, clusterName), + resource.LabelExists(omni.LabelControlPlaneRole), + ), + ) + require.NotEmpty(t, cmIDs) + + cmID := cmIDs[0] + + epochSeconds := time.Now().Unix() + id := fmt.Sprintf("000-config-patch-test-file-broken-%d", epochSeconds) + file := fmt.Sprintf("/tmp/config-patch-test-file-broken-%d.txt", epochSeconds) + configPatchYAML := fmt.Sprintf(`machine: + files: + - content: test + permissions: 0o666 + path: %s + op: create`, file) + configPatch := omni.NewConfigPatch(resources.DefaultNamespace, id, + pair.MakePair(omni.LabelCluster, clusterName), + pair.MakePair(omni.LabelClusterMachine, cmID)) + + // apply broken config patch + createOrUpdate(ctx, t, st, configPatch, func(p *omni.ConfigPatch) error { + p.TypedSpec().Value.Data = configPatchYAML + + return nil + }) + + t.Logf("created config patch with file: %q", file) + + rtestutils.AssertResources(ctx, t, st, []resource.ID{cmID}, func(cms *omni.ClusterMachineStatus, assertion *assert.Assertions) { + assertion.Equal(specs.ClusterMachineStatusSpec_BOOTING, cms.TypedSpec().Value.GetStage()) + assertion.False(cms.TypedSpec().Value.GetReady()) + }) + + // TODO: wait for a Talos error about invalid config in the logs + + t.Logf("destroyed config patch with file: %q", file) + + // remove broken config patch + rtestutils.Destroy[*omni.ConfigPatch](ctx, t, st, []string{configPatch.Metadata().ID()}) + + // wait until k8s nodes come back + rtestutils.AssertResources(ctx, t, st, []resource.ID{cmID}, func(cms *omni.ClusterMachineStatus, assertion *assert.Assertions) { + assertion.Equal(specs.ClusterMachineStatusSpec_RUNNING, cms.TypedSpec().Value.GetStage()) + assertion.True(cms.TypedSpec().Value.GetReady()) + }) + } +} + +// AssertConfigPatchMachineSet applies config patch on a single machine set. +// +// The patch is removed at the end. +func AssertConfigPatchMachineSet(testCtx context.Context, cli *client.Client, clusterName string) TestFunc { + return func(t *testing.T) { + ctx, cancel := context.WithTimeout(testCtx, 30*time.Second) + defer cancel() + + st := cli.Omni().State() + + workerMachineSetName := omni.WorkersResourceID(clusterName) + controlPlaneMachineSetName := omni.ControlPlanesResourceID(clusterName) + + epochSeconds := time.Now().Unix() + id := fmt.Sprintf("000-config-patch-test-dummy-iface-%d", epochSeconds) + iface := fmt.Sprintf("dummy%d", epochSeconds) + configPatchYAML := fmt.Sprintf(dummyIfacePatchTemplate, iface) + + configPatch := omni.NewConfigPatch( + resources.DefaultNamespace, + id, + pair.MakePair(omni.LabelCluster, clusterName), + pair.MakePair(omni.LabelMachineSet, workerMachineSetName), + ) + + // apply config patch that creates a dummy interface + createOrUpdate(ctx, t, st, configPatch, func(p *omni.ConfigPatch) error { + p.TypedSpec().Value.Data = configPatchYAML + + return nil + }) + + // assert that the patch is propagated to all worker machine set ClusterMachines + workerIDs := rtestutils.ResourceIDs[*omni.ClusterMachineConfigPatches](ctx, t, st, state.WithLabelQuery(resource.LabelEqual(omni.LabelMachineSet, workerMachineSetName))) + + rtestutils.AssertResources(ctx, t, st, workerIDs, func(cm *omni.ClusterMachineConfigPatches, assertion *assert.Assertions) { + assertion.True(clusterMachinePatchesContainsString(cm, iface), "cluster machine %q patches don't contain string %q", cm.Metadata().ID(), iface) + }) + + // assert that the patch is *NOT* propagated to all controlplane machine set ClusterMachines + controlPlaneIDs := rtestutils.ResourceIDs[*omni.ClusterMachineConfigPatches](ctx, t, st, state.WithLabelQuery(resource.LabelEqual(omni.LabelMachineSet, controlPlaneMachineSetName))) + + rtestutils.AssertResources(ctx, t, st, controlPlaneIDs, func(cm *omni.ClusterMachineConfigPatches, assertion *assert.Assertions) { + assertion.False(clusterMachinePatchesContainsString(cm, iface), "cluster machine %q patches contain string %q", cm.Metadata().ID(), iface) + }) + + // cleanup + rtestutils.Destroy[*omni.ConfigPatch](ctx, t, st, []string{configPatch.Metadata().ID()}) + } +} + +// AssertConfigPatchSingleClusterMachine applies a config patch on a single cluster machine. +// +// The patch is removed at the end. +func AssertConfigPatchSingleClusterMachine(testCtx context.Context, cli *client.Client, clusterName string) TestFunc { + return func(t *testing.T) { + ctx, cancel := context.WithTimeout(testCtx, 30*time.Second) + defer cancel() + + st := cli.Omni().State() + + // get a single clustermachine + cmIDs := rtestutils.ResourceIDs[*omni.ClusterMachine](ctx, t, st, state.WithLabelQuery(resource.LabelEqual(omni.LabelCluster, clusterName))) + require.NotEmpty(t, cmIDs) + + cmID := cmIDs[0] + + epochSeconds := time.Now().Unix() + id := fmt.Sprintf("000-config-patch-test-dummy-iface-%d", epochSeconds) + iface := fmt.Sprintf("dummy%d", epochSeconds) + configPatchYAML := fmt.Sprintf(dummyIfacePatchTemplate, iface) + + configPatch := omni.NewConfigPatch(resources.DefaultNamespace, id, + pair.MakePair(omni.LabelCluster, clusterName), + pair.MakePair(omni.LabelClusterMachine, cmID)) + + // apply config patch + createOrUpdate(ctx, t, st, configPatch, func(p *omni.ConfigPatch) error { + p.TypedSpec().Value.Data = configPatchYAML + + return nil + }) + + // assert that the patch is propagated to the clustermachine + rtestutils.AssertResources(ctx, t, st, []resource.ID{cmID}, func(r *omni.ClusterMachineConfigPatches, assertion *assert.Assertions) { + assertion.True(clusterMachinePatchesContainsString(r, iface), "cluster machine %q patches don't contain string %q", r.Metadata().ID(), iface) + }) + + // assert that the patch is *NOT* propagated to other clustermachines of the cluster + otherCMIDs := cmIDs[1:] + + rtestutils.AssertResources(ctx, t, st, otherCMIDs, func(r *omni.ClusterMachineConfigPatches, assertion *assert.Assertions) { + assertion.False(clusterMachinePatchesContainsString(r, iface), "cluster machine %q patches contain string %q", r.Metadata().ID(), iface) + }) + + // cleanup + rtestutils.Destroy[*omni.ConfigPatch](ctx, t, st, []string{configPatch.Metadata().ID()}) + } +} + +func clusterMachinePatchesContainsString(clusterMachineConfigPatches *omni.ClusterMachineConfigPatches, str string) bool { + for _, patch := range clusterMachineConfigPatches.TypedSpec().Value.GetPatches() { + if strings.Contains(patch, str) { + return true + } + } + + return false +} + +func talosFileExists(ctx context.Context, talosClient *talosclient.Client, node, filePath string) (bool, error) { + resp, err := talosClient.MachineClient.List(talosclient.WithNode(ctx, node), &machine.ListRequest{Root: filePath}) + if err != nil { + return false, err + } + + for { + var fileInfo *machine.FileInfo + + fileInfo, err = resp.Recv() + if errors.Is(err, io.EOF) { + return false, nil + } + + if err != nil { + if strings.Contains(err.Error(), "no such file or directory") { + return false, nil + } + + return false, err + } + + if fileInfo.GetError() != "" { + return false, errors.New(fileInfo.GetError()) + } + + if fileInfo.Name == filepath.Clean(filePath) { + return true, nil + } + } +} diff --git a/cmd/omni-integration-test/pkg/tests/extensions.go b/cmd/omni-integration-test/pkg/tests/extensions.go new file mode 100644 index 00000000..22ed39d6 --- /dev/null +++ b/cmd/omni-integration-test/pkg/tests/extensions.go @@ -0,0 +1,109 @@ +// Copyright (c) 2024 Sidero Labs, Inc. +// +// Use of this software is governed by the Business Source License +// included in the LICENSE file. + +package tests + +import ( + "context" + "fmt" + "testing" + "time" + + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/safe" + "github.com/cosi-project/runtime/pkg/state" + "github.com/siderolabs/go-retry/retry" + talosclient "github.com/siderolabs/talos/pkg/machinery/client" + "github.com/siderolabs/talos/pkg/machinery/resources/runtime" + "github.com/stretchr/testify/require" + + "github.com/siderolabs/omni/client/pkg/client" + "github.com/siderolabs/omni/client/pkg/omni/resources" + "github.com/siderolabs/omni/client/pkg/omni/resources/omni" +) + +// HelloWorldServiceExtensionName is the name of the sample hello world extension used for testing. +const HelloWorldServiceExtensionName = "hello-world-service" + +// QemuGuestAgentExtensionName is the name of the qemu guest agent extension used for testing. +const QemuGuestAgentExtensionName = "qemu-guest-agent" + +// AssertExtensionIsPresent asserts that the extension "hello-world-service" is present on all machines in the cluster. +func AssertExtensionIsPresent(ctx context.Context, cli *client.Client, cluster, extension string) TestFunc { + return func(t *testing.T) { + clusterMachineList, err := safe.StateListAll[*omni.ClusterMachine](ctx, cli.Omni().State(), state.WithLabelQuery(resource.LabelEqual(omni.LabelCluster, cluster))) + require.NoError(t, err) + + machineIDs := make([]resource.ID, 0, clusterMachineList.Len()) + + clusterMachineList.ForEach(func(clusterMachine *omni.ClusterMachine) { + machineIDs = append(machineIDs, clusterMachine.Metadata().ID()) + }) + + checkExtensionWithRetries(ctx, t, cli, extension, machineIDs...) + } +} + +func checkExtensionWithRetries(ctx context.Context, t *testing.T, cli *client.Client, extension string, machineIDs ...resource.ID) { + for _, machineID := range machineIDs { + numErrs := 0 + + err := retry.Constant(3*time.Minute, retry.WithUnits(time.Second), retry.WithAttemptTimeout(3*time.Second)).RetryWithContext(ctx, func(ctx context.Context) error { + if err := checkExtension(ctx, cli, machineID, extension); err != nil { + numErrs++ + + if numErrs%10 == 0 { + t.Logf("failed to check extension %q on machine %q: %v", extension, machineID, err) + } + + return retry.ExpectedError(err) + } + + t.Logf("found extension %q on machine %q", extension, machineID) + + return nil + }) + require.NoError(t, err) + } +} + +func checkExtension(ctx context.Context, cli *client.Client, machineID resource.ID, extension string) error { + machineStatus, err := safe.StateGet[*omni.MachineStatus](ctx, cli.Omni().State(), omni.NewMachineStatus(resources.DefaultNamespace, machineID).Metadata()) + if err != nil { + return err + } + + var talosCli *talosclient.Client + + if machineStatus.TypedSpec().Value.GetMaintenance() { + if talosCli, err = talosClientMaintenance(ctx, machineStatus.TypedSpec().Value.GetManagementAddress()); err != nil { + return err + } + } else { + cluster, ok := machineStatus.Metadata().Labels().Get(omni.LabelCluster) + if !ok { + return fmt.Errorf("machine %q is not in maintenance mode but does not have a cluster label", machineStatus.Metadata().ID()) + } + + if talosCli, err = talosClient(ctx, cli, cluster); err != nil { + return err + } + } + + extensionStatusList, err := safe.StateListAll[*runtime.ExtensionStatus](ctx, talosCli.COSI) + if err != nil { + return err + } + + for iter := extensionStatusList.Iterator(); iter.Next(); { + extensionStatus := iter.Value() + + if extensionStatus.TypedSpec().Metadata.Name == extension { + return nil + } + } + + return fmt.Errorf("extension %q is not found on machine %q", extension, machineStatus.Metadata().ID()) +} diff --git a/cmd/omni-integration-test/pkg/tests/image.go b/cmd/omni-integration-test/pkg/tests/image.go new file mode 100644 index 00000000..54e351ca --- /dev/null +++ b/cmd/omni-integration-test/pkg/tests/image.go @@ -0,0 +1,88 @@ +// Copyright (c) 2024 Sidero Labs, Inc. +// +// Use of this software is governed by the Business Source License +// included in the LICENSE file. + +package tests + +import ( + "context" + "io" + "net/http" + "net/url" + "testing" + "time" + + "github.com/cosi-project/runtime/pkg/safe" + "github.com/siderolabs/talos/pkg/machinery/constants" + "github.com/stretchr/testify/require" + + "github.com/siderolabs/omni/client/api/omni/management" + "github.com/siderolabs/omni/client/pkg/client" + clientconsts "github.com/siderolabs/omni/client/pkg/constants" + "github.com/siderolabs/omni/client/pkg/omni/resources/omni" +) + +// AssertSomeImagesAreDownloadable verifies generated image download. +func AssertSomeImagesAreDownloadable(testCtx context.Context, client *client.Client, signer HTTPRequestSignerFunc, httpEndpoint string) TestFunc { + st := client.Omni().State() + + return func(t *testing.T) { + t.Parallel() + + media, err := safe.StateListAll[*omni.InstallationMedia](testCtx, st) + require.NoError(t, err) + + var images []*omni.InstallationMedia + + for it := media.Iterator(); it.Next(); { + spec := it.Value().TypedSpec().Value + + switch { + case spec.Profile == constants.BoardRPiGeneric: + fallthrough + case spec.Profile == "aws": + fallthrough + case spec.Profile == "iso": + images = append(images, it.Value()) + } + } + + require.Greater(t, len(images), 2) + + for _, image := range images { + t.Run(image.Metadata().ID(), func(t *testing.T) { + t.Parallel() + + ctx, cancel := context.WithTimeout(testCtx, time.Minute*5) + defer cancel() + + u, err := url.Parse(httpEndpoint) + require.NoError(t, err) + + schematic, err := client.Management().CreateSchematic(ctx, &management.CreateSchematicRequest{}) + require.NoError(t, err) + + u.Path, err = url.JoinPath(u.Path, "image", schematic.SchematicId, clientconsts.DefaultTalosVersion, image.Metadata().ID()) + require.NoError(t, err) + + req, err := http.NewRequestWithContext(ctx, http.MethodGet, u.String(), nil) + require.NoError(t, err) + + require.NoError(t, signer(ctx, req)) + + resp, err := http.DefaultClient.Do(req) + require.NoError(t, err) + + require.Equal(t, http.StatusOK, resp.StatusCode) + + n, err := io.Copy(io.Discard, resp.Body) + require.NoError(t, err) + + require.Greater(t, n, int64(1024*1024)) + + require.NoError(t, resp.Body.Close()) + }) + } + } +} diff --git a/cmd/omni-integration-test/pkg/tests/kubernetes.go b/cmd/omni-integration-test/pkg/tests/kubernetes.go new file mode 100644 index 00000000..b5ef9ca3 --- /dev/null +++ b/cmd/omni-integration-test/pkg/tests/kubernetes.go @@ -0,0 +1,520 @@ +// Copyright (c) 2024 Sidero Labs, Inc. +// +// Use of this software is governed by the Business Source License +// included in the LICENSE file. + +package tests + +import ( + "context" + "encoding/base64" + "errors" + "testing" + "time" + + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/rtestutils" + "github.com/cosi-project/runtime/pkg/safe" + "github.com/cosi-project/runtime/pkg/state" + "github.com/siderolabs/gen/xslices" + "github.com/siderolabs/go-pointer" + "github.com/siderolabs/go-retry/retry" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + appsv1 "k8s.io/api/apps/v1" + corev1 "k8s.io/api/core/v1" + kubeerrors "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/kubernetes" + "k8s.io/client-go/tools/clientcmd" + clientcmdapi "k8s.io/client-go/tools/clientcmd/api" + + managementpb "github.com/siderolabs/omni/client/api/omni/management" + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/client" + "github.com/siderolabs/omni/client/pkg/client/management" + "github.com/siderolabs/omni/client/pkg/constants" + "github.com/siderolabs/omni/client/pkg/omni/resources" + "github.com/siderolabs/omni/client/pkg/omni/resources/omni" +) + +// AssertKubernetesAPIAccessViaOmni verifies that cluster kubeconfig works. +func AssertKubernetesAPIAccessViaOmni(testCtx context.Context, rootClient *client.Client, clusterName string, assertAllNodesReady bool, timeout time.Duration) TestFunc { + return func(t *testing.T) { + ctx, cancel := context.WithTimeout(testCtx, timeout) + defer cancel() + + require := require.New(t) + assert := assert.New(t) + + client := getKubernetesClient(ctx, t, rootClient.Management(), clusterName) + + nodes, err := client.CoreV1().Nodes().List(ctx, metav1.ListOptions{}) + require.NoError(err) + + if assertAllNodesReady { + numMachines := len(rtestutils.ResourceIDs[*omni.ClusterMachine](ctx, t, rootClient.Omni().State(), state.WithLabelQuery(resource.LabelEqual(omni.LabelCluster, clusterName)))) + assert.Equal(numMachines, len(nodes.Items)) + } + + isNodeReady := func(node corev1.Node) bool { + for _, condition := range node.Status.Conditions { + if condition.Type == corev1.NodeReady { + return true + } + } + + return false + } + + for _, node := range nodes.Items { + ready := isNodeReady(node) + + if assertAllNodesReady { + assert.True(ready, "node %q is not ready", node.Name) + } + + if ready { + var ( + label string + ok bool + ) + + assert.NoError(retry.Constant(time.Second*30).RetryWithContext(ctx, func(ctx context.Context) error { + label, ok = node.Labels[nodeLabel] + if !ok { + var n *corev1.Node + + n, err = client.CoreV1().Nodes().Get(ctx, node.Name, metav1.GetOptions{}) + if err != nil { + return err + } + + node = *n + + return retry.ExpectedErrorf("the label %s is not set", nodeLabel) + } + + return nil + })) + + assert.True(ok) + assert.NotEmpty(label) + } + } + } +} + +// AssertKubernetesUpgradeFlow verifies Kubernetes upgrade flow. +// +// TODO: machine set locking should be in a separate test. +func AssertKubernetesUpgradeFlow(testCtx context.Context, st state.State, managementClient *management.Client, clusterName string, kubernetesVersion string) TestFunc { + return func(t *testing.T) { + ctx, cancel := context.WithTimeout(testCtx, 15*time.Minute) + defer cancel() + + rtestutils.AssertResources(ctx, t, st, []resource.ID{clusterName}, func(r *omni.KubernetesUpgradeStatus, assert *assert.Assertions) { + // there is an upgrade path + assert.Contains(r.TypedSpec().Value.UpgradeVersions, kubernetesVersion, resourceDetails(r)) + }) + + t.Logf("running pre-checks for upgrade of %q to %q", clusterName, kubernetesVersion) + + require.NoError(t, managementClient.WithCluster(clusterName).KubernetesUpgradePreChecks(ctx, kubernetesVersion)) + + t.Logf("upgrading cluster %q to %q", clusterName, kubernetesVersion) + + machineSetNodes, err := safe.StateListAll[*omni.MachineSetNode](ctx, st, state.WithLabelQuery( + resource.LabelEqual(omni.LabelMachineSet, omni.WorkersResourceID(clusterName)), + )) + require.NoError(t, err) + require.True(t, machineSetNodes.Len() > 0) + + // lock a machine in the machine set + _, err = safe.StateUpdateWithConflicts(ctx, st, machineSetNodes.Get(0).Metadata(), func(res *omni.MachineSetNode) error { + res.Metadata().Annotations().Set(omni.MachineLocked, "") + + return nil + }) + require.NoError(t, err) + + // trigger an upgrade + _, err = safe.StateUpdateWithConflicts(ctx, st, omni.NewCluster(resources.DefaultNamespace, clusterName).Metadata(), func(cluster *omni.Cluster) error { + cluster.TypedSpec().Value.KubernetesVersion = kubernetesVersion + + return nil + }) + require.NoError(t, err) + + // upgrade should start + rtestutils.AssertResources(ctx, t, st, []resource.ID{clusterName}, func(r *omni.KubernetesUpgradeStatus, assert *assert.Assertions) { + assert.Equal(specs.KubernetesUpgradeStatusSpec_Upgrading, r.TypedSpec().Value.Phase, resourceDetails(r)) + assert.NotEmpty(specs.KubernetesUpgradeStatusSpec_Upgrading, r.TypedSpec().Value.Step, resourceDetails(r)) + assert.NotEmpty(specs.KubernetesUpgradeStatusSpec_Upgrading, r.TypedSpec().Value.Status, resourceDetails(r)) + }) + + t.Log("waiting until upgrade reaches the locked machine") + + // upgrade should start + rtestutils.AssertResources(ctx, t, st, []resource.ID{clusterName}, func(r *omni.KubernetesUpgradeStatus, assert *assert.Assertions) { + assert.Equal(specs.KubernetesUpgradeStatusSpec_Upgrading, r.TypedSpec().Value.Phase, resourceDetails(r)) + assert.NotEmpty(specs.KubernetesUpgradeStatusSpec_Upgrading, r.TypedSpec().Value.Step, resourceDetails(r)) + assert.Contains(r.TypedSpec().Value.Status, "locked", resourceDetails(r)) + }) + + // lock a machine in the machine set + _, err = safe.StateUpdateWithConflicts(ctx, st, machineSetNodes.Get(0).Metadata(), func(res *omni.MachineSetNode) error { + res.Metadata().Annotations().Delete(omni.MachineLocked) + + return nil + }) + require.NoError(t, err) + + t.Log("upgrade is going") + + // upgrade should finish successfully + rtestutils.AssertResources(ctx, t, st, []resource.ID{clusterName}, func(r *omni.KubernetesUpgradeStatus, assert *assert.Assertions) { + assert.Equal(specs.KubernetesUpgradeStatusSpec_Done, r.TypedSpec().Value.Phase, resourceDetails(r)) + assert.Equal(kubernetesVersion, r.TypedSpec().Value.LastUpgradeVersion, resourceDetails(r)) + assert.Empty(r.TypedSpec().Value.Step, resourceDetails(r)) + }) + + // validate that all components are on the expected version + rtestutils.AssertResources(ctx, t, st, []resource.ID{clusterName}, func(r *omni.KubernetesStatus, assert *assert.Assertions) { + for _, node := range r.TypedSpec().Value.Nodes { + assert.Equal(kubernetesVersion, node.KubeletVersion, resourceDetails(r)) + assert.True(node.Ready, resourceDetails(r)) + } + + for _, nodePods := range r.TypedSpec().Value.StaticPods { + for _, pod := range nodePods.StaticPods { + assert.Equal(kubernetesVersion, pod.Version, resourceDetails(r)) + assert.True(pod.Ready, resourceDetails(r)) + } + } + }) + + KubernetesBootstrapManifestSync(ctx, managementClient, clusterName)(t) + } +} + +// KubernetesBootstrapManifestSync syncs kubernetes bootstrap manifests. +func KubernetesBootstrapManifestSync(testCtx context.Context, managementClient *management.Client, clusterName string) TestFunc { + return func(t *testing.T) { + ctx, cancel := context.WithTimeout(testCtx, 15*time.Minute) + defer cancel() + + t.Logf("running bootstrap manifest sync for %q", clusterName) + + syncHandler := func(result *managementpb.KubernetesSyncManifestResponse) error { + switch result.ResponseType { //nolint:exhaustive + case managementpb.KubernetesSyncManifestResponse_MANIFEST: + if result.Skipped { + return nil + } + + t.Logf("syncing manifest %q:\n%s\n", result.Path, result.Diff) + case managementpb.KubernetesSyncManifestResponse_ROLLOUT: + t.Logf("waiting for rolling out of %q", result.Path) + } + + return nil + } + + require.NoError(t, managementClient.WithCluster(clusterName).KubernetesSyncManifests(ctx, false, syncHandler)) + } +} + +// AssertKubernetesUpgradeIsRevertible verifies reverting a failed Kubernetes upgrade. +func AssertKubernetesUpgradeIsRevertible(testCtx context.Context, st state.State, clusterName string, currentKubernetesVersion string) TestFunc { + return func(t *testing.T) { + ctx, cancel := context.WithTimeout(testCtx, 5*time.Minute) + defer cancel() + + badKubernetesVersion := currentKubernetesVersion + "-bad" + + t.Logf("attempting an upgrade of cluster %q to %q", clusterName, badKubernetesVersion) + + // trigger an upgrade to a bad version + _, err := safe.StateUpdateWithConflicts(ctx, st, omni.NewCluster(resources.DefaultNamespace, clusterName).Metadata(), func(cluster *omni.Cluster) error { + cluster.Metadata().Annotations().Set(constants.DisableValidation, "") + + cluster.TypedSpec().Value.KubernetesVersion = badKubernetesVersion + + return nil + }) + require.NoError(t, err) + + // upgrade should start + rtestutils.AssertResources(ctx, t, st, []resource.ID{clusterName}, func(r *omni.KubernetesUpgradeStatus, assert *assert.Assertions) { + assert.Equal(specs.KubernetesUpgradeStatusSpec_Upgrading, r.TypedSpec().Value.Phase, resourceDetails(r)) + assert.NotEmpty(specs.KubernetesUpgradeStatusSpec_Upgrading, r.TypedSpec().Value.Step, resourceDetails(r)) + assert.NotEmpty(specs.KubernetesUpgradeStatusSpec_Upgrading, r.TypedSpec().Value.Status, resourceDetails(r)) + assert.Equal(currentKubernetesVersion, r.TypedSpec().Value.LastUpgradeVersion, resourceDetails(r)) + }) + + // verify that the upgrade took one API server down + rtestutils.AssertResources(ctx, t, st, []resource.ID{clusterName}, func(r *omni.KubernetesStatus, assert *assert.Assertions) { + var notReadyAPIServers int + + for _, nodePods := range r.TypedSpec().Value.StaticPods { + for _, pod := range nodePods.StaticPods { + if pod.App == "kube-apiserver" && !pod.Ready { + notReadyAPIServers++ + } + } + } + + assert.Equal(1, notReadyAPIServers) + }) + + t.Log("revert an upgrade") + + _, err = safe.StateUpdateWithConflicts(ctx, st, omni.NewCluster(resources.DefaultNamespace, clusterName).Metadata(), func(cluster *omni.Cluster) error { + cluster.TypedSpec().Value.KubernetesVersion = currentKubernetesVersion + + return nil + }) + require.NoError(t, err) + + // upgrade should be reverted + rtestutils.AssertResources(ctx, t, st, []resource.ID{clusterName}, func(r *omni.KubernetesUpgradeStatus, assert *assert.Assertions) { + assert.Equal(specs.KubernetesUpgradeStatusSpec_Done, r.TypedSpec().Value.Phase, resourceDetails(r)) + assert.Equal(currentKubernetesVersion, r.TypedSpec().Value.LastUpgradeVersion, resourceDetails(r)) + assert.Empty(r.TypedSpec().Value.Step, resourceDetails(r)) + }) + + // validate that all components are on the expected version + rtestutils.AssertResources(ctx, t, st, []resource.ID{clusterName}, func(r *omni.KubernetesStatus, assert *assert.Assertions) { + for _, node := range r.TypedSpec().Value.Nodes { + assert.Equal(currentKubernetesVersion, node.KubeletVersion, resourceDetails(r)) + assert.True(node.Ready, resourceDetails(r)) + } + + for _, nodePods := range r.TypedSpec().Value.StaticPods { + for _, pod := range nodePods.StaticPods { + assert.Equal(currentKubernetesVersion, pod.Version, resourceDetails(r)) + assert.True(pod.Ready, resourceDetails(r)) + } + } + }) + } +} + +// AssertKubernetesDeploymentIsCreated verifies that a test deployment either already exists or otherwise gets created. +func AssertKubernetesDeploymentIsCreated(testCtx context.Context, managementClient *management.Client, clusterName, ns, name string) TestFunc { + return func(t *testing.T) { + ctx, cancel := context.WithTimeout(testCtx, 120*time.Second) + defer cancel() + + kubeClient := getKubernetesClient(ctx, t, managementClient, clusterName) + + deployment := appsv1.Deployment{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + }, + Spec: appsv1.DeploymentSpec{ + Replicas: pointer.To(int32(1)), + Selector: &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "app": name, + }, + }, + Template: corev1.PodTemplateSpec{ + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{ + "app": name, + }, + }, + Spec: corev1.PodSpec{ + TerminationGracePeriodSeconds: pointer.To(int64(0)), + Containers: []corev1.Container{{ + Name: name, + Image: "busybox:1", + // sleep forever + Command: []string{ + "sh", + "-c", + "while true; do echo 'hello'; sleep 1; done", + }, + }}, + }, + }, + }, + } + + _, err := kubeClient.AppsV1().Deployments(ns).Create(ctx, &deployment, metav1.CreateOptions{}) + if !kubeerrors.IsAlreadyExists(err) { + require.NoError(t, err) + } + } +} + +// AssertKubernetesSecretIsCreated verifies that a test secret either already exists or otherwise gets created. +func AssertKubernetesSecretIsCreated(testCtx context.Context, managementClient *management.Client, clusterName, ns, name, testValue string) TestFunc { + return func(t *testing.T) { + ctx, cancel := context.WithTimeout(testCtx, 120*time.Second) + defer cancel() + + kubeClient := getKubernetesClient(ctx, t, managementClient, clusterName) + + valBase64 := base64.StdEncoding.EncodeToString([]byte(testValue)) + + secret := corev1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + }, + Data: map[string][]byte{ + "test-key": []byte(valBase64), + }, + } + + _, err := kubeClient.CoreV1().Secrets(ns).Create(ctx, &secret, metav1.CreateOptions{}) + require.NoError(t, err, "failed to create secret") + } +} + +// AssertKubernetesSecretHasValue verifies that a test secret has a specific value. +func AssertKubernetesSecretHasValue(testCtx context.Context, managementClient *management.Client, clusterName, ns, name, expectedValue string) TestFunc { + return func(t *testing.T) { + ctx, cancel := context.WithTimeout(testCtx, 120*time.Second) + defer cancel() + + kubeClient := getKubernetesClient(ctx, t, managementClient, clusterName) + + secret, err := kubeClient.CoreV1().Secrets(ns).Get(ctx, name, metav1.GetOptions{}) + require.NoError(t, err, "failed to get secret") + + actualValBase64, ok := secret.Data["test-key"] + require.True(t, ok, "secret does not have test-key") + + expectedValBase64 := base64.StdEncoding.EncodeToString([]byte(expectedValue)) + + assert.Equal(t, expectedValBase64, string(actualValBase64)) + } +} + +// AssertKubernetesNodesState asserts two things for the given new cluster name: +// 1. Omni cluster machines match exactly the Kubernetes nodes that are in Ready state +// 2. All the extra (stale) Kubernetes nodes are in NotReady state +// +// This assertion is useful to assert the expected nodes state when a cluster is created from an etcd backup. +func AssertKubernetesNodesState(ctx context.Context, rootClient *client.Client, newClusterName string) func(t *testing.T) { + return func(t *testing.T) { + identityList, err := safe.StateListAll[*omni.ClusterMachineIdentity](ctx, rootClient.Omni().State(), state.WithLabelQuery(resource.LabelEqual(omni.LabelCluster, newClusterName))) + require.NoError(t, err) + + expectedReadyNodeNames, err := safe.Map(identityList, func(cm *omni.ClusterMachineIdentity) (string, error) { + return cm.TypedSpec().Value.GetNodename(), nil + }) + require.NoError(t, err) + + expectedReadyNodeNameSet := xslices.ToSet(expectedReadyNodeNames) + + nodeIsReady := func(node corev1.Node) bool { + for _, condition := range node.Status.Conditions { + if condition.Type == corev1.NodeReady && condition.Status == corev1.ConditionTrue { + return true + } + } + + return false + } + + kubeClient := getKubernetesClient(ctx, t, rootClient.Management(), newClusterName) + + require.EventuallyWithT(t, func(collect *assert.CollectT) { + kubernetesNodes, listErr := kubeClient.CoreV1().Nodes().List(ctx, metav1.ListOptions{}) + require.NoError(collect, listErr) + + validNotReadyNodes := make([]string, 0, len(expectedReadyNodeNames)) + extraReadyNodes := make([]string, 0, len(expectedReadyNodeNames)) + + for _, kubernetesNode := range kubernetesNodes.Items { + ready := nodeIsReady(kubernetesNode) + _, valid := expectedReadyNodeNameSet[kubernetesNode.Name] + + if !valid && ready { + extraReadyNodes = append(extraReadyNodes, kubernetesNode.Name) + } else if valid && !ready { + validNotReadyNodes = append(validNotReadyNodes, kubernetesNode.Name) + } + } + + if !assert.Empty(collect, extraReadyNodes, "Kubernetes has extra Ready nodes") { + t.Logf("extra ready nodes: %q", extraReadyNodes) + } + + if !assert.Empty(collect, validNotReadyNodes, "Kubernetes has valid NotReady nodes") { + t.Logf("valid but not ready nodes: %q", validNotReadyNodes) + } + }, 2*time.Minute, 1*time.Second, "Kubernetes nodes should be in desired state") + } +} + +// AssertKubernetesDeploymentHasRunningPods verifies that a deployment has running pods. +func AssertKubernetesDeploymentHasRunningPods(ctx context.Context, managementClient *management.Client, clusterName, ns, name string) TestFunc { + return func(t *testing.T) { + deps := getKubernetesClient(ctx, t, managementClient, clusterName).AppsV1().Deployments(ns) + + // restart the deployment, in case the pod is scheduled on a NotReady node (a node that is no longer valid, which was restored from an etcd backup) + require.EventuallyWithT(t, func(collect *assert.CollectT) { + deployment, err := deps.Get(ctx, name, metav1.GetOptions{}) + if errors.Is(err, context.Canceled) || errors.Is(err, context.DeadlineExceeded) { + require.NoError(collect, err) + } + + if !assert.NoError(collect, err) { + t.Logf("failed to get deployment %q/%q: %q", ns, name, err) + + return + } + + if deployment.Spec.Template.ObjectMeta.Annotations == nil { + deployment.Spec.Template.ObjectMeta.Annotations = map[string]string{} + } + + deployment.Spec.Template.ObjectMeta.Annotations["kubectl.kubernetes.io/restartedAt"] = time.Now().Format(time.RFC3339) + + if _, err = deps.Update(ctx, deployment, metav1.UpdateOptions{}); !assert.NoError(collect, err) { + t.Logf("failed to update deployment %q/%q: %q", ns, name, err) + } + }, 2*time.Minute, 1*time.Second) + + // assert that deployment has a running (Ready) pod + require.EventuallyWithT(t, func(collect *assert.CollectT) { + deployment, err := deps.Get(ctx, name, metav1.GetOptions{}) + if errors.Is(err, context.Canceled) || errors.Is(err, context.DeadlineExceeded) { + require.NoError(collect, err) + } + + if !assert.NoError(collect, err) { + t.Logf("failed to get deployment %q/%q: %q", ns, name, err) + + return + } + + if !assert.Greater(collect, deployment.Status.ReadyReplicas, int32(0)) { + t.Logf("deployment %q/%q has no ready replicas", ns, name) + } + }, 2*time.Minute, 1*time.Second) + } +} + +func getKubernetesClient(ctx context.Context, t *testing.T, managementClient *management.Client, clusterName string) *kubernetes.Clientset { + // use service account kubeconfig to bypass oidc flow + kubeconfigBytes, err := managementClient.WithCluster(clusterName).Kubeconfig(ctx, + management.WithServiceAccount(24*time.Hour, "integration-test", constants.DefaultAccessGroup), + ) + require.NoError(t, err) + + kubeconfig, err := clientcmd.BuildConfigFromKubeconfigGetter("", func() (*clientcmdapi.Config, error) { + return clientcmd.Load(kubeconfigBytes) + }) + require.NoError(t, err) + + cli, err := kubernetes.NewForConfig(kubeconfig) + require.NoError(t, err) + + return cli +} diff --git a/cmd/omni-integration-test/pkg/tests/machines.go b/cmd/omni-integration-test/pkg/tests/machines.go new file mode 100644 index 00000000..3d9c46b3 --- /dev/null +++ b/cmd/omni-integration-test/pkg/tests/machines.go @@ -0,0 +1,270 @@ +// Copyright (c) 2024 Sidero Labs, Inc. +// +// Use of this software is governed by the Business Source License +// included in the LICENSE file. + +package tests + +import ( + "bufio" + "bytes" + "context" + "encoding/json" + "testing" + "time" + + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/rtestutils" + "github.com/cosi-project/runtime/pkg/state" + "github.com/siderolabs/go-retry/retry" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "golang.org/x/sync/errgroup" + + "github.com/siderolabs/omni/client/pkg/client/management" + "github.com/siderolabs/omni/client/pkg/omni/resources/omni" + "github.com/siderolabs/omni/client/pkg/omni/resources/siderolink" +) + +// AssertMachineStatus verifies that all machines have their MachineStatus populated. +func AssertMachineStatus(testCtx context.Context, st state.State, shouldMaintenance bool, clusterName string, expectedLabels map[string]string, deniedLabels []string) TestFunc { + return func(t *testing.T) { + ctx, cancel := context.WithTimeout(testCtx, 120*time.Second) + defer cancel() + + var ( + opts []state.ListOption + ids = rtestutils.ResourceIDs[*omni.Machine](ctx, t, st) + ) + + if clusterName != "" { + opts = append(opts, state.WithLabelQuery(resource.LabelEqual(omni.LabelCluster, clusterName))) + ids = rtestutils.ResourceIDs[*omni.MachineSetNode](ctx, t, st, opts...) + } + + rtestutils.AssertResources(ctx, t, st, + ids, + func(machineStatus *omni.MachineStatus, assert *assert.Assertions) { + spec := machineStatus.TypedSpec().Value + + assert.NotEmpty(spec.ManagementAddress, resourceDetails(machineStatus)) + assert.True(spec.Connected, resourceDetails(machineStatus)) + assert.Equal(shouldMaintenance, spec.Maintenance, resourceDetails(machineStatus)) + assert.Empty(spec.LastError, resourceDetails(machineStatus)) + + assert.NotEmpty(spec.TalosVersion, resourceDetails(machineStatus)) + + assert.NotEmpty(spec.GetNetwork().GetHostname(), resourceDetails(machineStatus)) + assert.NotEmpty(spec.GetNetwork().GetAddresses(), resourceDetails(machineStatus)) + assert.NotEmpty(spec.GetNetwork().GetDefaultGateways(), resourceDetails(machineStatus)) + assert.NotEmpty(spec.GetNetwork().GetNetworkLinks(), resourceDetails(machineStatus)) + + assert.NotEmpty(spec.GetHardware().GetBlockdevices(), resourceDetails(machineStatus)) + assert.NotEmpty(spec.GetHardware().GetMemoryModules(), resourceDetails(machineStatus)) + assert.NotEmpty(spec.GetHardware().GetProcessors(), resourceDetails(machineStatus)) + + for k, v := range expectedLabels { + lv, ok := machineStatus.Metadata().Labels().Get(k) + assert.True(ok, "label %q is not set: %s", k, resourceDetails(machineStatus)) + assert.Equal(v, lv, "label %q has unexpected value: %q != %q: %s", k, v, lv, resourceDetails(machineStatus)) + } + + for _, k := range deniedLabels { + _, ok := machineStatus.Metadata().Labels().Get(k) + assert.False(ok, "label %q is set: %s", k, resourceDetails(machineStatus)) + } + }, rtestutils.WithReportInterval(time.Second*5)) + } +} + +// AssertMachinesHaveLogs verifies that all machines have their kernel logs coming. +func AssertMachinesHaveLogs(testCtx context.Context, st state.State, managementClient *management.Client) TestFunc { + return func(t *testing.T) { + ctx, cancel := context.WithTimeout(testCtx, 20*time.Second) + defer cancel() + + machineIDs := rtestutils.ResourceIDs[*omni.Machine](ctx, t, st) + + eg, ctx := errgroup.WithContext(ctx) + + for _, machineID := range machineIDs { + eg.Go(func() error { + return retry.Constant(time.Second*20, retry.WithUnits(time.Second)).RetryWithContext(ctx, func(ctx context.Context) error { + logR, err := managementClient.LogsReader(ctx, machineID, true, -1) + if err != nil { + return retry.ExpectedError(err) + } + + bufR := bufio.NewReader(logR) + + line, err := bufR.ReadBytes('\n') + if err != nil { + return retry.ExpectedError(err) + } + + line = bytes.TrimSpace(line) + + if len(line) == 0 { + return retry.ExpectedErrorf("empty log line") + } + + var msg map[string]any + + return json.Unmarshal(line, &msg) + }) + }) + } + + assert.NoError(t, eg.Wait()) + } +} + +// AssertUnallocatedMachineDestroyFlow destroys a siderolink.Link resource and verifies that unallocated Machine is removed. +// +// Once the Machine is removed, it reboots the VM and asserts that machine re-registers itself. +func AssertUnallocatedMachineDestroyFlow(testCtx context.Context, st state.State, restartAMachineFunc RestartAMachineFunc) TestFunc { + return func(t *testing.T) { + if restartAMachineFunc == nil { + t.Skip("restartAMachineFunc is nil") + } + + ctx, cancel := context.WithTimeout(testCtx, 90*time.Second) + defer cancel() + + require := require.New(t) + + pickUnallocatedMachines(ctx, t, st, 1, func(machineIDs []string) { + rtestutils.Destroy[*siderolink.Link](ctx, t, st, machineIDs) + + rtestutils.AssertNoResource[*omni.Machine](ctx, t, st, machineIDs[0]) + rtestutils.AssertNoResource[*omni.MachineStatus](ctx, t, st, machineIDs[0]) + + // reboot a machine + require.NoError(restartAMachineFunc(ctx, machineIDs[0])) + + // machine should re-register and become available + rtestutils.AssertResources(ctx, t, st, machineIDs, func(machine *omni.MachineStatus, assert *assert.Assertions) { + _, ok := machine.Metadata().Labels().Get(omni.MachineStatusLabelAvailable) + assert.True(ok) + }) + }) + } +} + +// AssertForceRemoveWorkerNode destroys a Link for the worker node and verifies that allocated Machine is removed as part of a cluster. +// +// The VM is wiped & rebooted to bring it back as an available machine. +func AssertForceRemoveWorkerNode(testCtx context.Context, st state.State, clusterName string, freezeAMachineFunc FreezeAMachineFunc, wipeAMachineFunc WipeAMachineFunc) TestFunc { + return func(t *testing.T) { + ctx, cancel := context.WithTimeout(testCtx, 90*time.Second) + defer cancel() + + if wipeAMachineFunc == nil { + t.Skip("wipeAMachineFunc is nil") + } + + if freezeAMachineFunc == nil { + t.Skip("freezeAMachineFunc is nil") + } + + id := freezeMachine(ctx, t, st, clusterName, freezeAMachineFunc, omni.LabelWorkerRole) + + wipeMachine(ctx, t, st, id, wipeAMachineFunc) + } +} + +// AssertControlPlaneForceReplaceMachine freezes a control plane machine, scales controlplane by one, destroys and wipes frozen machine. +// +// If the controlplane had 3 machines, and one is frozen, the fourth machine can't be added until a etcd member +// is removed. +// The VM is wiped & rebooted to bring it back as an available machine. +func AssertControlPlaneForceReplaceMachine(testCtx context.Context, st state.State, clusterName string, options Options) TestFunc { + return func(t *testing.T) { + ctx, cancel := context.WithTimeout(testCtx, 90*time.Second) + defer cancel() + + if options.WipeAMachineFunc == nil { + t.Skip("wipeAMachineFunc is nil") + } + + if options.FreezeAMachineFunc == nil { + t.Skip("freezeAMachineFunc is nil") + } + + id := freezeMachine(ctx, t, st, clusterName, options.FreezeAMachineFunc, omni.LabelControlPlaneRole) + + pickUnallocatedMachines(ctx, t, st, 1, func(machineIDs []resource.ID) { + t.Logf("Adding machine '%s' to control plane", machineIDs[0]) + + bindMachine(ctx, t, st, bindMachineOptions{ + clusterName: clusterName, + role: omni.LabelControlPlaneRole, + machineID: machineIDs[0], + }) + + // assert that machines got allocated (label available is removed) + rtestutils.AssertResources(ctx, t, st, machineIDs, func(machineStatus *omni.MachineStatus, assert *assert.Assertions) { + assert.True(machineStatus.Metadata().Labels().Matches( + resource.LabelTerm{ + Key: omni.MachineStatusLabelAvailable, + Op: resource.LabelOpExists, + Invert: true, + }, + ), resourceDetails(machineStatus)) + }) + }) + + wipeMachine(ctx, t, st, id, options.WipeAMachineFunc) + } +} + +// freezeMachinesOfType freezes all machines of a given type. +func freezeMachinesOfType(ctx context.Context, t *testing.T, st state.State, clusterName string, freezeAMachineFunc FreezeAMachineFunc, machineType string) []string { + machineIDSet := rtestutils.ResourceIDs[*omni.MachineSetNode](ctx, t, st, state.WithLabelQuery( + resource.LabelEqual(omni.LabelCluster, clusterName), + resource.LabelExists(machineType), + )) + require.NotEmpty(t, machineIDSet) + + for _, machineID := range machineIDSet { + require.NoError(t, freezeAMachineFunc(ctx, machineID)) + } + + return machineIDSet +} + +// freezeMachine freezes the VM CPU, which simulates a hardware failure. +func freezeMachine(ctx context.Context, t *testing.T, st state.State, clusterName string, freezeAMachineFunc FreezeAMachineFunc, machineType string) string { + require := require.New(t) + + machineIDs := rtestutils.ResourceIDs[*omni.MachineSetNode](ctx, t, st, state.WithLabelQuery( + resource.LabelEqual(omni.LabelCluster, clusterName), + resource.LabelExists(machineType), + )) + + require.NotEmpty(machineIDs) + + // freeze a machine to simulate hardware failure + require.NoError(freezeAMachineFunc(ctx, machineIDs[0])) + + return machineIDs[0] +} + +func wipeMachine(ctx context.Context, t *testing.T, st state.State, id string, wipeAMachineFunc WipeAMachineFunc) { + // force delete a machine + rtestutils.Teardown[*siderolink.Link](ctx, t, st, []string{id}) + rtestutils.Destroy[*omni.MachineSetNode](ctx, t, st, []string{id}) + rtestutils.Destroy[*siderolink.Link](ctx, t, st, []string{id}) + + // now machine should be removed + rtestutils.AssertNoResource[*omni.Machine](ctx, t, st, id) + rtestutils.AssertNoResource[*omni.ClusterMachine](ctx, t, st, id) + + // wipe and reboot a machine + require.NoError(t, wipeAMachineFunc(ctx, id)) + + // machine should re-register + rtestutils.AssertResources(ctx, t, st, []string{id}, func(*omni.Machine, *assert.Assertions) {}) + + t.Logf("Wiped the machine '%s'", id) +} diff --git a/cmd/omni-integration-test/pkg/tests/omniconfig.go b/cmd/omni-integration-test/pkg/tests/omniconfig.go new file mode 100644 index 00000000..9f62f1e2 --- /dev/null +++ b/cmd/omni-integration-test/pkg/tests/omniconfig.go @@ -0,0 +1,30 @@ +// Copyright (c) 2024 Sidero Labs, Inc. +// +// Use of this software is governed by the Business Source License +// included in the LICENSE file. + +package tests + +import ( + "context" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/siderolabs/omni/client/pkg/client" +) + +// AssertOmniconfigDownload verifies getting Omni client configuration (omniconfig). +func AssertOmniconfigDownload(testCtx context.Context, client *client.Client) TestFunc { + return func(t *testing.T) { + req := require.New(t) + + ctx, cancel := context.WithTimeout(testCtx, 10*time.Second) + defer cancel() + + data, err := client.Management().Omniconfig(ctx) + req.NoError(err) + req.NotEmpty(data) + } +} diff --git a/cmd/omni-integration-test/pkg/tests/rolling_update.go b/cmd/omni-integration-test/pkg/tests/rolling_update.go new file mode 100644 index 00000000..3bb31aab --- /dev/null +++ b/cmd/omni-integration-test/pkg/tests/rolling_update.go @@ -0,0 +1,193 @@ +// Copyright (c) 2024 Sidero Labs, Inc. +// +// Use of this software is governed by the Business Source License +// included in the LICENSE file. + +package tests + +import ( + "context" + "fmt" + "sync" + "testing" + "time" + + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/rtestutils" + "github.com/cosi-project/runtime/pkg/safe" + "github.com/cosi-project/runtime/pkg/state" + "github.com/siderolabs/gen/pair" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/client" + "github.com/siderolabs/omni/client/pkg/omni/resources" + "github.com/siderolabs/omni/client/pkg/omni/resources/omni" +) + +// AssertWorkerNodesRollingConfigUpdate tests that config patch rollout parallelism is respected. +// Example: if there are five workers and the rollout parallelism is 2, then at most two workers should be rebooting at the same time, +// and it should be rolled out to all the workers. +func AssertWorkerNodesRollingConfigUpdate(testCtx context.Context, cli *client.Client, clusterName string, maxParallelism int) TestFunc { + return func(t *testing.T) { + require.GreaterOrEqual(t, maxParallelism, 2, "maxParallelism should be greater or equal to 2 for the test to be meaningful") + + st := cli.Omni().State() + workersResourceID := omni.WorkersResourceID(clusterName) + + clusterMachineList, err := safe.StateListAll[*omni.ClusterMachine](testCtx, st, state.WithLabelQuery(resource.LabelEqual(omni.LabelMachineSet, workersResourceID))) + require.NoError(t, err) + + require.Greater(t, clusterMachineList.Len(), maxParallelism, "number of machine in the worker machine set must to be greater than maxParallelism") + + timeoutDuration := time.Duration(clusterMachineList.Len()) * time.Minute + + ctx, cancel := context.WithTimeout(testCtx, timeoutDuration+1*time.Minute) + t.Cleanup(cancel) + + // update worker machine set to have rolling update with specified max parallelism + _, err = safe.StateUpdateWithConflicts[*omni.MachineSet](ctx, st, omni.NewMachineSet(resources.DefaultNamespace, workersResourceID).Metadata(), func(ms *omni.MachineSet) error { + ms.TypedSpec().Value.UpdateStrategy = specs.MachineSetSpec_Rolling + ms.TypedSpec().Value.UpdateStrategyConfig = &specs.MachineSetSpec_UpdateStrategyConfig{ + Rolling: &specs.MachineSetSpec_RollingUpdateStrategyConfig{ + MaxParallelism: uint32(maxParallelism), + }, + } + + return nil + }) + require.NoError(t, err) + + // create reboot-requiring config patch for the machine set + epochSeconds := time.Now().Unix() + machineSetPatch := omni.NewConfigPatch(resources.DefaultNamespace, + fmt.Sprintf("000-test-update-parallelism-%d", epochSeconds), + pair.MakePair(omni.LabelCluster, clusterName), + pair.MakePair(omni.LabelMachineSet, workersResourceID)) + + machineSetPatch.TypedSpec().Value.Data = fmt.Sprintf(`{"machine":{"env":{"%d":"test-val"}}}`, epochSeconds) + + require.NoError(t, st.Create(ctx, machineSetPatch)) + + // expect the machine set to go into the reconfiguring phase + rtestutils.AssertResource(ctx, t, st, omni.WorkersResourceID(clusterName), func(ms *omni.MachineSetStatus, assertion *assert.Assertions) { + assertion.Equal(specs.MachineSetPhase_Reconfiguring, ms.TypedSpec().Value.GetPhase()) + }) + + maxRebootingAtOnce := 0 + rebootedIDs := make(map[string]struct{}) + + require.EventuallyWithT(t, func(collect *assert.CollectT) { + machineStatusList, err := safe.StateListAll[*omni.ClusterMachineStatus](ctx, st, state.WithLabelQuery(resource.LabelEqual(omni.LabelMachineSet, workersResourceID))) + require.NoError(t, err) + + numRebooting := 0 + + machineStatusList.ForEach(func(machineStatus *omni.ClusterMachineStatus) { + stage := machineStatus.TypedSpec().Value.GetStage() + + assert.Equal(collect, specs.ClusterMachineStatusSpec_RUNNING, stage) + assert.Equal(collect, specs.ConfigApplyStatus_APPLIED, machineStatus.TypedSpec().Value.GetConfigApplyStatus()) + + if stage == specs.ClusterMachineStatusSpec_REBOOTING { + rebootedIDs[machineStatus.Metadata().ID()] = struct{}{} + numRebooting++ + } + }) + + if numRebooting > maxRebootingAtOnce { + maxRebootingAtOnce = numRebooting + } + }, timeoutDuration, 1*time.Second) + + assert.Len(t, rebootedIDs, clusterMachineList.Len(), "expected all the machines to be rebooted") + assert.Equal(t, maxParallelism, maxRebootingAtOnce, "expected a maximum of %d machines to be rebooting at the same time", maxParallelism) + + // wait for the machine set to go back into the running phase + rtestutils.AssertResource(ctx, t, st, omni.WorkersResourceID(clusterName), func(ms *omni.MachineSetStatus, assertion *assert.Assertions) { + assertion.Equal(specs.MachineSetPhase_Running, ms.TypedSpec().Value.GetPhase()) + }) + } +} + +// AssertWorkerNodesRollingScaleDown tests that config patch rollout parallelism is respected. +// Example: if there are five workers and the rollout parallelism is 2, then at most two workers should be rebooting at the same time, +// and it should be rolled out to all the workers. +func AssertWorkerNodesRollingScaleDown(testCtx context.Context, cli *client.Client, clusterName string, maxParallelism int) TestFunc { + return func(t *testing.T) { + st := cli.Omni().State() + workersResourceID := omni.WorkersResourceID(clusterName) + + machineSetNodeList, err := safe.StateListAll[*omni.MachineSetNode](testCtx, st, state.WithLabelQuery(resource.LabelEqual(omni.LabelMachineSet, workersResourceID))) + require.NoError(t, err) + + require.Greater(t, machineSetNodeList.Len(), maxParallelism, "number of machines in the worker machine set must to be greater than maxParallelism") + + timeoutDuration := time.Duration(machineSetNodeList.Len()) * time.Minute + + ctx, cancel := context.WithTimeout(testCtx, timeoutDuration+1*time.Minute) + t.Cleanup(cancel) + + // update worker machine set to have rolling update max parallelism of 2 + _, err = safe.StateUpdateWithConflicts[*omni.MachineSet](ctx, st, omni.NewMachineSet(resources.DefaultNamespace, workersResourceID).Metadata(), func(ms *omni.MachineSet) error { + ms.TypedSpec().Value.DeleteStrategy = specs.MachineSetSpec_Rolling + ms.TypedSpec().Value.DeleteStrategyConfig = &specs.MachineSetSpec_UpdateStrategyConfig{ + Rolling: &specs.MachineSetSpec_RollingUpdateStrategyConfig{ + MaxParallelism: uint32(maxParallelism), + }, + } + + return nil + }) + require.NoError(t, err) + + // remove all workers without blocking + var wg sync.WaitGroup + + t.Cleanup(wg.Wait) + + machineSetNodeList.ForEach(func(node *omni.MachineSetNode) { + wg.Add(1) + + go func() { + defer wg.Done() + + rtestutils.Destroy[*omni.MachineSetNode](ctx, t, st, []string{node.Metadata().ID()}) + }() + }) + + // expect the machine set to go into the ScalingDown phase + rtestutils.AssertResource(ctx, t, st, omni.WorkersResourceID(clusterName), func(ms *omni.MachineSetStatus, assertion *assert.Assertions) { + assertion.Equal(specs.MachineSetPhase_ScalingDown, ms.TypedSpec().Value.GetPhase()) + }) + + maxDestroyingAtOnce := 0 + destroyedIDs := make(map[string]struct{}) + + require.EventuallyWithT(t, func(collect *assert.CollectT) { + machineStatusList, err := safe.StateListAll[*omni.ClusterMachineStatus](ctx, st, state.WithLabelQuery(resource.LabelEqual(omni.LabelMachineSet, workersResourceID))) + require.NoError(t, err) + + numDeleting := 0 + + machineStatusList.ForEach(func(machineStatus *omni.ClusterMachineStatus) { + stage := machineStatus.TypedSpec().Value.GetStage() + + assert.Equal(collect, specs.ClusterMachineStatusSpec_DESTROYING, stage) + + if stage == specs.ClusterMachineStatusSpec_DESTROYING { + destroyedIDs[machineStatus.Metadata().ID()] = struct{}{} + numDeleting++ + } + }) + + if numDeleting > maxDestroyingAtOnce { + maxDestroyingAtOnce = numDeleting + } + }, timeoutDuration, 1*time.Second) + + assert.Len(t, destroyedIDs, machineSetNodeList.Len(), "expected all the machines to be destroyed") + assert.Equal(t, maxParallelism, maxDestroyingAtOnce, "expected a maximum of %d machines to be destroyed at the same time", maxParallelism) + } +} diff --git a/cmd/omni-integration-test/pkg/tests/siderolink.go b/cmd/omni-integration-test/pkg/tests/siderolink.go new file mode 100644 index 00000000..ec01f334 --- /dev/null +++ b/cmd/omni-integration-test/pkg/tests/siderolink.go @@ -0,0 +1,111 @@ +// Copyright (c) 2024 Sidero Labs, Inc. +// +// Use of this software is governed by the Business Source License +// included in the LICENSE file. + +package tests + +import ( + "context" + "testing" + "time" + + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/rtestutils" + "github.com/cosi-project/runtime/pkg/safe" + "github.com/cosi-project/runtime/pkg/state" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/siderolabs/omni/client/pkg/omni/resources" + "github.com/siderolabs/omni/client/pkg/omni/resources/omni" + "github.com/siderolabs/omni/client/pkg/omni/resources/siderolink" +) + +// AssertNumberOfLinks verifies that machines are discovered by the SideroLink. +func AssertNumberOfLinks(testCtx context.Context, st state.State, expectedLinks int) TestFunc { + return func(t *testing.T) { + ctx, cancel := context.WithTimeout(testCtx, 90*time.Second) + defer cancel() + + eventCh := make(chan safe.WrappedStateEvent[*siderolink.Link]) + + require.NoError(t, + safe.StateWatchKind( + ctx, + st, + resource.NewMetadata(resources.DefaultNamespace, siderolink.LinkType, "", resource.VersionUndefined), + eventCh, + state.WithBootstrapContents(true), + )) + + linksFound := 0 + + for linksFound < expectedLinks { + select { + case event := <-eventCh: + switch event.Type() { //nolint:exhaustive + case state.Created: + linksFound++ + case state.Destroyed: + linksFound-- + case state.Errored: + require.NoError(t, event.Error()) + } + + case <-ctx.Done(): + t.Fatal("timeout") + } + + t.Logf("links discovered: %d", linksFound) + } + } +} + +// AssertLinksConnected verifies that all SideroLink connections are operational. +func AssertLinksConnected(testCtx context.Context, st state.State) TestFunc { + return func(t *testing.T) { + ctx, cancel := context.WithTimeout(testCtx, 320*time.Second) + defer cancel() + + rtestutils.AssertAll(ctx, t, st, + func(link *siderolink.Link, assert *assert.Assertions) { + spec := link.TypedSpec().Value + + assert.True(spec.Connected) + + // the link counter for this link must be created + msl, err := safe.StateGet[*omni.MachineStatusLink](ctx, st, + omni.NewMachineStatusLink(resources.MetricsNamespace, link.Metadata().ID()).Metadata(), + ) + assert.NoError(err) + + if msl != nil { + // the link counter must have some bytes sent and received + assert.Greater(msl.TypedSpec().Value.GetSiderolinkCounter().GetBytesSent(), int64(0), resourceDetails(link)) + assert.Greater(msl.TypedSpec().Value.GetSiderolinkCounter().GetBytesReceived(), int64(0), resourceDetails(link)) + } + }) + } +} + +// AssertMachinesMatchLinks verifies that all SideroLink connections are discovered as Machines. +func AssertMachinesMatchLinks(testCtx context.Context, st state.State) TestFunc { + return func(t *testing.T) { + ctx, cancel := context.WithTimeout(testCtx, 10*time.Second) + defer cancel() + + rtestutils.AssertResources(ctx, t, st, + rtestutils.ResourceIDs[*siderolink.Link](ctx, t, st), + func(machine *omni.Machine, assert *assert.Assertions) { + spec := machine.TypedSpec().Value + + assert.NotEmpty(spec.ManagementAddress, resourceDetails(machine)) + assert.True(spec.Connected, resourceDetails(machine)) + + addressLabel, ok := machine.Metadata().Labels().Get(omni.MachineAddressLabel) + assert.True(ok, resourceDetails(machine)) + assert.Equal(spec.ManagementAddress, addressLabel, resourceDetails(machine)) + }) + } +} diff --git a/cmd/omni-integration-test/pkg/tests/talos.go b/cmd/omni-integration-test/pkg/tests/talos.go new file mode 100644 index 00000000..0cec79ab --- /dev/null +++ b/cmd/omni-integration-test/pkg/tests/talos.go @@ -0,0 +1,715 @@ +// Copyright (c) 2024 Sidero Labs, Inc. +// +// Use of this software is governed by the Business Source License +// included in the LICENSE file. + +package tests + +import ( + "context" + "fmt" + "strings" + "testing" + "time" + + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/rtestutils" + "github.com/cosi-project/runtime/pkg/safe" + "github.com/cosi-project/runtime/pkg/state" + "github.com/siderolabs/gen/maps" + "github.com/siderolabs/gen/xslices" + "github.com/siderolabs/go-retry/retry" + "github.com/siderolabs/talos/pkg/machinery/api/machine" + talosclient "github.com/siderolabs/talos/pkg/machinery/client" + clientconfig "github.com/siderolabs/talos/pkg/machinery/client/config" + "github.com/siderolabs/talos/pkg/machinery/resources/cluster" + "github.com/siderolabs/talos/pkg/machinery/resources/etcd" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "google.golang.org/grpc/backoff" + "google.golang.org/protobuf/types/known/emptypb" + + "github.com/siderolabs/omni/client/api/omni/management" + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/client" + "github.com/siderolabs/omni/client/pkg/constants" + "github.com/siderolabs/omni/client/pkg/omni/resources" + "github.com/siderolabs/omni/client/pkg/omni/resources/omni" +) + +// clearConnectionRefused clears cached gRPC 'connection refused' error from Talos controlplane apid instances. +// +// When some node is unavailable, gRPC "caches" the error for backoff.DefaultConfig.MaxDelay. +func clearConnectionRefused(ctx context.Context, t *testing.T, c *talosclient.Client, numControlplanes int, nodes ...string) { + ctx, cancel := context.WithTimeout(ctx, backoff.DefaultConfig.MaxDelay) + defer cancel() + + require.NoError(t, retry.Constant(backoff.DefaultConfig.MaxDelay, retry.WithUnits(time.Second)).Retry(func() error { + for i := 0; i < numControlplanes; i++ { + _, err := c.Version(talosclient.WithNodes(ctx, nodes...)) + if err == nil { + continue + } + + if strings.Contains(err.Error(), "connection refused") { + return retry.ExpectedError(err) + } + + return err + } + + return nil + })) +} + +// AssertTalosAPIAccessViaOmni verifies that both instance-wide and cluster-wide `talosconfig`s work with Omni Talos API proxy. +func AssertTalosAPIAccessViaOmni(testCtx context.Context, omniClient *client.Client, cluster string, talosAPIKeyPrepare TalosAPIKeyPrepareFunc) TestFunc { + return func(t *testing.T) { + ms, err := safe.ReaderListAll[*omni.MachineStatus]( + testCtx, + omniClient.Omni().State(), + state.WithLabelQuery(resource.LabelEqual(omni.LabelCluster, cluster)), + ) + require.NoError(t, err) + + cms, err := safe.StateListAll[*omni.ClusterMachineIdentity]( + testCtx, + omniClient.Omni().State(), + state.WithLabelQuery(resource.LabelEqual(omni.LabelCluster, cluster)), + ) + require.NoError(t, err) + + cpms, err := safe.StateListAll[*omni.ClusterMachine]( + testCtx, + omniClient.Omni().State(), + state.WithLabelQuery( + resource.LabelEqual(omni.LabelCluster, cluster), + resource.LabelExists(omni.LabelControlPlaneRole), + ), + ) + require.NoError(t, err) + + machineNames, err := safe.Map(ms, func(m *omni.MachineStatus) (string, error) { + return m.TypedSpec().Value.Network.Hostname, nil + }) + require.NoError(t, err) + + machineIPs, err := safe.Map(cms, func(m *omni.ClusterMachineIdentity) (string, error) { + return m.TypedSpec().Value.GetNodeIps()[0], nil + }) + require.NoError(t, err) + + assert.Equal(t, len(machineNames), len(machineIPs)) + + numControlPlanes := cpms.Len() + + assertTalosAPI := func(ctx context.Context, t *testing.T, c *talosclient.Client) { + clearConnectionRefused(ctx, t, c, numControlPlanes, machineIPs...) + + // WithNodes - using IPs + version, err := c.Version(talosclient.WithNodes(ctx, machineIPs...)) + assert.NoError(t, err) + assert.Len(t, version.Messages, len(machineNames)) + + assert.Equal(t, + xslices.ToSet(machineIPs), + xslices.ToSet(xslices.Map(version.Messages, func(m *machine.Version) string { + return m.GetMetadata().GetHostname() + })), + ) + + // WithNodes - using node names + version, err = c.Version(talosclient.WithNodes(ctx, machineNames...)) + assert.NoError(t, err) + assert.Len(t, version.Messages, len(machineNames)) + + assert.Equal(t, + xslices.ToSet(machineIPs), + xslices.ToSet(xslices.Map(version.Messages, func(m *machine.Version) string { + return m.GetMetadata().GetHostname() + })), + ) + + // WithNode - using IP + hostname, err := c.MachineClient.Hostname(talosclient.WithNode(ctx, machineIPs[0]), &emptypb.Empty{}) + assert.NoError(t, err) + assert.Equal(t, machineNames[0], hostname.Messages[0].Hostname) + assert.Empty(t, hostname.Messages[0].GetMetadata().GetHostname()) + + // WithNode - using node name + hostname, err = c.MachineClient.Hostname(talosclient.WithNode(ctx, machineNames[0]), &emptypb.Empty{}) + assert.NoError(t, err) + assert.Equal(t, machineNames[0], hostname.Messages[0].Hostname) + assert.Empty(t, hostname.Messages[0].GetMetadata().GetHostname()) + } + + t.Run("InstanceWideTalosconfig", func(t *testing.T) { + ctx, cancel := context.WithTimeout(testCtx, backoff.DefaultConfig.MaxDelay+10*time.Second) + t.Cleanup(cancel) + + data, err := omniClient.Management().Talosconfig(ctx) + require.NoError(t, err) + assert.NotEmpty(t, data) + + config, err := clientconfig.FromBytes(data) + require.NoError(t, err) + + require.NoError(t, talosAPIKeyPrepare(ctx, "default")) + + c, err := talosclient.New(ctx, talosclient.WithConfig(config), talosclient.WithCluster(cluster)) + require.NoError(t, err) + + t.Cleanup(func() { + require.NoError(t, c.Close()) + }) + + assertTalosAPI(ctx, t, c) + }) + + t.Run("ClusterWideTalosconfig", func(t *testing.T) { + ctx, cancel := context.WithTimeout(testCtx, backoff.DefaultConfig.MaxDelay+10*time.Second) + t.Cleanup(cancel) + + data, err := omniClient.Management().WithCluster(cluster).Talosconfig(ctx) + require.NoError(t, err) + assert.NotEmpty(t, data) + + config, err := clientconfig.FromBytes(data) + require.NoError(t, err) + + require.NoError(t, talosAPIKeyPrepare(ctx, fmt.Sprintf("%s-%s", "default", cluster))) + + c, err := talosclient.New(ctx, talosclient.WithConfig(config)) + require.NoError(t, err) + + t.Cleanup(func() { + require.NoError(t, c.Close()) + }) + + assertTalosAPI(ctx, t, c) + }) + } +} + +// AssertEtcdMembershipMatchesOmniResources checks that etcd members are in sync with the Omni MachineStatus information. +func AssertEtcdMembershipMatchesOmniResources(testCtx context.Context, client *client.Client, cluster string, talosAPIKeyPrepare TalosAPIKeyPrepareFunc) TestFunc { + return func(t *testing.T) { + require := require.New(t) + assert := assert.New(t) + + ctx, cancel := context.WithTimeout(testCtx, 90*time.Second) + defer cancel() + + require.NoError(talosAPIKeyPrepare(ctx, "default")) + + data, err := client.Management().Talosconfig(ctx) + require.NoError(err) + assert.NotEmpty(data) + + config, err := clientconfig.FromBytes(data) + require.NoError(err) + + c, err := talosclient.New(ctx, talosclient.WithConfig(config), talosclient.WithCluster(cluster)) + require.NoError(err) + + t.Cleanup(func() { + require.NoError(c.Close()) + }) + + machineIDs := rtestutils.ResourceIDs[*omni.ClusterMachine](ctx, t, client.Omni().State(), + state.WithLabelQuery( + resource.LabelEqual(omni.LabelCluster, cluster), + resource.LabelExists(omni.LabelControlPlaneRole), + ), + ) + + clearConnectionRefused(ctx, t, c, len(machineIDs), machineIDs...) + + resp, err := c.EtcdMemberList(ctx, &machine.EtcdMemberListRequest{}) + require.NoError(err) + + err = retry.Constant(time.Minute*2, retry.WithUnits(time.Second)).Retry(func() error { + clusterMachines := map[string]any{} + + for _, machineID := range machineIDs { + var machineStatus *omni.MachineStatus + + machineStatus, err = safe.StateGet[*omni.MachineStatus](ctx, client.Omni().State(), omni.NewMachineStatus(resources.DefaultNamespace, machineID).Metadata()) + if err != nil { + return retry.ExpectedError(err) + } + + clusterMachines[machineStatus.TypedSpec().Value.Network.Hostname] = struct{}{} + } + + for _, m := range resp.Messages { + if len(clusterMachines) != len(m.Members) { + memberIDs := xslices.Map(m.Members, func(m *machine.EtcdMember) string { return etcd.FormatMemberID(m.Id) }) + + return retry.ExpectedErrorf("the count of members doesn't match the count of machines, expected %d, got: %d, members list: %s", len(clusterMachines), len(m.Members), memberIDs) + } + + for _, member := range m.Members { + _, ok := clusterMachines[member.Hostname] + + if !ok { + return retry.ExpectedErrorf("found etcd member which doesn't have associated machine status") + } + } + } + + return nil + }) + + require.NoError(err) + } +} + +// AssertTalosMembersMatchOmni checks that Talos discovery service members are in sync with the machines attached to the cluster. +func AssertTalosMembersMatchOmni(testCtx context.Context, client *client.Client, clusterName string, talosAPIKeyPrepare TalosAPIKeyPrepareFunc) TestFunc { + return func(t *testing.T) { + require := require.New(t) + + ctx, cancel := context.WithTimeout(testCtx, backoff.DefaultConfig.BaseDelay+120*time.Second) + defer cancel() + + require.NoError(talosAPIKeyPrepare(ctx, "default")) + + data, err := client.Management().Talosconfig(ctx) + require.NoError(err) + + config, err := clientconfig.FromBytes(data) + require.NoError(err) + + c, err := talosclient.New(ctx, talosclient.WithConfig(config), talosclient.WithCluster(clusterName)) + require.NoError(err) + + t.Cleanup(func() { + require.NoError(c.Close()) + }) + + machineIDs := rtestutils.ResourceIDs[*omni.ClusterMachine](ctx, t, client.Omni().State(), + state.WithLabelQuery( + resource.LabelEqual(omni.LabelCluster, clusterName), + ), + ) + + // map of Nodenames to Node Identities + clusterMachines := map[string]string{} + + for _, machineID := range machineIDs { + var clusterMachineIdentity *omni.ClusterMachineIdentity + + clusterMachineIdentity, err = safe.StateGet[*omni.ClusterMachineIdentity](ctx, client.Omni().State(), + omni.NewClusterMachineIdentity(resources.DefaultNamespace, machineID).Metadata(), + ) + + require.NoError(err) + + machineStatus := clusterMachineIdentity.TypedSpec().Value + + clusterMachines[machineStatus.Nodename] = machineStatus.NodeIdentity + } + + // check that every Omni machine is in Talos as a member + rtestutils.AssertResources(ctx, t, c.COSI, maps.Keys(clusterMachines), func(member *cluster.Member, asrt *assert.Assertions) { + asrt.Equal(clusterMachines[member.Metadata().ID()], member.TypedSpec().NodeID, resourceDetails(member)) + }) + + // check that length of resources matches expectations (i.e. there are no extra members) + rtestutils.AssertLength[*cluster.Member](ctx, t, c.COSI, len(clusterMachines)) + } +} + +// AssertTalosVersion verifies Talos version on the nodes. +func AssertTalosVersion(testCtx context.Context, client *client.Client, clusterName, expectedVersion string, talosAPIKeyPrepare TalosAPIKeyPrepareFunc) TestFunc { + return func(t *testing.T) { + require := require.New(t) + + ctx, cancel := context.WithTimeout(testCtx, backoff.DefaultConfig.BaseDelay+90*time.Second) + defer cancel() + + machineIDs := rtestutils.ResourceIDs[*omni.ClusterMachine](ctx, t, client.Omni().State(), state.WithLabelQuery(resource.LabelEqual(omni.LabelCluster, clusterName))) + + cms, err := safe.StateListAll[*omni.ClusterMachineIdentity]( + testCtx, + client.Omni().State(), + state.WithLabelQuery(resource.LabelEqual(omni.LabelCluster, clusterName)), + ) + require.NoError(err) + + machineIPs, err := safe.Map(cms, func(m *omni.ClusterMachineIdentity) (string, error) { + return m.TypedSpec().Value.GetNodeIps()[0], nil + }) + require.NoError(err) + + // assert using Omni MachineStatus resource + rtestutils.AssertResources(ctx, t, client.Omni().State(), machineIDs, func(r *omni.MachineStatus, asrt *assert.Assertions) { + asrt.Equal(expectedVersion, strings.TrimLeft(r.TypedSpec().Value.TalosVersion, "v"), resourceDetails(r)) + }) + + // assert issuing Talos API query to each machine + require.NoError(talosAPIKeyPrepare(ctx, fmt.Sprintf("%s-%s", "default", clusterName))) + + data, err := client.Management().Talosconfig(ctx) + require.NoError(err) + require.NotEmpty(data) + + data, err = client.Management().WithCluster(clusterName).Talosconfig(ctx) + require.NoError(err) + require.NotEmpty(data) + + config, err := clientconfig.FromBytes(data) + require.NoError(err) + + c, err := talosclient.New(ctx, talosclient.WithConfig(config), talosclient.WithCluster(clusterName)) + require.NoError(err) + + t.Cleanup(func() { + require.NoError(c.Close()) + }) + + clearConnectionRefused(ctx, t, c, len(machineIPs), machineIPs...) + + resp, err := c.Version(talosclient.WithNodes(ctx, machineIPs...)) + require.NoError(err) + + for _, m := range resp.Messages { + require.Equal("v"+expectedVersion, m.Version.Tag) + } + + // assert using Talos upgrade controller status + rtestutils.AssertResources(ctx, t, client.Omni().State(), []resource.ID{clusterName}, func(r *omni.TalosUpgradeStatus, asrt *assert.Assertions) { + asrt.Equal(specs.TalosUpgradeStatusSpec_Done, r.TypedSpec().Value.Phase, resourceDetails(r)) + asrt.Equal(expectedVersion, r.TypedSpec().Value.LastUpgradeVersion, resourceDetails(r)) + }) + } +} + +// AssertTalosUpgradeFlow verifies Talos upgrade flow to the new Talos version. +func AssertTalosUpgradeFlow(testCtx context.Context, st state.State, clusterName, newTalosVersion string) TestFunc { + return func(t *testing.T) { + ctx, cancel := context.WithTimeout(testCtx, 15*time.Minute) + defer cancel() + + // assert next version is in the list of upgrade candidate version + rtestutils.AssertResources(ctx, t, st, []resource.ID{clusterName}, func(r *omni.TalosUpgradeStatus, asrt *assert.Assertions) { + asrt.Contains(r.TypedSpec().Value.UpgradeVersions, newTalosVersion, resourceDetails(r)) + }) + + t.Logf("upgrading cluster %q to %q", clusterName, newTalosVersion) + + // trigger an upgrade + _, err := safe.StateUpdateWithConflicts(ctx, st, omni.NewCluster(resources.DefaultNamespace, clusterName).Metadata(), func(cluster *omni.Cluster) error { + cluster.TypedSpec().Value.TalosVersion = newTalosVersion + + return nil + }) + require.NoError(t, err) + + // upgrade should start + rtestutils.AssertResources(ctx, t, st, []resource.ID{clusterName}, func(r *omni.TalosUpgradeStatus, assert *assert.Assertions) { + assert.Equal(specs.TalosUpgradeStatusSpec_Upgrading, r.TypedSpec().Value.Phase, resourceDetails(r)) + assert.NotEmpty(specs.TalosUpgradeStatusSpec_Upgrading, r.TypedSpec().Value.Step, resourceDetails(r)) + assert.NotEmpty(specs.TalosUpgradeStatusSpec_Upgrading, r.TypedSpec().Value.Status, resourceDetails(r)) + }) + + t.Log("upgrade is going") + + // upgrade should finish successfully + rtestutils.AssertResources(ctx, t, st, []resource.ID{clusterName}, func(r *omni.TalosUpgradeStatus, assert *assert.Assertions) { + assert.Equal(specs.TalosUpgradeStatusSpec_Done, r.TypedSpec().Value.Phase, resourceDetails(r)) + assert.Equal(newTalosVersion, r.TypedSpec().Value.LastUpgradeVersion, resourceDetails(r)) + assert.Empty(r.TypedSpec().Value.Step, resourceDetails(r)) + }) + } +} + +// AssertTalosSchematicUpdateFlow verifies Talos schematic update flow. +func AssertTalosSchematicUpdateFlow(testCtx context.Context, client *client.Client, clusterName string) TestFunc { + return func(t *testing.T) { + ctx, cancel := context.WithTimeout(testCtx, 15*time.Minute) + defer cancel() + + resp, err := client.Management().CreateSchematic(ctx, &management.CreateSchematicRequest{ + Extensions: []string{ + "siderolabs/hello-world-service", + "siderolabs/qemu-guest-agent", + }, + }) + + require.NoError(t, err) + + t.Logf("upgrading cluster schematic %q to %q", clusterName, resp.SchematicId) + res := omni.NewSchematicConfiguration(resources.DefaultNamespace, clusterName) + res.Metadata().Labels().Set(omni.LabelCluster, clusterName) + + // trigger an update by creating the SchematicConfiguration resource + res.TypedSpec().Value.SchematicId = resp.SchematicId + res.TypedSpec().Value.Target = specs.SchematicConfigurationSpec_Cluster + + err = client.Omni().State().Create(ctx, res) + require.NoError(t, err) + + // upgrade should start + rtestutils.AssertResources(ctx, t, client.Omni().State(), []resource.ID{clusterName}, func(r *omni.TalosUpgradeStatus, assert *assert.Assertions) { + assert.Equal(specs.TalosUpgradeStatusSpec_Upgrading, r.TypedSpec().Value.Phase, resourceDetails(r)) + assert.NotEmpty(specs.TalosUpgradeStatusSpec_Upgrading, r.TypedSpec().Value.Step, resourceDetails(r)) + assert.NotEmpty(specs.TalosUpgradeStatusSpec_Upgrading, r.TypedSpec().Value.Status, resourceDetails(r)) + }) + + t.Log("upgrade is going") + + // upgrade should finish successfully + rtestutils.AssertResources(ctx, t, client.Omni().State(), []resource.ID{clusterName}, func(r *omni.TalosUpgradeStatus, assert *assert.Assertions) { + assert.Equal(specs.TalosUpgradeStatusSpec_Done, r.TypedSpec().Value.Phase, resourceDetails(r)) + assert.Empty(r.TypedSpec().Value.Step, resourceDetails(r)) + }) + } +} + +// AssertTalosUpgradeIsRevertible tries to upgrade to invalid Talos version, and verifies that upgrade starts, fails, and can be reverted. +func AssertTalosUpgradeIsRevertible(testCtx context.Context, st state.State, clusterName, currentTalosVersion string) TestFunc { + return func(t *testing.T) { + ctx, cancel := context.WithTimeout(testCtx, 15*time.Minute) + defer cancel() + + badTalosVersion := currentTalosVersion + "-bad" + + t.Logf("attempting an upgrade of cluster %q to %q", clusterName, badTalosVersion) + + // trigger an upgrade to a bad version + _, err := safe.StateUpdateWithConflicts(ctx, st, omni.NewCluster(resources.DefaultNamespace, clusterName).Metadata(), func(cluster *omni.Cluster) error { + cluster.Metadata().Annotations().Set(constants.DisableValidation, "") + + cluster.TypedSpec().Value.TalosVersion = badTalosVersion + + return nil + }) + require.NoError(t, err) + + // upgrade should start + rtestutils.AssertResources(ctx, t, st, []resource.ID{clusterName}, func(r *omni.TalosUpgradeStatus, assert *assert.Assertions) { + assert.Equal(specs.TalosUpgradeStatusSpec_Upgrading, r.TypedSpec().Value.Phase, resourceDetails(r)) + assert.NotEmpty(r.TypedSpec().Value.Step, resourceDetails(r)) + assert.NotEmpty(r.TypedSpec().Value.Status, resourceDetails(r)) + assert.Equal(currentTalosVersion, r.TypedSpec().Value.LastUpgradeVersion, resourceDetails(r)) + }) + + t.Log("revert an upgrade") + + _, err = safe.StateUpdateWithConflicts(ctx, st, omni.NewCluster(resources.DefaultNamespace, clusterName).Metadata(), func(cluster *omni.Cluster) error { + cluster.TypedSpec().Value.TalosVersion = currentTalosVersion + + return nil + }) + require.NoError(t, err) + + // upgrade should be reverted + rtestutils.AssertResources(ctx, t, st, []resource.ID{clusterName}, func(r *omni.TalosUpgradeStatus, assert *assert.Assertions) { + assert.Equal(specs.TalosUpgradeStatusSpec_Done, r.TypedSpec().Value.Phase, resourceDetails(r)) + assert.Equal(currentTalosVersion, r.TypedSpec().Value.LastUpgradeVersion, resourceDetails(r)) + assert.Empty(r.TypedSpec().Value.Step, resourceDetails(r)) + }) + } +} + +// AssertTalosUpgradeIsCancelable tries to upgrade Talos version, and verifies that upgrade starts on one of the nodes and immediately reverts it back. +func AssertTalosUpgradeIsCancelable(testCtx context.Context, st state.State, clusterName, currentTalosVersion, newTalosVersion string) TestFunc { + return func(t *testing.T) { + ctx, cancel := context.WithTimeout(testCtx, 15*time.Minute) + defer cancel() + + t.Logf("apply upgrade to %s", newTalosVersion) + + _, err := safe.StateUpdateWithConflicts(ctx, st, omni.NewCluster(resources.DefaultNamespace, clusterName).Metadata(), func(cluster *omni.Cluster) error { + cluster.TypedSpec().Value.TalosVersion = newTalosVersion + + return nil + }) + require.NoError(t, err) + + events := make(chan state.Event) + + require.NoError(t, st.WatchKind(ctx, omni.NewClusterMachineStatus(resources.DefaultNamespace, "").Metadata(), events), + state.WithLabelQuery(resource.LabelEqual(omni.LabelCluster, clusterName)), + ) + + ids := []string{} + + // wait until any of the machines' state changes to not running + outer: + for { + select { + case <-ctx.Done(): + require.NoError(t, ctx.Err()) + case ev := <-events: + //nolint:exhaustive + switch ev.Type { + case state.Errored: + require.NoError(t, ev.Error) + case state.Updated, + state.Created: + res := ev.Resource.(*omni.ClusterMachineStatus) //nolint:forcetypeassert,errcheck + + if res.TypedSpec().Value.Stage != specs.ClusterMachineStatusSpec_RUNNING { + var cmtv *omni.ClusterMachineTalosVersion + + cmtv, err = safe.ReaderGet[*omni.ClusterMachineTalosVersion](ctx, st, omni.NewClusterMachineTalosVersion( + resources.DefaultNamespace, + res.Metadata().ID(), + ).Metadata()) + + // no information about the Talos version for the machine, continue looking + if state.IsNotFoundError(err) { + continue + } + + require.NoError(t, err) + + // this machine is not running, but it wasn't updated, continue looking + if cmtv.TypedSpec().Value.TalosVersion != newTalosVersion { + continue + } + + ids = append(ids, res.Metadata().ID()) + + break outer + } + } + } + } + + // revert the update + _, err = safe.StateUpdateWithConflicts(ctx, st, omni.NewCluster(resources.DefaultNamespace, clusterName).Metadata(), func(cluster *omni.Cluster) error { + cluster.TypedSpec().Value.TalosVersion = currentTalosVersion + + return nil + }) + require.NoError(t, err) + + // wait until the upgraded machine reports the new version + rtestutils.AssertResources(ctx, t, st, ids, func(r *omni.MachineStatus, assert *assert.Assertions) { + assert.Equal(newTalosVersion, strings.TrimLeft(r.TypedSpec().Value.TalosVersion, "v"), resourceDetails(r)) + }) + + rtestutils.AssertResources(ctx, t, st, ids, func(r *omni.ClusterMachineStatus, assert *assert.Assertions) { + assert.Equal(specs.ClusterMachineStatusSpec_RUNNING, r.TypedSpec().Value.Stage, resourceDetails(r)) + }) + + // the upgraded machine version should be reverted back + rtestutils.AssertResources(ctx, t, st, ids, func(r *omni.MachineStatus, assert *assert.Assertions) { + assert.Equal(currentTalosVersion, strings.TrimLeft(r.TypedSpec().Value.TalosVersion, "v"), resourceDetails(r)) + }) + } +} + +// AssertMachineShouldBeUpgradedInMaintenanceMode verifies machine upgrade in maintenance mode. +func AssertMachineShouldBeUpgradedInMaintenanceMode( + testCtx context.Context, + rootClient *client.Client, + clusterName, kubernetesVersion, talosVersion1, talosVersion2 string, + talosAPIKeyPrepare TalosAPIKeyPrepareFunc, +) TestFunc { + return func(t *testing.T) { + ctx, cancel := context.WithTimeout(testCtx, 900*time.Second) + defer cancel() + + require := require.New(t) + + st := rootClient.Omni().State() + + var allocatedMachineIDs []resource.ID + + t.Logf("creating a cluster on version %s", talosVersion1) + + pickUnallocatedMachines(ctx, t, st, 1, func(machineIDs []resource.ID) { + allocatedMachineIDs = machineIDs + + cluster := omni.NewCluster(resources.DefaultNamespace, clusterName) + cluster.TypedSpec().Value.TalosVersion = talosVersion1 + cluster.TypedSpec().Value.KubernetesVersion = kubernetesVersion + + require.NoError(st.Create(ctx, cluster)) + + t.Logf("Adding machine '%s' to control plane (cluster %q, version %s)", machineIDs[0], clusterName, talosVersion2) + bindMachine(ctx, t, st, bindMachineOptions{ + clusterName: clusterName, + role: omni.LabelControlPlaneRole, + machineID: machineIDs[0], + }) + + // assert that machines got allocated (label available is removed) + rtestutils.AssertResources(ctx, t, st, machineIDs, func(machineStatus *omni.MachineStatus, assert *assert.Assertions) { + assert.True(machineStatus.Metadata().Labels().Matches( + resource.LabelTerm{ + Key: omni.MachineStatusLabelAvailable, + Op: resource.LabelOpExists, + Invert: true, + }, + ), resourceDetails(machineStatus)) + }) + }) + + // wait for initial cluster on talosVersion1 to be ready + AssertClusterStatusReady(testCtx, st, clusterName)(t) + AssertTalosVersion(testCtx, rootClient, clusterName, talosVersion2, talosAPIKeyPrepare) + + // destroy the cluster + AssertDestroyCluster(testCtx, st, clusterName)(t) + + t.Logf("creating a cluster on version %s using same machines", talosVersion2) + + // re-create the cluster on talosVersion2 + cluster := omni.NewCluster(resources.DefaultNamespace, clusterName) + cluster.TypedSpec().Value.TalosVersion = talosVersion2 + cluster.TypedSpec().Value.KubernetesVersion = kubernetesVersion + + require.NoError(st.Create(ctx, cluster)) + + t.Logf("Adding machine '%s' to control plane (cluster %q, version %s)", allocatedMachineIDs[0], clusterName, talosVersion2) + bindMachine(ctx, t, st, bindMachineOptions{ + clusterName: clusterName, + role: omni.LabelControlPlaneRole, + machineID: allocatedMachineIDs[0], + }) + + // wait for cluster on talosVersion2 to be ready + AssertClusterStatusReady(testCtx, st, clusterName)(t) + AssertTalosVersion(testCtx, rootClient, clusterName, talosVersion2, talosAPIKeyPrepare) + + AssertDestroyCluster(testCtx, st, clusterName)(t) + } +} + +// AssertTalosServiceIsRestarted verifies that Talos service is restarted on the nodes that match given cluster machine label query options. +func AssertTalosServiceIsRestarted(testCtx context.Context, cli *client.Client, clusterName string, + talosAPIKeyPrepare TalosAPIKeyPrepareFunc, service string, labelQueryOpts ...resource.LabelQueryOption, +) TestFunc { + return func(t *testing.T) { + ctx, cancel := context.WithTimeout(testCtx, 1*time.Minute) + defer cancel() + + require.NoError(t, talosAPIKeyPrepare(ctx, "default")) + + talosCli, err := talosClient(ctx, cli, clusterName) + require.NoError(t, err) + + labelQueryOpts = append(labelQueryOpts, resource.LabelEqual(omni.LabelCluster, clusterName)) + + clusterMachineList, err := safe.StateListAll[*omni.ClusterMachine](ctx, cli.Omni().State(), state.WithLabelQuery(labelQueryOpts...)) + require.NoError(t, err) + + for it := clusterMachineList.Iterator(); it.Next(); { + clusterMachine := it.Value() + nodeID := clusterMachine.Metadata().ID() + + t.Logf("Restarting service %q on node %q", service, nodeID) + + _, err = talosCli.MachineClient.ServiceRestart(talosclient.WithNode(ctx, nodeID), &machine.ServiceRestartRequest{ + Id: service, + }) + require.NoError(t, err) + } + } +} diff --git a/cmd/omni-integration-test/pkg/tests/template.go b/cmd/omni-integration-test/pkg/tests/template.go new file mode 100644 index 00000000..c984818b --- /dev/null +++ b/cmd/omni-integration-test/pkg/tests/template.go @@ -0,0 +1,188 @@ +// Copyright (c) 2024 Sidero Labs, Inc. +// +// Use of this software is governed by the Business Source License +// included in the LICENSE file. + +package tests + +import ( + "bytes" + "context" + _ "embed" + "os" + "testing" + "text/template" + "time" + + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/rtestutils" + "github.com/cosi-project/runtime/pkg/state" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/siderolabs/omni/client/api/omni/specs" + clientconsts "github.com/siderolabs/omni/client/pkg/constants" + "github.com/siderolabs/omni/client/pkg/omni/resources/omni" + "github.com/siderolabs/omni/client/pkg/template/operations" + "github.com/siderolabs/omni/internal/pkg/constants" +) + +//go:embed testdata/cluster-1.tmpl.yaml +var cluster1Tmpl []byte + +//go:embed testdata/cluster-2.tmpl.yaml +var cluster2Tmpl []byte + +type tmplOptions struct { + KubernetesVersion string + TalosVersion string + + CP []string + W []string +} + +func renderTemplate(t *testing.T, tmpl []byte, opts tmplOptions) []byte { + var b bytes.Buffer + + require.NoError(t, template.Must(template.New("cluster").Parse(string(tmpl))).Execute(&b, opts)) + + return b.Bytes() +} + +// AssertClusterTemplateFlow verifies cluster template operations. +func AssertClusterTemplateFlow(testCtx context.Context, st state.State) TestFunc { + return func(t *testing.T) { + ctx, cancel := context.WithTimeout(testCtx, 20*time.Minute) + defer cancel() + + const ( + clusterName = "tmpl-cluster" + additionalWorkersName = "additional-workers" + ) + + require := require.New(t) + + var ( + machineIDs []resource.ID + opts tmplOptions + tmpl1 []byte + ) + + pickUnallocatedMachines(ctx, t, st, 5, func(mIDs []resource.ID) { + machineIDs = mIDs + + opts = tmplOptions{ + KubernetesVersion: "v" + constants.DefaultKubernetesVersion, + TalosVersion: "v" + clientconsts.DefaultTalosVersion, + + CP: machineIDs[:3], + W: machineIDs[3:], + } + + tmpl1 = renderTemplate(t, cluster1Tmpl, opts) + + require.NoError(operations.ValidateTemplate(bytes.NewReader(tmpl1))) + + t.Log("creating template cluster") + + require.NoError(operations.SyncTemplate(ctx, bytes.NewReader(tmpl1), os.Stderr, st, operations.SyncOptions{ + Verbose: true, + })) + + // assert that machines got allocated (label available is removed) + rtestutils.AssertResources(ctx, t, st, machineIDs, func(machineStatus *omni.MachineStatus, assert *assert.Assertions) { + assert.True(machineStatus.Metadata().Labels().Matches( + resource.LabelTerm{ + Key: omni.MachineStatusLabelAvailable, + Op: resource.LabelOpExists, + Invert: true, + }, + ), resourceDetails(machineStatus)) + }) + }) + + t.Log("wait for cluster to be ready") + + // wait using the status command + require.NoError(operations.StatusTemplate(ctx, bytes.NewReader(tmpl1), os.Stderr, st, operations.StatusOptions{ + Wait: true, + })) + + // re-check with short timeout to make sure the cluster is ready + checkCtx, checkCancel := context.WithTimeout(ctx, 10*time.Second) + defer checkCancel() + + rtestutils.AssertResources(checkCtx, t, st, []string{clusterName}, func(status *omni.ClusterStatus, assert *assert.Assertions) { + spec := status.TypedSpec().Value + + assert.Truef(spec.Available, "not available: %s", resourceDetails(status)) + assert.Equalf(specs.ClusterStatusSpec_RUNNING, spec.Phase, "cluster is not in phase running: %s", resourceDetails(status)) + assert.Equalf(spec.GetMachines().Total, spec.GetMachines().Healthy, "not all machines are healthy: %s", resourceDetails(status)) + assert.Truef(spec.Ready, "cluster is not ready: %s", resourceDetails(status)) + assert.Truef(spec.ControlplaneReady, "cluster controlplane is not ready: %s", resourceDetails(status)) + assert.Truef(spec.KubernetesAPIReady, "cluster kubernetes API is not ready: %s", resourceDetails(status)) + assert.EqualValuesf(len(opts.CP)+len(opts.W), spec.GetMachines().Total, "total machines is not the same as in the machine sets: %s", resourceDetails(status)) + }) + + rtestutils.AssertResources(checkCtx, t, st, []string{ + omni.ControlPlanesResourceID(clusterName), + omni.WorkersResourceID(clusterName), + omni.AdditionalWorkersResourceID(clusterName, additionalWorkersName), + }, func(*omni.MachineSet, *assert.Assertions) {}) + + t.Log("updating template cluster") + + opts.CP = opts.CP[:1] + + tmpl2 := renderTemplate(t, cluster2Tmpl, opts) + + require.NoError(operations.SyncTemplate(ctx, bytes.NewReader(tmpl2), os.Stderr, st, operations.SyncOptions{ + Verbose: true, + })) + + t.Log("waiting for cluster operations to apply") + + time.Sleep(10 * time.Second) + + t.Log("wait for cluster to be ready") + + // wait using the status command + require.NoError(operations.StatusTemplate(ctx, bytes.NewReader(tmpl2), os.Stderr, st, operations.StatusOptions{ + Wait: true, + })) + + // re-check with short timeout to make sure the cluster is ready + checkCtx, checkCancel = context.WithTimeout(ctx, 10*time.Second) + defer checkCancel() + + rtestutils.AssertResources(checkCtx, t, st, []string{clusterName}, func(status *omni.ClusterStatus, assert *assert.Assertions) { + spec := status.TypedSpec().Value + + assert.Truef(spec.Available, "not available: %s", resourceDetails(status)) + assert.Equalf(specs.ClusterStatusSpec_RUNNING, spec.Phase, "cluster is not in phase running: %s", resourceDetails(status)) + assert.Equalf(spec.GetMachines().Total, spec.GetMachines().Healthy, "not all machines are healthy: %s", resourceDetails(status)) + assert.Truef(spec.Ready, "cluster is not ready: %s", resourceDetails(status)) + assert.Truef(spec.ControlplaneReady, "cluster controlplane is not ready: %s", resourceDetails(status)) + assert.Truef(spec.KubernetesAPIReady, "cluster kubernetes API is not ready: %s", resourceDetails(status)) + assert.EqualValuesf(len(opts.CP)+len(opts.W), spec.GetMachines().Total, "total machines is not the same as in the machine sets: %s", resourceDetails(status)) + }) + + require.NoError(operations.ValidateTemplate(bytes.NewReader(tmpl1))) + + t.Log("deleting template cluster") + + require.NoError(operations.DeleteTemplate(ctx, bytes.NewReader(tmpl1), os.Stderr, st, operations.SyncOptions{ + Verbose: true, + })) + + rtestutils.AssertNoResource[*omni.Cluster](ctx, t, st, clusterName) + + // make sure machines are returned to the pool + rtestutils.AssertResources(ctx, t, st, machineIDs, func(machineStatus *omni.MachineStatus, assert *assert.Assertions) { + assert.True(machineStatus.Metadata().Labels().Matches(resource.LabelTerm{ + Key: omni.MachineStatusLabelAvailable, + Op: resource.LabelOpExists, + }), resourceDetails(machineStatus)) + }) + } +} diff --git a/cmd/omni-integration-test/pkg/tests/testdata/cluster-1.tmpl.yaml b/cmd/omni-integration-test/pkg/tests/testdata/cluster-1.tmpl.yaml new file mode 100644 index 00000000..a8763e74 --- /dev/null +++ b/cmd/omni-integration-test/pkg/tests/testdata/cluster-1.tmpl.yaml @@ -0,0 +1,29 @@ +kind: Cluster +name: tmpl-cluster +kubernetes: + version: {{ .KubernetesVersion }} +talos: + version: {{ .TalosVersion }} +patches: + - name: kubespan-enabled + inline: + machine: + network: + kubespan: + enabled: true + allowDownPeerBypass: true +--- +kind: ControlPlane +machines: + - {{ index .CP 0 }} + - {{ index .CP 1 }} + - {{ index .CP 2 }} +--- +kind: Workers +machines: + - {{ index .W 0 }} +--- +kind: Workers +name: additional-workers +machines: + - {{ index .W 1 }} diff --git a/cmd/omni-integration-test/pkg/tests/testdata/cluster-2.tmpl.yaml b/cmd/omni-integration-test/pkg/tests/testdata/cluster-2.tmpl.yaml new file mode 100644 index 00000000..90cc210c --- /dev/null +++ b/cmd/omni-integration-test/pkg/tests/testdata/cluster-2.tmpl.yaml @@ -0,0 +1,37 @@ +kind: Cluster +name: tmpl-cluster +kubernetes: + version: {{ .KubernetesVersion }} +talos: + version: {{ .TalosVersion }} +patches: + - name: kubespan-enabled + inline: + machine: + network: + kubespan: + enabled: false +--- +kind: ControlPlane +machines: + - {{ index .CP 0 }} +--- +kind: Workers +machines: + - {{ index .W 0 }} +--- +kind: Workers +name: additional-workers +machines: + - {{ index .W 1 }} +--- +kind: Machine +name: {{ index .W 0 }} +patches: + - name: dummy-if + inline: + machine: + network: + interfaces: + - interface: dummy-if + dummy: true diff --git a/cmd/omni-integration-test/pkg/tests/tests.go b/cmd/omni-integration-test/pkg/tests/tests.go new file mode 100644 index 00000000..a987724f --- /dev/null +++ b/cmd/omni-integration-test/pkg/tests/tests.go @@ -0,0 +1,1170 @@ +// Copyright (c) 2024 Sidero Labs, Inc. +// +// Use of this software is governed by the Business Source License +// included in the LICENSE file. + +// Package tests provides the Omni tests. +package tests + +import ( + "context" + "errors" + "fmt" + "log" + "net/http" + "regexp" + "strings" + "testing" + "time" + + "github.com/siderolabs/gen/xslices" + "github.com/stretchr/testify/assert" + "golang.org/x/sync/semaphore" + "google.golang.org/protobuf/types/known/durationpb" + + "github.com/siderolabs/omni/client/api/omni/specs" + "github.com/siderolabs/omni/client/pkg/omni/resources/omni" + "github.com/siderolabs/omni/cmd/omni-integration-test/pkg/clientconfig" +) + +// TestFunc is a testing function prototype. +type TestFunc func(t *testing.T) + +// RestartAMachineFunc is a function to restart a machine by UUID. +type RestartAMachineFunc func(ctx context.Context, uuid string) error + +// WipeAMachineFunc is a function to wipe a machine by UUID. +type WipeAMachineFunc func(ctx context.Context, uuid string) error + +// FreezeAMachineFunc is a function to freeze a machine by UUID. +type FreezeAMachineFunc func(ctx context.Context, uuid string) error + +// HTTPRequestSignerFunc is function to sign the HTTP request. +type HTTPRequestSignerFunc func(ctx context.Context, req *http.Request) error + +// TalosAPIKeyPrepareFunc is a function to prepare a public key for Talos API auth. +type TalosAPIKeyPrepareFunc func(ctx context.Context, contextName string) error + +// Options for the test runner. +// +//nolint:govet +type Options struct { + RunTestPattern string + + ExpectedMachines int + + RestartAMachineFunc RestartAMachineFunc + WipeAMachineFunc WipeAMachineFunc + FreezeAMachineFunc FreezeAMachineFunc + + MachineOptions MachineOptions + + HTTPEndpoint string + AnotherTalosVersion string + AnotherKubernetesVersion string +} + +// Run the integration tests. +// +//nolint:maintidx +func Run(ctx context.Context, clientConfig *clientconfig.ClientConfig, options Options) error { + rootClient, err := clientConfig.GetClient(ctx) + if err != nil { + return err + } + + talosAPIKeyPrepare := func(ctx context.Context, contextName string) error { + return clientconfig.TalosAPIKeyPrepare(ctx, rootClient, contextName) + } + + testList := []testGroup{ + { + Name: "CleanState", + Description: ` +Bring the state of Omni to a clean state by removing all clusters, config patches, etc. which might have been left from previous runs. +Wait for all expected machines to join and be in maintenance mode.`, + Parallel: false, // these tests should run first without other tests interfering + Subtests: []subTest{ + { + "DestroyAllClusterRelatedResources", + DestroyAllClusterRelatedResources(ctx, rootClient.Omni().State()), + }, + // machine discovery, all machines should be in maintenance mode + { + "LinkCountShouldMatchExpectedMachines", + AssertNumberOfLinks(ctx, rootClient.Omni().State(), options.ExpectedMachines), + }, + { + "LinksShouldBeConnected", + AssertLinksConnected(ctx, rootClient.Omni().State()), + }, + { + "LinksShouldMatchMachines", + AssertMachinesMatchLinks(ctx, rootClient.Omni().State()), + }, + { + "MachinesShouldHaveLogs", + AssertMachinesHaveLogs(ctx, rootClient.Omni().State(), rootClient.Management()), + }, + { + "MachinesShouldBeInMaintenanceMode", + AssertMachineStatus(ctx, rootClient.Omni().State(), true, "", map[string]string{ + omni.MachineStatusLabelConnected: "", + omni.MachineStatusLabelReportingEvents: "", + omni.MachineStatusLabelAvailable: "", + // QEMU-specific labels which should always match, others are specific to the settings (number of cores, etc.) + omni.MachineStatusLabelCPU: "qemu", + omni.MachineStatusLabelArch: "amd64", + omni.MachineStatusLabelPlatform: "metal", + }, nil), + }, + }, + }, + { + Name: "TalosImageGeneration", + Description: ` +Generate various Talos images with Omni and try to download them.`, + Parallel: true, + Subtests: []subTest{ + { + "TalosImagesShouldBeDownloadable", + AssertSomeImagesAreDownloadable(ctx, rootClient, func(ctx context.Context, req *http.Request) error { + return clientconfig.SignHTTPRequest(ctx, rootClient, req) + }, options.HTTPEndpoint), + }, + }, + }, + { + Name: "ForcedMachineRemoval", + Description: ` +Tests different scenarios for forced Machine removal (vs. graceful removing from a cluster): + +- force remove a Machine which is not allocated (not part of any cluster) +- force remove a worker Machine which is part of the cluster +- force remove a control plane Machine which is part of the cluster, and replace with a new Machine. + +These tests simulate a hardware failure of a Machine which requires a forced removal from Omni. + +In the tests, we wipe and reboot the VMs to bring them back as available for the next test.`, + Parallel: true, + MachineClaim: 4, + Subtests: subTests( + // this test will force-remove a machine, but it will bring it back, so pool of available will be still 4 machines + subTest{ + "UnallocatedMachinesShouldBeDestroyable", + AssertUnallocatedMachineDestroyFlow(ctx, rootClient.Omni().State(), options.RestartAMachineFunc), + }, + // this test consumes all 4 available machines and creates a cluster + subTest{ + "ClusterShouldBeCreated", + CreateCluster(ctx, rootClient, ClusterOptions{ + Name: "integration-forced-removal", + ControlPlanes: 3, + Workers: 1, + + MachineOptions: options.MachineOptions, + }), + }, + ).Append( + TestBlockClusterShouldBeReady(ctx, rootClient, "integration-forced-removal", options.MachineOptions.TalosVersion, talosAPIKeyPrepare)..., + ).Append( + // this test will force-remove a worker, so the cluster will be 3+0, and 1 available machine + subTest{ + "WorkerNodesShouldBeForceRemovable", + AssertForceRemoveWorkerNode(ctx, rootClient.Omni().State(), "integration-forced-removal", options.FreezeAMachineFunc, options.WipeAMachineFunc), + }, + ).Append( + TestBlockClusterShouldBeReady(ctx, rootClient, "integration-forced-removal", options.MachineOptions.TalosVersion, talosAPIKeyPrepare)..., + ).Append( + // this test will add an available machine as a fourth control plane node, but then remove a frozen one, so the cluster is 3+0, and 1 available machine + subTest{ + "ControlPlaneNodeShouldBeForceReplaceable", + AssertControlPlaneForceReplaceMachine(ctx, rootClient.Omni().State(), "integration-forced-removal", options), + }, + ).Append( + TestBlockClusterShouldBeReady(ctx, rootClient, "integration-forced-removal", options.MachineOptions.TalosVersion, talosAPIKeyPrepare)..., + ).Append( + subTest{ + "ClusterShouldBeDestroyed", + AssertDestroyCluster(ctx, rootClient.Omni().State(), "integration-forced-removal"), + }, + ), + Finalizer: DestroyCluster(ctx, rootClient.Omni().State(), "integration-forced-removal"), + }, + { + Name: "ImmediateClusterDestruction", + Description: ` +Regression test: create a cluster and destroy it without waiting for the cluster to reach any state.`, + Parallel: true, + MachineClaim: 3, + Subtests: subTests( + subTest{ + "ClusterShouldBeCreated", + CreateCluster(ctx, rootClient, ClusterOptions{ + Name: "integration-immediate", + ControlPlanes: 1, + Workers: 2, + + MachineOptions: options.MachineOptions, + }), + }, + subTest{ + "ClusterShouldBeDestroyedImmediately", + AssertDestroyCluster(ctx, rootClient.Omni().State(), "integration-immediate"), + }, + ), + Finalizer: DestroyCluster(ctx, rootClient.Omni().State(), "integration-immediate"), + }, + TestGroupClusterCreateAndReady( + ctx, + rootClient, + talosAPIKeyPrepare, + "default", + ` +Create a regular 3 + 2 cluster with HA controlplane, assert that the cluster is ready and accessible. +Don't do any changes to the cluster.`, + ClusterOptions{ + ControlPlanes: 3, + Workers: 2, + + MachineOptions: options.MachineOptions, + }, + ), + TestGroupClusterCreateAndReady( + ctx, + rootClient, + talosAPIKeyPrepare, + "encrypted", + ` +Create a 1 + 1 cluster and enable disk encryption via Omni as a KMS. +Don't do any changes to the cluster.`, + ClusterOptions{ + ControlPlanes: 1, + Workers: 1, + + MachineOptions: options.MachineOptions, + Features: &specs.ClusterSpec_Features{ + DiskEncryption: true, + }, + }, + ), + TestGroupClusterCreateAndReady( + ctx, + rootClient, + talosAPIKeyPrepare, + "singlenode", + ` +Create a single node cluster. +Don't do any changes to the cluster.`, + ClusterOptions{ + ControlPlanes: 1, + Workers: 0, + + MachineOptions: options.MachineOptions, + }, + ), + { + Name: "ScaleUpAndDown", + Description: ` +Tests scaling up and down a cluster: + +- create a 1+0 cluster +- scale up to 1+1 +- scale up to 3+1 +- scale down to 3+0 +- scale down to 1+0 + +In between the scaling operations, assert that the cluster is ready and accessible.`, + Parallel: true, + MachineClaim: 4, + Subtests: subTests( + subTest{ + "ClusterShouldBeCreated", + CreateCluster(ctx, rootClient, ClusterOptions{ + Name: "integration-scaling", + ControlPlanes: 1, + Workers: 0, + + MachineOptions: options.MachineOptions, + }), + }, + ).Append( + TestBlockClusterAndTalosAPIAndKubernetesShouldBeReady( + ctx, rootClient, + "integration-scaling", + options.MachineOptions.TalosVersion, + options.MachineOptions.KubernetesVersion, + talosAPIKeyPrepare, + )..., + ).Append( + subTest{ + "OneWorkerShouldBeAdded", + ScaleClusterUp(ctx, rootClient.Omni().State(), ClusterOptions{ + Name: "integration-scaling", + ControlPlanes: 0, + Workers: 1, + MachineOptions: options.MachineOptions, + }), + }, + ).Append( + TestBlockClusterAndTalosAPIAndKubernetesShouldBeReady( + ctx, rootClient, + "integration-scaling", + options.MachineOptions.TalosVersion, + options.MachineOptions.KubernetesVersion, + talosAPIKeyPrepare, + )..., + ).Append( + subTest{ + "TwoControlPlanesShouldBeAdded", + ScaleClusterUp(ctx, rootClient.Omni().State(), ClusterOptions{ + Name: "integration-scaling", + ControlPlanes: 2, + Workers: 0, + MachineOptions: options.MachineOptions, + }), + }, + ).Append( + TestBlockClusterAndTalosAPIAndKubernetesShouldBeReady( + ctx, rootClient, + "integration-scaling", + options.MachineOptions.TalosVersion, + options.MachineOptions.KubernetesVersion, + talosAPIKeyPrepare, + )..., + ).Append( + subTest{ + "OneWorkerShouldBeRemoved", + ScaleClusterDown(ctx, rootClient.Omni().State(), ClusterOptions{ + Name: "integration-scaling", + ControlPlanes: 0, + Workers: -1, + MachineOptions: options.MachineOptions, + }), + }, + ).Append( + TestBlockClusterAndTalosAPIAndKubernetesShouldBeReady( + ctx, rootClient, + "integration-scaling", + options.MachineOptions.TalosVersion, + options.MachineOptions.KubernetesVersion, + talosAPIKeyPrepare, + )..., + ).Append( + subTest{ + "TwoControlPlanesShouldBeRemoved", + ScaleClusterDown(ctx, rootClient.Omni().State(), ClusterOptions{ + Name: "integration-scaling", + ControlPlanes: -2, + Workers: 0, + MachineOptions: options.MachineOptions, + }), + }, + ).Append( + TestBlockClusterAndTalosAPIAndKubernetesShouldBeReady( + ctx, rootClient, + "integration-scaling", + options.MachineOptions.TalosVersion, + options.MachineOptions.KubernetesVersion, + talosAPIKeyPrepare, + )..., + ).Append( + subTest{ + "ClusterShouldBeDestroyed", + AssertDestroyCluster(ctx, rootClient.Omni().State(), "integration-scaling"), + }, + ), + Finalizer: DestroyCluster(ctx, rootClient.Omni().State(), "integration-scaling"), + }, + { + Name: "ScaleUpAndDownMachineClassBasedMachineSets", + Description: ` +Tests scaling up and down a cluster using machine classes: + +- create a 1+0 cluster +- scale up to 1+1 +- scale up to 3+1 +- scale down to 3+0 +- scale down to 1+0 + +In between the scaling operations, assert that the cluster is ready and accessible.`, + Parallel: true, + MachineClaim: 4, + Subtests: subTests( + subTest{ + "ClusterShouldBeCreated", + CreateClusterWithMachineClass(ctx, rootClient.Omni().State(), ClusterOptions{ + Name: "integration-scaling-machine-class-based-machine-sets", + ControlPlanes: 1, + Workers: 0, + + MachineOptions: options.MachineOptions, + }), + }, + ).Append( + TestBlockClusterAndTalosAPIAndKubernetesShouldBeReady( + ctx, rootClient, + "integration-scaling-machine-class-based-machine-sets", + options.MachineOptions.TalosVersion, + options.MachineOptions.KubernetesVersion, + talosAPIKeyPrepare, + )..., + ).Append( + subTest{ + "OneWorkerShouldBeAdded", + ScaleClusterMachineSets(ctx, rootClient.Omni().State(), ClusterOptions{ + Name: "integration-scaling-machine-class-based-machine-sets", + ControlPlanes: 0, + Workers: 1, + MachineOptions: options.MachineOptions, + }), + }, + ).Append( + TestBlockClusterAndTalosAPIAndKubernetesShouldBeReady( + ctx, rootClient, + "integration-scaling-machine-class-based-machine-sets", + options.MachineOptions.TalosVersion, + options.MachineOptions.KubernetesVersion, + talosAPIKeyPrepare, + )..., + ).Append( + subTest{ + "TwoControlPlanesShouldBeAdded", + ScaleClusterMachineSets(ctx, rootClient.Omni().State(), ClusterOptions{ + Name: "integration-scaling-machine-class-based-machine-sets", + ControlPlanes: 2, + Workers: 0, + MachineOptions: options.MachineOptions, + }), + }, + ).Append( + TestBlockClusterAndTalosAPIAndKubernetesShouldBeReady( + ctx, rootClient, + "integration-scaling-machine-class-based-machine-sets", + options.MachineOptions.TalosVersion, + options.MachineOptions.KubernetesVersion, + talosAPIKeyPrepare, + )..., + ).Append( + subTest{ + "OneWorkerShouldBeRemoved", + ScaleClusterMachineSets(ctx, rootClient.Omni().State(), ClusterOptions{ + Name: "integration-scaling-machine-class-based-machine-sets", + ControlPlanes: 0, + Workers: -1, + MachineOptions: options.MachineOptions, + }), + }, + ).Append( + TestBlockClusterAndTalosAPIAndKubernetesShouldBeReady( + ctx, rootClient, + "integration-scaling-machine-class-based-machine-sets", + options.MachineOptions.TalosVersion, + options.MachineOptions.KubernetesVersion, + talosAPIKeyPrepare, + )..., + ).Append( + subTest{ + "TwoControlPlanesShouldBeRemoved", + ScaleClusterMachineSets(ctx, rootClient.Omni().State(), ClusterOptions{ + Name: "integration-scaling-machine-class-based-machine-sets", + ControlPlanes: -2, + Workers: 0, + MachineOptions: options.MachineOptions, + }), + }, + ).Append( + TestBlockClusterAndTalosAPIAndKubernetesShouldBeReady( + ctx, rootClient, + "integration-scaling-machine-class-based-machine-sets", + options.MachineOptions.TalosVersion, + options.MachineOptions.KubernetesVersion, + talosAPIKeyPrepare, + )..., + ).Append( + subTest{ + "ClusterShouldBeDestroyed", + AssertDestroyCluster(ctx, rootClient.Omni().State(), "integration-scaling-machine-class-based-machine-sets"), + }, + ), + Finalizer: DestroyCluster(ctx, rootClient.Omni().State(), "integration-scaling"), + }, + { + Name: "RollingUpdateParallelism", + Description: ` +Tests rolling update & scale down strategies for concurrency control for worker machine sets. + +- create a 1+3 cluster +- update the worker configs with rolling strategy using maxParallelism of 2 +- scale down the workers to 0 with rolling strategy using maxParallelism of 2 +- assert that the maxParallelism of 2 was respected and used in both operations,`, + Parallel: true, + MachineClaim: 4, + Subtests: subTests( + subTest{ + "ClusterShouldBeCreated", + CreateCluster(ctx, rootClient, ClusterOptions{ + Name: "integration-rolling-update-parallelism", + ControlPlanes: 1, + Workers: 3, + + MachineOptions: options.MachineOptions, + }), + }, + ).Append( + TestBlockClusterAndTalosAPIAndKubernetesShouldBeReady( + ctx, rootClient, + "integration-rolling-update-parallelism", + options.MachineOptions.TalosVersion, + options.MachineOptions.KubernetesVersion, + talosAPIKeyPrepare, + )..., + ).Append( + subTest{ + "WorkersUpdateShouldBeRolledOutWithMaxParallelism", + AssertWorkerNodesRollingConfigUpdate(ctx, rootClient, "integration-rolling-update-parallelism", 2), + }, + subTest{ + "WorkersShouldScaleDownWithMaxParallelism", + AssertWorkerNodesRollingScaleDown(ctx, rootClient, "integration-rolling-update-parallelism", 2), + }, + ).Append( + subTest{ + "ClusterShouldBeDestroyed", + AssertDestroyCluster(ctx, rootClient.Omni().State(), "integration-rolling-update-parallelism"), + }, + ), + Finalizer: DestroyCluster(ctx, rootClient.Omni().State(), "integration-rolling-update-parallelism"), + }, + { + Name: "ReplaceControlPlanes", + Description: ` +Tests replacing control plane nodes: + +- create a 1+0 cluster +- scale up to 2+0, and immediately remove the first control plane node + +In between the scaling operations, assert that the cluster is ready and accessible.`, + Parallel: true, + MachineClaim: 2, + Subtests: subTests( + subTest{ + "ClusterShouldBeCreated", + CreateCluster(ctx, rootClient, ClusterOptions{ + Name: "integration-replace-cp", + ControlPlanes: 1, + Workers: 0, + + MachineOptions: options.MachineOptions, + }), + }, + ).Append( + TestBlockClusterAndTalosAPIAndKubernetesShouldBeReady( + ctx, rootClient, + "integration-replace-cp", + options.MachineOptions.TalosVersion, + options.MachineOptions.KubernetesVersion, + talosAPIKeyPrepare, + )..., + ).Append( + subTest{ + "ControlPlanesShouldBeReplaced", + ReplaceControlPlanes(ctx, rootClient.Omni().State(), ClusterOptions{ + Name: "integration-replace-cp", + + MachineOptions: options.MachineOptions, + }), + }, + ).Append( + TestBlockClusterAndTalosAPIAndKubernetesShouldBeReady( + ctx, rootClient, + "integration-replace-cp", + options.MachineOptions.TalosVersion, + options.MachineOptions.KubernetesVersion, + talosAPIKeyPrepare, + )..., + ).Append( + subTest{ + "ClusterShouldBeDestroyed", + AssertDestroyCluster(ctx, rootClient.Omni().State(), "integration-replace-cp"), + }, + ), + Finalizer: DestroyCluster(ctx, rootClient.Omni().State(), "integration-replace-cp"), + }, + { + Name: "ConfigPatching", + Description: ` +Tests applying various config patching, including "broken" config patches which should not apply.`, + Parallel: true, + MachineClaim: 4, + Subtests: subTests( + subTest{ + "ClusterShouldBeCreated", + CreateCluster(ctx, rootClient, ClusterOptions{ + Name: "integration-config-patching", + ControlPlanes: 3, + Workers: 1, + + MachineOptions: options.MachineOptions, + }), + }, + ).Append( + TestBlockClusterAndTalosAPIAndKubernetesShouldBeReady( + ctx, rootClient, + "integration-config-patching", + options.MachineOptions.TalosVersion, + options.MachineOptions.KubernetesVersion, + talosAPIKeyPrepare, + )..., + ).Append( + subTest{ + "LargeImmediateConfigPatchShouldBeAppliedAndRemoved", + AssertLargeImmediateConfigApplied(ctx, rootClient, "integration-config-patching", talosAPIKeyPrepare), + }, + ).Append( + TestBlockClusterAndTalosAPIAndKubernetesShouldBeReady( + ctx, rootClient, + "integration-config-patching", + options.MachineOptions.TalosVersion, + options.MachineOptions.KubernetesVersion, + talosAPIKeyPrepare, + )..., + ).Append( + subTest{ + "MachineSetConfigPatchShouldBeAppliedAndRemoved", + AssertConfigPatchMachineSet(ctx, rootClient, "integration-config-patching"), + }, + subTest{ + "SingleClusterMachineConfigPatchShouldBeAppliedAndRemoved", + AssertConfigPatchSingleClusterMachine(ctx, rootClient, "integration-config-patching"), + }, + ).Append( + TestBlockClusterAndTalosAPIAndKubernetesShouldBeReady( + ctx, rootClient, + "integration-config-patching", + options.MachineOptions.TalosVersion, + options.MachineOptions.KubernetesVersion, + talosAPIKeyPrepare, + )..., + ).Append( + subTest{ + "ConfigPatchWithRebootShouldBeApplied", + AssertConfigPatchWithReboot(ctx, rootClient, "integration-config-patching", talosAPIKeyPrepare), + }, + ).Append( + TestBlockClusterAndTalosAPIAndKubernetesShouldBeReady( + ctx, rootClient, + "integration-config-patching", + options.MachineOptions.TalosVersion, + options.MachineOptions.KubernetesVersion, + talosAPIKeyPrepare, + )..., + ).Append( + subTest{ + "InvalidConfigPatchShouldNotBeApplied", + AssertConfigPatchWithInvalidConfig(ctx, rootClient, "integration-config-patching", talosAPIKeyPrepare), + }, + ).Append( + TestBlockClusterAndTalosAPIAndKubernetesShouldBeReady( + ctx, rootClient, + "integration-config-patching", + options.MachineOptions.TalosVersion, + options.MachineOptions.KubernetesVersion, + talosAPIKeyPrepare, + )..., + ).Append( + subTest{ + "ClusterShouldBeDestroyed", + AssertDestroyCluster(ctx, rootClient.Omni().State(), "integration-config-patching"), + }, + ), + Finalizer: DestroyCluster(ctx, rootClient.Omni().State(), "integration-config-patching"), + }, + { + Name: "TalosUpgrades", + Description: ` +Tests upgrading Talos version, including reverting a failed upgrade.`, + Parallel: true, + MachineClaim: 4, + Subtests: subTests( + subTest{ + "ClusterShouldBeCreated", + CreateCluster(ctx, rootClient, ClusterOptions{ + Name: "integration-talos-upgrade", + ControlPlanes: 3, + Workers: 1, + + MachineOptions: MachineOptions{ + TalosVersion: options.AnotherTalosVersion, + KubernetesVersion: options.AnotherKubernetesVersion, // use older Kubernetes compatible with AnotherTalosVersion + }, + }), + }, + ).Append( + TestBlockClusterAndTalosAPIAndKubernetesShouldBeReady( + ctx, rootClient, + "integration-talos-upgrade", + options.AnotherTalosVersion, + options.AnotherKubernetesVersion, + talosAPIKeyPrepare, + )..., + ).Append( + subTest{ + "HelloWorldServiceExtensionShouldBePresent", + AssertExtensionIsPresent(ctx, rootClient, "integration-talos-upgrade", HelloWorldServiceExtensionName), + }, + subTest{ + "TalosSchematicUpdateShouldSucceed", + AssertTalosSchematicUpdateFlow(ctx, rootClient, "integration-talos-upgrade"), + }, + subTest{ + "QemuGuestAgentExtensionShouldBePresent", + AssertExtensionIsPresent(ctx, rootClient, "integration-talos-upgrade", QemuGuestAgentExtensionName), + }, + subTest{ + "ClusterBootstrapManifestSyncShouldBeSuccessful", + KubernetesBootstrapManifestSync(ctx, rootClient.Management(), "integration-talos-upgrade"), + }, + ).Append( + subTest{ + "TalosUpgradeShouldSucceed", + AssertTalosUpgradeFlow(ctx, rootClient.Omni().State(), "integration-talos-upgrade", options.MachineOptions.TalosVersion), + }, + subTest{ + "ClusterBootstrapManifestSyncShouldBeSuccessful", + KubernetesBootstrapManifestSync(ctx, rootClient.Management(), "integration-talos-upgrade"), + }, + subTest{ + "HelloWorldServiceExtensionShouldBePresent", + AssertExtensionIsPresent(ctx, rootClient, "integration-talos-upgrade", HelloWorldServiceExtensionName), + }, + ).Append( + TestBlockClusterAndTalosAPIAndKubernetesShouldBeReady( + ctx, rootClient, + "integration-talos-upgrade", + options.MachineOptions.TalosVersion, + options.AnotherKubernetesVersion, + talosAPIKeyPrepare, + )..., + ).Append( + subTest{ + "FailedTalosUpgradeShouldBeRevertible", + AssertTalosUpgradeIsRevertible(ctx, rootClient.Omni().State(), "integration-talos-upgrade", options.MachineOptions.TalosVersion), + }, + ).Append( + subTest{ + "RunningTalosUpgradeShouldBeCancelable", + AssertTalosUpgradeIsCancelable(ctx, rootClient.Omni().State(), "integration-talos-upgrade", options.MachineOptions.TalosVersion, options.AnotherTalosVersion), + }, + ).Append( + TestBlockClusterAndTalosAPIAndKubernetesShouldBeReady( + ctx, rootClient, + "integration-talos-upgrade", + options.MachineOptions.TalosVersion, + options.AnotherKubernetesVersion, + talosAPIKeyPrepare, + )..., + ).Append( + subTest{ + "ClusterShouldBeDestroyed", + AssertDestroyCluster(ctx, rootClient.Omni().State(), "integration-talos-upgrade"), + }, + ), + Finalizer: DestroyCluster(ctx, rootClient.Omni().State(), "integration-talos-upgrade"), + }, + { + Name: "KubernetesUpgrades", + Description: ` +Tests upgrading Kubernetes version, including reverting a failed upgrade.`, + Parallel: true, + MachineClaim: 4, + Subtests: subTests( + subTest{ + "ClusterShouldBeCreated", + CreateCluster(ctx, rootClient, ClusterOptions{ + Name: "integration-k8s-upgrade", + ControlPlanes: 3, + Workers: 1, + + MachineOptions: MachineOptions{ + TalosVersion: options.MachineOptions.TalosVersion, + KubernetesVersion: options.AnotherKubernetesVersion, + }, + }), + }, + ).Append( + TestBlockClusterAndTalosAPIAndKubernetesShouldBeReady( + ctx, rootClient, + "integration-k8s-upgrade", + options.MachineOptions.TalosVersion, + options.AnotherKubernetesVersion, + talosAPIKeyPrepare, + )..., + ).Append( + subTest{ + "KubernetesUpgradeShouldSucceed", + AssertKubernetesUpgradeFlow( + ctx, rootClient.Omni().State(), rootClient.Management(), + "integration-k8s-upgrade", + options.MachineOptions.KubernetesVersion, + ), + }, + ).Append( + TestBlockClusterAndTalosAPIAndKubernetesShouldBeReady( + ctx, rootClient, + "integration-k8s-upgrade", + options.MachineOptions.TalosVersion, + options.MachineOptions.KubernetesVersion, + talosAPIKeyPrepare, + )..., + ).Append( + subTest{ + "FailedKubernetesUpgradeShouldBeRevertible", + AssertKubernetesUpgradeIsRevertible(ctx, rootClient.Omni().State(), "integration-k8s-upgrade", options.MachineOptions.KubernetesVersion), + }, + ).Append( + TestBlockClusterAndTalosAPIAndKubernetesShouldBeReady( + ctx, rootClient, + "integration-k8s-upgrade", + options.MachineOptions.TalosVersion, + options.MachineOptions.KubernetesVersion, + talosAPIKeyPrepare, + )..., + ).Append( + subTest{ + "ClusterShouldBeDestroyed", + AssertDestroyCluster(ctx, rootClient.Omni().State(), "integration-k8s-upgrade"), + }, + ), + Finalizer: DestroyCluster(ctx, rootClient.Omni().State(), "integration-k8s-upgrade"), + }, + { + Name: "EtcdBackupAndRestore", + Description: ` +Tests automatic & manual backup & restore for workload etcd. + +Automatic backups are enabled, done, and then a manual backup is created. +Afterwards, a cluster's control plane is destroyed then recovered from the backup. + +Finally, a completely new cluster is created using the same backup to test the "point-in-time recovery".`, + Parallel: true, + MachineClaim: 6, + Subtests: subTests( + subTest{ + "ClusterShouldBeCreated", + CreateCluster(ctx, rootClient, ClusterOptions{ + Name: "integration-etcd-backup", + ControlPlanes: 3, + Workers: 1, + + EtcdBackup: &specs.EtcdBackupConf{ + Interval: durationpb.New(2 * time.Hour), + Enabled: true, + }, + MachineOptions: options.MachineOptions, + }), + }, + ).Append( + TestBlockClusterAndTalosAPIAndKubernetesShouldBeReady( + ctx, rootClient, + "integration-etcd-backup", + options.MachineOptions.TalosVersion, + options.MachineOptions.KubernetesVersion, + talosAPIKeyPrepare, + )..., + ).Append( + TestBlockKubernetesDeploymentCreateAndRunning(ctx, rootClient.Management(), "integration-etcd-backup", + "default", + "test", + )..., + ).Append( + subTest{ + "KubernetesSecretShouldBeCreated", + AssertKubernetesSecretIsCreated(ctx, rootClient.Management(), "integration-etcd-backup", "default", "test", "backup-test-secret-val"), + }, + subTest{ + "EtcdAutomaticBackupShouldBeCreated", + AssertEtcdAutomaticBackupIsCreated(ctx, rootClient.Omni().State(), "integration-etcd-backup"), + }, + subTest{ + "EtcdManualBackupShouldBeCreated", + AssertEtcdManualBackupIsCreated(ctx, rootClient.Omni().State(), "integration-etcd-backup"), + }, + ).Append( + TestBlockCreateClusterFromEtcdBackup(ctx, rootClient, talosAPIKeyPrepare, options, + "integration-etcd-backup", + "integration-etcd-backup-new-cluster", + "default", + "test", + )..., + ).Append( + subTest{ + "EtcdSecretShouldBeSameAfterCreateFromBackup", + AssertKubernetesSecretHasValue(ctx, rootClient.Management(), "integration-etcd-backup-new-cluster", "default", "test", "backup-test-secret-val"), + }, + subTest{ + "NewClusterShouldBeDestroyed", + AssertDestroyCluster(ctx, rootClient.Omni().State(), "integration-etcd-backup-new-cluster"), + }, + ).Append( + TestBlockRestoreEtcdFromLatestBackup(ctx, rootClient, talosAPIKeyPrepare, options, 3, + "integration-etcd-backup", + "default", + "test", + )..., + ).Append( + subTest{ + "RestoredClusterShouldBeDestroyed", + AssertDestroyCluster(ctx, rootClient.Omni().State(), "integration-etcd-backup"), + }, + ), + Finalizer: func(t *testing.T) { + DestroyCluster(ctx, rootClient.Omni().State(), "integration-etcd-backup")(t) + DestroyCluster(ctx, rootClient.Omni().State(), "integration-etcd-backup-new-cluster")(t) + }, + }, + { + Name: "MaintenanceUpgrade", + Description: ` + Test upgrading (downgrading) a machine in maintenance mode. + + Create a cluster out of a single machine on version1, remove cluster (the machine will stay on version1, Talos is installed). + Create a cluster out of the same machine on version2, Omni should upgrade the machine to version2 while in maintenance. + `, + Parallel: true, + MachineClaim: 1, + Subtests: subTests( + subTest{ + "MachineShouldBeUpgradedInMaintenanceMode", + AssertMachineShouldBeUpgradedInMaintenanceMode( + ctx, rootClient, + "integration-maintenance-upgrade", + options.AnotherKubernetesVersion, + options.MachineOptions.TalosVersion, + options.AnotherTalosVersion, + talosAPIKeyPrepare, + ), + }, + ), + Finalizer: DestroyCluster(ctx, rootClient.Omni().State(), "integration-maintenance-upgrade"), + }, + { + Name: "Auth", + Description: ` +Test authorization on accessing Omni API, some tests run without a cluster, some only run with a context of a cluster.`, + MachineClaim: 1, + Parallel: true, + Subtests: subTests( + subTest{ + "AnonymousRequestShouldBeDenied", + AssertAnonymousAuthenication(ctx, rootClient), + }, + subTest{ + "InvalidSignatureShouldBeDenied", + AssertAPIInvalidSignature(ctx, rootClient), + }, + subTest{ + "PublicKeyWithoutLifetimeShouldNotBeRegistered", + AssertPublicKeyWithoutLifetimeNotRegistered(ctx, rootClient), + }, + subTest{ + "PublicKeyWithLongLifetimeShouldNotBeRegistered", + AssertPublicKeyWithLongLifetimeNotRegistered(ctx, rootClient), + }, + subTest{ + "OmniconfigShouldBeDownloadable", + AssertOmniconfigDownload(ctx, rootClient), + }, + subTest{ + "PublicKeyWithUnknownEmailShouldNotBeRegistered", + AssertRegisterPublicKeyWithUnknownEmail(ctx, rootClient), + }, + subTest{ + "ServiceAccountAPIShouldWork", + AssertServiceAccountAPIFlow(ctx, rootClient), + }, + subTest{ + "ResourceAuthzShouldWork", + AssertResourceAuthz(ctx, rootClient, clientConfig), + }, + subTest{ + "ResourceAuthzWithACLShouldWork", + AssertResourceAuthzWithACL(ctx, rootClient, clientConfig), + }, + ).Append( + subTest{ + "ClusterShouldBeCreated", + CreateCluster(ctx, rootClient, ClusterOptions{ + Name: "integration-auth", + ControlPlanes: 1, + Workers: 0, + + MachineOptions: options.MachineOptions, + }), + }, + ).Append( + TestBlockClusterAndTalosAPIAndKubernetesShouldBeReady( + ctx, rootClient, + "integration-auth", + options.MachineOptions.TalosVersion, + options.MachineOptions.KubernetesVersion, + talosAPIKeyPrepare, + )..., + ).Append( + subTest{ + "APIAuthorizationShouldBeTested", + AssertAPIAuthz(ctx, rootClient, clientConfig, "integration-auth"), + }, + ).Append( + subTest{ + "ClusterShouldBeDestroyed", + AssertDestroyCluster(ctx, rootClient.Omni().State(), "integration-auth"), + }, + ), + Finalizer: DestroyCluster(ctx, rootClient.Omni().State(), "integration-auth"), + }, + { + Name: "ClusterTemplate", + Description: ` +Test flow of cluster creation and scaling using cluster templates.`, + Parallel: true, + MachineClaim: 5, + Subtests: []subTest{ + { + "TestClusterTemplateFlow", + AssertClusterTemplateFlow(ctx, rootClient.Omni().State()), + }, + }, + Finalizer: DestroyCluster(ctx, rootClient.Omni().State(), "tmpl-cluster"), + }, + } + + var re *regexp.Regexp + + if options.RunTestPattern != "" { + var err error + + if re, err = regexp.Compile(options.RunTestPattern); err != nil { + log.Printf("run test pattern parse error: %s", err) + + return err + } + } + + var testsToRun []testGroup + + for _, group := range testList { + if re == nil || re.MatchString(group.Name) { + testsToRun = append(testsToRun, group) + + continue + } + + matchedGroup := group + matchedGroup.Subtests = xslices.Filter(matchedGroup.Subtests, func(test subTest) bool { + fullName := fmt.Sprintf("%s/%s", group.Name, test.Name) + + return re.MatchString(fullName) + }) + + if len(matchedGroup.Subtests) > 0 { + testsToRun = append(testsToRun, matchedGroup) + } + } + + for _, group := range testsToRun { + if group.MachineClaim > options.ExpectedMachines { + return fmt.Errorf("test group %q requires %d machines, but only %d are expected", group.Name, group.MachineClaim, options.ExpectedMachines) + } + } + + machineSemaphore := semaphore.NewWeighted(int64(options.ExpectedMachines)) + + exitCode := testing.MainStart( + matchStringOnly(func(string, string) (bool, error) { return true, nil }), + makeTests(ctx, testsToRun, machineSemaphore), + nil, + nil, + nil, + ).Run() + + if exitCode != 0 { + return errors.New("test failed") + } + + return nil +} + +func makeTests(ctx context.Context, testsToRun []testGroup, machineSemaphore *semaphore.Weighted) []testing.InternalTest { + return xslices.Map(testsToRun, func(group testGroup) testing.InternalTest { + return testing.InternalTest{ + Name: group.Name, + F: func(t *testing.T) { + if group.Parallel { + t.Parallel() + } + + assert.NotEmpty(t, group.Name) + + t.Logf("[%s]:\n%s", group.Name, strings.TrimSpace(group.Description)) + + if group.MachineClaim > 0 { + t.Logf("attempting to acquire semaphore for %d machines", group.MachineClaim) + + if err := machineSemaphore.Acquire(ctx, int64(group.MachineClaim)); err != nil { + t.Fatalf("failed to acquire machine semaphore: %s", err) + } + + t.Logf("acquired semaphore for %d machines", group.MachineClaim) + + t.Cleanup(func() { + t.Logf("releasing semaphore for %d machines", group.MachineClaim) + + machineSemaphore.Release(int64(group.MachineClaim)) + }) + } + + var testGroupFailed bool + + for _, elem := range group.Subtests { + testGroupFailed = !t.Run(elem.Name, elem.F) + if testGroupFailed { + break + } + } + + if testGroupFailed && group.Finalizer != nil { + t.Logf("running finalizer, as the test group failed") + + group.Finalizer(t) + } + }, + } + }) +} + +//nolint:govet +type testGroup struct { + Name string + Description string + Parallel bool + MachineClaim int + Subtests []subTest + Finalizer func(t *testing.T) +} + +//nolint:govet +type subTest struct { + Name string + F func(t *testing.T) +} + +type subTestList []subTest + +func subTests(items ...subTest) subTestList { + return items +} + +func (l subTestList) Append(items ...subTest) subTestList { + return append(l, items...) +} diff --git a/cmd/omni-integration-test/pkg/tests/utils.go b/cmd/omni-integration-test/pkg/tests/utils.go new file mode 100644 index 00000000..b488d1a1 --- /dev/null +++ b/cmd/omni-integration-test/pkg/tests/utils.go @@ -0,0 +1,57 @@ +// Copyright (c) 2024 Sidero Labs, Inc. +// +// Use of this software is governed by the Business Source License +// included in the LICENSE file. + +package tests + +import ( + "errors" + "io" + "reflect" + "time" +) + +type corpusEntry = struct { + Parent string + Path string + Data []byte + Values []any + Generation int + IsSeed bool +} + +var errMain = errors.New("testing: unexpected use of func Main") + +type matchStringOnly func(pat, str string) (bool, error) + +func (f matchStringOnly) MatchString(pat, str string) (bool, error) { return f(pat, str) } + +func (f matchStringOnly) StartCPUProfile(io.Writer) error { return errMain } + +func (f matchStringOnly) StopCPUProfile() {} + +func (f matchStringOnly) WriteProfileTo(string, io.Writer, int) error { return errMain } + +func (f matchStringOnly) ImportPath() string { return "" } + +func (f matchStringOnly) StartTestLog(io.Writer) {} + +func (f matchStringOnly) StopTestLog() error { return errMain } + +func (f matchStringOnly) SetPanicOnExit0(bool) {} + +func (f matchStringOnly) CoordinateFuzzing(time.Duration, int64, time.Duration, int64, int, []corpusEntry, []reflect.Type, string, string) error { + return nil +} + +func (f matchStringOnly) RunFuzzWorker(func(corpusEntry) error) error { return nil } + +func (f matchStringOnly) ReadCorpus(string, []reflect.Type) ([]corpusEntry, error) { + return nil, nil +} + +func (f matchStringOnly) CheckCorpus([]any, []reflect.Type) error { return nil } + +func (f matchStringOnly) ResetCoverage() {} +func (f matchStringOnly) SnapshotCoverage() {} diff --git a/cmd/omni-integration-test/root.go b/cmd/omni-integration-test/root.go new file mode 100644 index 00000000..53a0eb7a --- /dev/null +++ b/cmd/omni-integration-test/root.go @@ -0,0 +1,149 @@ +// Copyright (c) 2024 Sidero Labs, Inc. +// +// Use of this software is governed by the Business Source License +// included in the LICENSE file. + +package main + +import ( + "context" + "errors" + "fmt" + "net/url" + "os" + "os/exec" + "os/signal" + + "github.com/mattn/go-shellwords" + "github.com/spf13/cobra" + + clientconsts "github.com/siderolabs/omni/client/pkg/constants" + "github.com/siderolabs/omni/cmd/omni-integration-test/pkg/clientconfig" + "github.com/siderolabs/omni/cmd/omni-integration-test/pkg/tests" + "github.com/siderolabs/omni/internal/pkg/constants" +) + +// rootCmd represents the base command when called without any subcommands. +var rootCmd = &cobra.Command{ + Use: "omni-integration-test", + Short: "Omni integration test runner.", + Long: ``, + RunE: func(*cobra.Command, []string) error { + return withContext(func(ctx context.Context) error { + // hacky hack + os.Args = append(os.Args[0:1], "-test.v") + + testOptions := tests.Options{ + RunTestPattern: rootCmdFlags.runTestPattern, + + ExpectedMachines: rootCmdFlags.expectedMachines, + + MachineOptions: rootCmdFlags.machineOptions, + AnotherTalosVersion: rootCmdFlags.anotherTalosVersion, + AnotherKubernetesVersion: rootCmdFlags.anotherKubernetesVersion, + } + + if rootCmdFlags.restartAMachineScript != "" { + parsedScript, err := shellwords.Parse(rootCmdFlags.restartAMachineScript) + if err != nil { + return fmt.Errorf("error parsing restart a machine script: %w", err) + } + + testOptions.RestartAMachineFunc = func(ctx context.Context, uuid string) error { + return execCmd(ctx, parsedScript, uuid) + } + } + + if rootCmdFlags.wipeAMachineScript != "" { + parsedScript, err := shellwords.Parse(rootCmdFlags.wipeAMachineScript) + if err != nil { + return fmt.Errorf("error parsing wipe a machine script: %w", err) + } + + testOptions.WipeAMachineFunc = func(ctx context.Context, uuid string) error { + return execCmd(ctx, parsedScript, uuid) + } + } + + if rootCmdFlags.freezeAMachineScript != "" { + parsedScript, err := shellwords.Parse(rootCmdFlags.freezeAMachineScript) + if err != nil { + return fmt.Errorf("error parsing freeze a machine script: %w", err) + } + + testOptions.FreezeAMachineFunc = func(ctx context.Context, uuid string) error { + return execCmd(ctx, parsedScript, uuid) + } + } + + u, err := url.Parse(rootCmdFlags.endpoint) + if err != nil { + return errors.New("error parsing endpoint") + } + + if u.Scheme == "grpc" { + u.Scheme = "http" + } + + testOptions.HTTPEndpoint = u.String() + + clientConfig := clientconfig.New(rootCmdFlags.endpoint) + defer clientConfig.Close() //nolint:errcheck + + return tests.Run(ctx, clientConfig, testOptions) + }) + }, +} + +func execCmd(ctx context.Context, parsedScript []string, args ...string) error { + cmd := exec.CommandContext(ctx, parsedScript[0], append(parsedScript[1:], args...)...) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + + return cmd.Run() +} + +//nolint:govet +var rootCmdFlags struct { + endpoint string + runTestPattern string + + expectedMachines int + + restartAMachineScript string + wipeAMachineScript string + freezeAMachineScript string + anotherTalosVersion string + anotherKubernetesVersion string + + machineOptions tests.MachineOptions +} + +func init() { + rootCmd.PersistentFlags().StringVar(&rootCmdFlags.endpoint, "endpoint", "grpc://127.0.0.1:8080", "The endpoint of the Omni API.") + rootCmd.Flags().StringVar(&rootCmdFlags.runTestPattern, "test.run", "", "tests to run (regular expression)") + rootCmd.Flags().IntVar(&rootCmdFlags.expectedMachines, "expected-machines", 4, "minimum number of machines expected") + rootCmd.Flags().StringVar(&rootCmdFlags.restartAMachineScript, "restart-a-machine-script", "hack/test/restart-a-vm.sh", "a script to run to restart a machine by UUID (optional)") + rootCmd.Flags().StringVar(&rootCmdFlags.wipeAMachineScript, "wipe-a-machine-script", "hack/test/wipe-a-vm.sh", "a script to run to wipe a machine by UUID (optional)") + rootCmd.Flags().StringVar(&rootCmdFlags.freezeAMachineScript, "freeze-a-machine-script", "hack/test/freeze-a-vm.sh", "a script to run to freeze a machine by UUID (optional)") + rootCmd.Flags().StringVar(&rootCmdFlags.anotherTalosVersion, "another-talos-version", + constants.AnotherTalosVersion, + "Talos version for upgrade test", + ) + rootCmd.Flags().StringVar( + &rootCmdFlags.machineOptions.TalosVersion, + "talos-version", + clientconsts.DefaultTalosVersion, + "installer version for workload clusters", + ) + rootCmd.Flags().StringVar(&rootCmdFlags.machineOptions.KubernetesVersion, "kubernetes-version", constants.DefaultKubernetesVersion, "Kubernetes version for workload clusters") + rootCmd.Flags().StringVar(&rootCmdFlags.anotherKubernetesVersion, "another-kubernetes-version", constants.AnotherKubernetesVersion, "Kubernetes version for upgrade tests") +} + +// withContext wraps with CLI context. +func withContext(f func(ctx context.Context) error) error { + ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt) + defer stop() + + return f(ctx) +} diff --git a/cmd/omni/main.go b/cmd/omni/main.go new file mode 100644 index 00000000..1075d34e --- /dev/null +++ b/cmd/omni/main.go @@ -0,0 +1,424 @@ +// Copyright (c) 2024 Sidero Labs, Inc. +// +// Use of this software is governed by the Business Source License +// included in the LICENSE file. + +// Package main ... +package main + +import ( + "context" + "errors" + "fmt" + "os" + "os/signal" + "strings" + "syscall" + + "github.com/cosi-project/runtime/pkg/state" + "github.com/go-logr/zapr" + "github.com/prometheus/client_golang/prometheus" + "github.com/siderolabs/gen/ensure" + "github.com/siderolabs/go-debug" + "github.com/siderolabs/talos/pkg/machinery/config/generate" + "github.com/spf13/cobra" + "go.uber.org/zap" + "go.uber.org/zap/zapcore" + "k8s.io/klog/v2" + + "github.com/siderolabs/omni/client/pkg/constants" + authres "github.com/siderolabs/omni/client/pkg/omni/resources/auth" + "github.com/siderolabs/omni/internal/backend" + "github.com/siderolabs/omni/internal/backend/dns" + "github.com/siderolabs/omni/internal/backend/logging" + "github.com/siderolabs/omni/internal/backend/resourcelogger" + "github.com/siderolabs/omni/internal/backend/runtime/omni" + "github.com/siderolabs/omni/internal/backend/runtime/omni/virtual" + "github.com/siderolabs/omni/internal/backend/runtime/talos" + "github.com/siderolabs/omni/internal/backend/workloadproxy" + "github.com/siderolabs/omni/internal/pkg/auth" + "github.com/siderolabs/omni/internal/pkg/auth/actor" + "github.com/siderolabs/omni/internal/pkg/auth/user" + "github.com/siderolabs/omni/internal/pkg/config" + "github.com/siderolabs/omni/internal/pkg/features" + "github.com/siderolabs/omni/internal/pkg/siderolink" + "github.com/siderolabs/omni/internal/version" +) + +func runDebugServer(ctx context.Context, logger *zap.Logger) { + const debugAddr = ":9980" + + debugLogFunc := func(msg string) { + logger.Info(msg) + } + + if err := debug.ListenAndServe(ctx, debugAddr, debugLogFunc); err != nil { + logger.Panic("failed to start debug server", zap.Error(err)) + } +} + +// rootCmd represents the base command when called without any subcommands. +var rootCmd = &cobra.Command{ + Use: "omni", + Short: "Talos and Sidero frontend", + Long: ``, + SilenceUsage: true, + Version: version.Tag, + RunE: func(*cobra.Command, []string) error { + if config.Config.Auth.SAML.URL != "" && config.Config.Auth.SAML.Metadata != "" { + return errors.New("flags --auth-saml-url and --auth-saml-metadata are mutually exclusive") + } + + var loggerConfig zap.Config + + if constants.IsDebugBuild { + loggerConfig = zap.NewDevelopmentConfig() + loggerConfig.EncoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder + } else { + loggerConfig = zap.NewProductionConfig() + } + + if !rootCmdArgs.debug { + loggerConfig.Level.SetLevel(zap.InfoLevel) + } else { + loggerConfig.Level.SetLevel(zap.DebugLevel) + } + + logger, err := loggerConfig.Build( + zap.AddStacktrace(zapcore.FatalLevel), // only print stack traces for fatal errors + ) + if err != nil { + return fmt.Errorf("failed to set up logging: %w", err) + } + + // set kubernetes logger to use warn log level and use zap + klog.SetLogger(zapr.NewLogger(logger.WithOptions(zap.IncreaseLevel(zapcore.WarnLevel)).With(logging.Component("kubernetes")))) + + if constants.IsDebugBuild { + logger.Warn("running debug build") + } + + for _, registryMirror := range rootCmdArgs.registryMirrors { + hostname, endpoint, ok := strings.Cut(registryMirror, "=") + if !ok { + return fmt.Errorf("invalid registry mirror spec: %q", registryMirror) + } + + config.Config.DefaultConfigGenOptions = append(config.Config.DefaultConfigGenOptions, generate.WithRegistryMirror(hostname, endpoint)) + } + + logger.Info("starting Omni", zap.String("version", version.Tag)) + + logger.Debug("using config", zap.Any("config", config.Config)) + + signals := make(chan os.Signal, 1) + + signal.Notify(signals, syscall.SIGINT, syscall.SIGTERM) + + ctx, stop := context.WithCancel(context.Background()) + defer stop() + + // do not use signal.NotifyContext as it doesn't support any ways to log the received signal + go func() { + s := <-signals + + logger.Warn("signal received, stopping Omni", zap.String("signal", s.String())) + + stop() + }() + + go runDebugServer(ctx, logger) + + // this global context propagates into all controllers and any other background activities + ctx = actor.MarkContextAsInternalActor(ctx) + + err = omni.NewState(ctx, config.Config, logger, prometheus.DefaultRegisterer, runWithState(logger)) + if err != nil { + return fmt.Errorf("failed to run Omni: %w", err) + } + + return nil + }, +} + +func runWithState(logger *zap.Logger) func(context.Context, state.State, *virtual.State) error { + return func(ctx context.Context, resourceState state.State, virtualState *virtual.State) error { + talosClientFactory := talos.NewClientFactory(resourceState, logger) + prometheus.MustRegister(talosClientFactory) + + dnsService := dns.NewService(resourceState, logger) + + workloadProxyServiceRegistry, err := workloadproxy.NewServiceRegistry(resourceState, logger) + if err != nil { + return fmt.Errorf("failed to set up workload proxy service registry: %w", err) + } + + var resourceLogger *resourcelogger.Logger + + if len(config.Config.LogResourceUpdatesTypes) > 0 { + resourceLogger, err = resourcelogger.New(ctx, resourceState, logger.With(logging.Component("resourcelogger")), + config.Config.LogResourceUpdatesLogLevel, config.Config.LogResourceUpdatesTypes...) + if err != nil { + return fmt.Errorf("failed to set up resource logger: %w", err) + } + } + + linkCounterDeltaCh := make(chan siderolink.LinkCounterDeltas) + + omniRuntime, err := omni.New(talosClientFactory, dnsService, workloadProxyServiceRegistry, resourceLogger, + linkCounterDeltaCh, resourceState, virtualState, prometheus.DefaultRegisterer, logger.With(logging.Component("omni_runtime"))) + if err != nil { + return fmt.Errorf("failed to set up the controller runtime: %w", err) + } + + machineMap := siderolink.NewMachineMap(siderolink.NewStateStorage(omniRuntime.State())) + logHandler := siderolink.NewLogHandler( + machineMap, + resourceState, + &config.Config.LogStorage, + logger.With(logging.Component("siderolink_log_handler")), + ) + + talosRuntime := talos.New(talosClientFactory, logger) + + err = user.EnsureInitialResources(ctx, omniRuntime.State(), logger, config.Config.InitialUsers) + if err != nil { + return fmt.Errorf("failed to write initial user resources to state: %w", err) + } + + authConfig, err := auth.EnsureAuthConfigResource(ctx, omniRuntime.State(), logger, config.Config.Auth) + if err != nil { + return fmt.Errorf("failed to write Auth0 parameters to state: %w", err) + } + + if err = features.UpdateResources(ctx, omniRuntime.State(), logger); err != nil { + return fmt.Errorf("failed to update features config resources: %w", err) + } + + ctx = context.WithValue(ctx, auth.EnabledAuthContextKey{}, authres.Enabled(authConfig)) + + handler, err := backend.NewFrontendHandler(rootCmdArgs.frontendDst, logger) + if err != nil { + return fmt.Errorf("failed to set up frontend handler: %w", err) + } + + server, err := backend.NewServer( + rootCmdArgs.bindAddress, + rootCmdArgs.metricsBindAddress, + rootCmdArgs.k8sProxyBindAddress, + rootCmdArgs.pprofBindAddress, + dnsService, + workloadProxyServiceRegistry, + linkCounterDeltaCh, + omniRuntime, + talosRuntime, + logHandler, + authConfig, + rootCmdArgs.keyFile, + rootCmdArgs.certFile, + backend.NewProxyServer(rootCmdArgs.frontendBind, handler, rootCmdArgs.keyFile, rootCmdArgs.certFile), + logger, + ) + if err != nil { + return fmt.Errorf("failed to create server: %w", err) + } + + if err := server.Run(ctx); err != nil { + return fmt.Errorf("failed to run server: %w", err) + } + + return nil + } +} + +var rootCmdArgs struct { + bindAddress string + frontendBind string + frontendDst string + k8sProxyBindAddress string + metricsBindAddress string + pprofBindAddress string + keyFile string + certFile string + registryMirrors []string + + debug bool +} + +func main() { + if err := rootCmd.Execute(); err != nil { + os.Exit(1) + } +} + +func init() { + rootCmd.Flags().BoolVar(&rootCmdArgs.debug, "debug", false, "enable debug logs.") + rootCmd.Flags().StringVar(&rootCmdArgs.bindAddress, "bind-addr", "0.0.0.0:8080", "start HTTP server on the defined address.") + rootCmd.Flags().StringVar(&rootCmdArgs.frontendDst, "frontend-dst", "", "destination address non API requests from proxy server.") + rootCmd.Flags().StringVar(&rootCmdArgs.frontendBind, "frontend-bind", "", "proxy server which will redirect all non API requests to the definied frontend server.") + rootCmd.Flags().StringVar(&rootCmdArgs.metricsBindAddress, "metrics-bind-addr", "0.0.0.0:2122", "start Prometheus HTTP server on the defined address.") + rootCmd.Flags().StringVar(&rootCmdArgs.pprofBindAddress, "pprof-bind-addr", "", "start pprof HTTP server on the defined address (\"\" if disabled).") + rootCmd.Flags().StringVar(&rootCmdArgs.k8sProxyBindAddress, "k8s-proxy-bind-addr", "0.0.0.0:8095", "start Kubernetes workload proxy on the defined address.") + rootCmd.Flags().StringSliceVar(&rootCmdArgs.registryMirrors, "registry-mirror", []string{}, "list of registry mirrors to use in format: <registry host>=<mirror URL>") + + rootCmd.Flags().StringVar(&config.Config.AccountID, "account-id", config.Config.AccountID, "instance account ID, should never be changed.") + rootCmd.Flags().StringVar(&config.Config.Name, "name", config.Config.Name, "instance user-facing name.") + rootCmd.Flags().StringVar(&config.Config.APIURL, "advertised-api-url", config.Config.APIURL, "advertised API frontend URL.") + rootCmd.Flags().StringVar(&config.Config.KubernetesProxyURL, "advertised-kubernetes-proxy-url", config.Config.KubernetesProxyURL, "advertised Kubernetes proxy URL.") + rootCmd.Flags().BoolVar(&config.Config.SiderolinkDisableLastEndpoint, "siderolink-disable-last-endpoint", false, "do not populate last known peer endpoint for the wireguard peers") + rootCmd.Flags().StringVar( + &config.Config.SiderolinkWireguardAdvertisedAddress, + "siderolink-wireguard-advertised-addr", + config.Config.SiderolinkWireguardAdvertisedAddress, + "advertised wireguard address which is passed down to the nodes.") + rootCmd.Flags().StringVar(&config.Config.SiderolinkWireguardBindAddress, "siderolink-wireguard-bind-addr", config.Config.SiderolinkWireguardBindAddress, "Siderolink wireguard bind address.") + + rootCmd.Flags().StringVar(&config.Config.MachineAPIBindAddress, "siderolink-api-bind-addr", config.Config.MachineAPIBindAddress, "SideroLink provision bind address.") + rootCmd.Flags().StringVar(&config.Config.MachineAPICertFile, "siderolink-api-cert", config.Config.MachineAPICertFile, "SideroLink TLS cert file path.") + rootCmd.Flags().StringVar(&config.Config.MachineAPIKeyFile, "siderolink-api-key", config.Config.MachineAPIKeyFile, "SideroLink TLS key file path.") + + rootCmd.Flags().MarkDeprecated("siderolink-api-bind-addr", "--deprecated, use --machine-api-bind-addr") //nolint:errcheck + rootCmd.Flags().MarkDeprecated("siderolink-api-cert", "deprecated, use --machine-api-cert") //nolint:errcheck + rootCmd.Flags().MarkDeprecated("siderolink-api-key", "deprecated, use --machine-api-key") //nolint:errcheck + + rootCmd.Flags().StringVar(&config.Config.MachineAPIBindAddress, "machine-api-bind-addr", config.Config.MachineAPIBindAddress, "machine API bind address.") + rootCmd.Flags().StringVar(&config.Config.MachineAPICertFile, "machine-api-cert", config.Config.MachineAPICertFile, "machine API TLS cert file path.") + rootCmd.Flags().StringVar(&config.Config.MachineAPIKeyFile, "machine-api-key", config.Config.MachineAPIKeyFile, "machine API TLS key file path.") + + rootCmd.Flags().IntVar(&config.Config.EventSinkPort, "event-sink-port", config.Config.EventSinkPort, "event sink bind port.") + rootCmd.Flags().StringVar(&config.Config.SideroLinkAPIURL, "siderolink-api-advertised-url", config.Config.SideroLinkAPIURL, "SideroLink advertised API URL.") + rootCmd.Flags().IntVar(&config.Config.LoadBalancer.MinPort, "lb-min-port", config.Config.LoadBalancer.MinPort, "cluster load balancer port range min value.") + rootCmd.Flags().IntVar(&config.Config.LoadBalancer.MaxPort, "lb-max-port", config.Config.LoadBalancer.MaxPort, "cluster load balancer port range max value.") + rootCmd.Flags().IntVar(&config.Config.LogServerPort, "log-server-port", config.Config.LogServerPort, "port for TCP log server") + + rootCmd.Flags().BoolVar(&config.Config.LogStorage.Enabled, "log-storage-enabled", config.Config.LogStorage.Enabled, "enable log storage") + rootCmd.Flags().StringVar(&config.Config.LogStorage.Path, "log-storage-path", config.Config.LogStorage.Path, "path of the directory for storing logs") + rootCmd.Flags().DurationVar(&config.Config.LogStorage.FlushPeriod, "log-storage-flush-period", config.Config.LogStorage.FlushPeriod, "period for flushing logs to disk") + + rootCmd.Flags().BoolVar(&config.Config.Auth.Auth0.Enabled, "auth-auth0-enabled", config.Config.Auth.Auth0.Enabled, + "enable Auth0 authentication. Once set to true, it cannot be set back to false.") + rootCmd.Flags().StringVar(&config.Config.Auth.Auth0.ClientID, "auth-auth0-client-id", config.Config.Auth.Auth0.ClientID, "Auth0 application client ID.") + rootCmd.Flags().StringVar(&config.Config.Auth.Auth0.Domain, "auth-auth0-domain", config.Config.Auth.Auth0.Domain, "Auth0 application domain.") + + rootCmd.Flags().BoolVar(&config.Config.Auth.WebAuthn.Enabled, "auth-webauthn-enabled", config.Config.Auth.WebAuthn.Enabled, + "enable WebAuthn authentication. Once set to true, it cannot be set back to false.") + rootCmd.Flags().BoolVar(&config.Config.Auth.WebAuthn.Required, "auth-webauthn-required", config.Config.Auth.WebAuthn.Required, + "require WebAuthn authentication. Once set to true, it cannot be set back to false.") + + rootCmd.Flags().BoolVar(&config.Config.Auth.SAML.Enabled, "auth-saml-enabled", config.Config.Auth.SAML.Enabled, + "enabled SAML authentication.", + ) + rootCmd.Flags().StringVar(&config.Config.Auth.SAML.URL, "auth-saml-url", config.Config.Auth.SAML.URL, "SAML identity provider metadata URL (mutually exclusive with --auth-saml-metadata") + rootCmd.Flags().StringVar(&config.Config.Auth.SAML.Metadata, "auth-saml-metadata", config.Config.Auth.SAML.Metadata, + "SAML identity provider metadata file path (mutually exclusive with --auth-saml-url).", + ) + rootCmd.Flags().Var(&config.Config.Auth.SAML.LabelRules, "auth-saml-label-rules", "defines mapping of SAML assertion attributes into Omni identity labels") + + rootCmd.Flags().StringSliceVar(&config.Config.InitialUsers, "initial-users", config.Config.InitialUsers, "initial set of user emails. these users will be created on startup.") + + rootCmd.Flags().StringVar(&config.Config.Storage.Kind, "storage-kind", config.Config.Storage.Kind, "storage type: etcd|boltdb.") + rootCmd.Flags().BoolVar(&config.Config.Storage.Etcd.Embedded, "etcd-embedded", config.Config.Storage.Etcd.Embedded, "use embedded etcd server.") + rootCmd.Flags().BoolVar(&config.Config.Storage.Etcd.EmbeddedUnsafeFsync, "etcd-embedded-unsafe-fsync", config.Config.Storage.Etcd.EmbeddedUnsafeFsync, + "disable fsync in the embedded etcd server (dangerous).") + rootCmd.Flags().StringSliceVar(&config.Config.Storage.Etcd.Endpoints, "etcd-endpoints", config.Config.Storage.Etcd.Endpoints, "external etcd endpoints.") + rootCmd.Flags().StringVar(&config.Config.Storage.Etcd.CAPath, "etcd-ca-path", config.Config.Storage.Etcd.CAPath, "external etcd CA path.") + rootCmd.Flags().StringVar(&config.Config.Storage.Etcd.CertPath, "etcd-client-cert-path", config.Config.Storage.Etcd.CertPath, "external etcd client cert path.") + rootCmd.Flags().StringVar(&config.Config.Storage.Etcd.KeyPath, "etcd-client-key-path", config.Config.Storage.Etcd.KeyPath, "external etcd client key path.") + + rootCmd.Flags().StringVar(&config.Config.SecondaryStorage.Path, "secondary-storage-path", config.Config.SecondaryStorage.Path, + "path of the file for boltdb-backed secondary storage for frequently updated data.") + + rootCmd.Flags().StringVar(&config.Config.TalosRegistry, "talos-installer-registry", config.Config.TalosRegistry, "Talos installer image registry.") + rootCmd.Flags().StringVar(&config.Config.KubernetesRegistry, "kubernetes-registry", config.Config.KubernetesRegistry, "Kubernetes container registry.") + rootCmd.Flags().StringVar(&config.Config.ImageFactoryBaseURL, "image-factory-address", config.Config.ImageFactoryBaseURL, "Image factory base URL to use.") + rootCmd.Flags().StringVar(&config.Config.ImageFactoryPXEBaseURL, "image-factory-pxe-address", config.Config.ImageFactoryPXEBaseURL, "Image factory pxe base URL to use.") + + rootCmd.Flags().StringVar( + &config.Config.Storage.Etcd.PrivateKeySource, + "private-key-source", + config.Config.Storage.Etcd.PrivateKeySource, + "file containing private key to use for decrypting master key slot.", + ) + rootCmd.Flags().StringSliceVar( + &config.Config.Storage.Etcd.PublicKeyFiles, + "public-key-files", + config.Config.Storage.Etcd.PublicKeyFiles, + "list of paths to files containing public keys to use for encrypting keys slots.", + ) + + rootCmd.Flags().DurationVar( + &config.Config.KeyPruner.Interval, + "public-key-pruning-interval", + config.Config.KeyPruner.Interval, + "interval between public key pruning runs.", + ) + + rootCmd.Flags().BoolVar(&config.Config.Auth.Suspended, "suspended", config.Config.Auth.Suspended, "start omni in suspended (read-only) mode.") + + rootCmd.Flags().BoolVar(&config.Config.EnableTalosPreReleaseVersions, "enable-talos-pre-release-versions", config.Config.EnableTalosPreReleaseVersions, + "make Omni version discovery controler include Talos pre-release versions.") + + rootCmd.Flags().BoolVar(&config.Config.WorkloadProxying.Enabled, "workload-proxying-enabled", config.Config.WorkloadProxying.Enabled, "enable workload proxying feature.") + + rootCmd.Flags().IntVar(&config.Config.LocalResourceServerPort, "local-resource-server-port", config.Config.LocalResourceServerPort, "port for local read-only public resource server.") + + ensure.NoError(rootCmd.MarkFlagRequired("private-key-source")) + ensure.NoError(rootCmd.Flags().MarkHidden("etcd-embedded-unsafe-fsync")) + + rootCmd.Flags().StringVar(&rootCmdArgs.keyFile, "key", "", "TLS key file") + rootCmd.Flags().StringVar(&rootCmdArgs.certFile, "cert", "", "TLS cert file") + + rootCmd.Flags().BoolVar( + &config.Config.EtcdBackup.S3Enabled, + "etcd-backup-s3", + config.Config.EtcdBackup.S3Enabled, + "S3 will be used for cluster etcd backups", + ) + + rootCmd.Flags().StringVar( + &config.Config.EtcdBackup.LocalPath, + "etcd-backup-local-path", + config.Config.EtcdBackup.LocalPath, + "path to local directory for cluster etcd backups", + ) + + rootCmd.MarkFlagsMutuallyExclusive("etcd-backup-s3", "etcd-backup-local-path") + + rootCmd.Flags().DurationVar( + &config.Config.EtcdBackup.TickInterval, + "etcd-backup-tick-interval", + config.Config.EtcdBackup.TickInterval, + "interval between etcd backups ticks (controller events to check if any cluster needs to be backed up)", + ) + + rootCmd.Flags().DurationVar( + &config.Config.EtcdBackup.MinInterval, + "etcd-backup-min-interval", + config.Config.EtcdBackup.MinInterval, + "minimal interval between etcd backups", + ) + + rootCmd.Flags().DurationVar( + &config.Config.EtcdBackup.MaxInterval, + "etcd-backup-max-interval", + config.Config.EtcdBackup.MaxInterval, + "maximal interval between etcd backups", + ) + + rootCmd.Flags().StringSliceVar(&config.Config.LogResourceUpdatesTypes, + "log-resource-updates-types", + config.Config.LogResourceUpdatesTypes, + "list of resource types whose updates should be logged", + ) + rootCmd.Flags().StringVar(&config.Config.LogResourceUpdatesLogLevel, + "log-resource-updates-log-level", + config.Config.LogResourceUpdatesLogLevel, + "log level for resource updates", + ) + + rootCmd.Flags().BoolVar(&config.Config.DisableControllerRuntimeCache, + "disable-controller-runtime-cache", + config.Config.DisableControllerRuntimeCache, + "disable watch-based cache for controller-runtime (affects performance)", + ) +} diff --git a/cmd/omnictl/main.go b/cmd/omnictl/main.go new file mode 100644 index 00000000..fb8827dd --- /dev/null +++ b/cmd/omnictl/main.go @@ -0,0 +1,28 @@ +// Copyright (c) 2024 Sidero Labs, Inc. +// +// Use of this software is governed by the Business Source License +// included in the LICENSE file. + +// Package main initializes omnictl CLI. +package main + +import ( + "os" + + "github.com/siderolabs/omni/client/pkg/omnictl" + "github.com/siderolabs/omni/client/pkg/version" + internalversion "github.com/siderolabs/omni/internal/version" +) + +func main() { + version.Name = internalversion.Name + version.SHA = internalversion.SHA + version.Tag = internalversion.Tag + version.API = internalversion.API + + omnictl.RootCmd.Version = version.String() + + if err := omnictl.RootCmd.Execute(); err != nil { + os.Exit(1) + } +} diff --git a/docs/context.md b/docs/context.md new file mode 100644 index 00000000..3ddd9af8 --- /dev/null +++ b/docs/context.md @@ -0,0 +1,105 @@ +# Using the Context on the Client + +The UI backend allows communication with 3 different systems: + +- `kubernetes` - is using Kubernetes Go client underneath and talks to the +Kubernetes resource API. +- `talos` - talks directly to Talos node API. +COSI Resource API has almost the same request parameters and responses as Kubernetes resource API. +Also provides a way to call any machine APIs. +- `omni` - consists of COSI resource API describing the UI internal state. + +The context plays an important role while doing resource APIs of any kinds and +doing Talos API requests. + +Depending on the system kind context can contain different options. + +Context can contain the following fields: + +- `name` - kubeconfig context name. +- `cluster.uid` - CAPI cluster uid (from `metadata.uid`). +- `cluster.namespace` - CAPI cluster namespace (from `metadata.namespace`). +- `cluster.name` - CAPI cluster name (from `metadata.name`) +- `nodes` - Talos nodes IP. + +## Kubernetes Context Kinds + +Talking to the cluster from the Kubeconfig: + +```typescript +context = { + name: 'admin@talos-default' +} +``` + +Talking to the cluster which is managed by the cluster from the Kubeconfig: + +```typescript +context = { + name: 'admin@talos-default', + cluster: { + namespace: 'default', + name: 'cluster-1', + uid: '66be7aba-7c93-4766-b4ec-c5313fb831a2' + } +} +``` + +## Talos Context Kinds + +Talking to a node in the cluster from the Kubeconfig: + +```typescript +context = { + name: 'admin@talos-default', + nodes: ['10.5.0.2'] +} +``` + +Doing multiple nodes requests is also supported: + +```typescript +context = { + name: 'admin@talos-default', + nodes: ['10.5.0.2', '10.5.0.3'] +} +``` + +Talking to the nodes in the cluster managed by the cluster from the Kubeconfig: + +```typescript +context = { + name: 'admin@talos-default', + cluster: { + namespace: 'default', + name: 'cluster-1', + uid: '66be7aba-7c93-4766-b4ec-c5313fb831a2' + }, + nodes: ['172.24.0.2'] +} +``` + +### Omni Context Kinds + +Omni context doesn't need any parameters as it doesn't proxy requests anywhere in that case. + +## Context helpers methods + +### `getContext` from `@/context` + +Extracts context options from the URL query parameters. +Query should be in the following format: + +```bash +/?name=<context name>&cluster=<cluster name>&namespace=<cluster namespace>&uid=<cluster uid>&node=<node ip> +``` + +> Note: it doesn't support multiple nodes + +### `contextName` from `@/context` + +Gets current Kubernetes context name defined in the local storage. + +### `changeContext` from `@/context` + +Changes current Kubernetes context. diff --git a/docs/examples/template/cluster1.yaml b/docs/examples/template/cluster1.yaml new file mode 100644 index 00000000..d457b0e7 --- /dev/null +++ b/docs/examples/template/cluster1.yaml @@ -0,0 +1,43 @@ +kind: Cluster +name: my-cluster +kubernetes: + version: v1.26.0 +talos: + version: v1.3.2 +patches: + - name: kubespan-enabled + inline: + machine: + network: + kubespan: + enabled: true +--- +kind: ControlPlane +machines: + - 27c16241-96bf-4f17-9579-ea3a6c4a3ca8 + - 4bd92fba-998d-4ef3-ab43-638b806dd3fe + - 8fdb574a-a252-4d7d-94f0-5cdea73e140a +--- +kind: Workers +machines: + - b885f565-b64f-4c7a-a1ac-d2c8c2781373 +--- +kind: Machine +name: 27c16241-96bf-4f17-9579-ea3a6c4a3ca8 +install: + disk: /dev/vda +--- +kind: Machine +name: 4bd92fba-998d-4ef3-ab43-638b806dd3fe +install: + disk: /dev/vda +--- +kind: Machine +name: 8fdb574a-a252-4d7d-94f0-5cdea73e140a +install: + disk: /dev/vda +--- +kind: Machine +name: b885f565-b64f-4c7a-a1ac-d2c8c2781373 +install: + disk: /dev/vda diff --git a/frontend/.eslintrc.yaml b/frontend/.eslintrc.yaml new file mode 100644 index 00000000..cf7c683b --- /dev/null +++ b/frontend/.eslintrc.yaml @@ -0,0 +1,20 @@ +# THIS FILE WAS AUTOMATICALLY GENERATED, PLEASE DO NOT EDIT. +# +# Generated on 2022-06-30T21:22:58Z by kres latest. + +--- +root: true +env: + node: true +ignorePatterns: + - "**/*.pb.ts" +extends: + - "plugin:vue/vue3-essential" + - "eslint:recommended" + - "@vue/typescript" +rules: { + "no-console": off, + "no-unused-vars": off, + "vue/multi-word-component-names": off, + "@typescript-eslint/no-unused-vars": error +} diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 00000000..7a396c70 --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,4 @@ +# THIS FILE WAS AUTOMATICALLY GENERATED, PLEASE DO NOT EDIT. +# +# Generated on 2021-03-25T18:30:52Z by kres 9833490-dirty. + diff --git a/frontend/LICENSE b/frontend/LICENSE new file mode 100644 index 00000000..a612ad98 --- /dev/null +++ b/frontend/LICENSE @@ -0,0 +1,373 @@ +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. diff --git a/frontend/babel.config.js b/frontend/babel.config.js new file mode 100644 index 00000000..9a594cf8 --- /dev/null +++ b/frontend/babel.config.js @@ -0,0 +1,9 @@ +// THIS FILE WAS AUTOMATICALLY GENERATED, PLEASE DO NOT EDIT. +// +// Generated on 2021-12-13T13:49:17Z by kres 3dbe8c4-dirty. + +module.exports = { + presets: [ + '@vue/cli-plugin-babel/preset' + ] +} diff --git a/frontend/jest.config.js b/frontend/jest.config.js new file mode 100644 index 00000000..c76e04b0 --- /dev/null +++ b/frontend/jest.config.js @@ -0,0 +1,8 @@ +// Copyright (c) 2024 Sidero Labs, Inc. +// +// Use of this software is governed by the Business Source License +// included in the LICENSE file. + +module.exports = { + preset: '@vue/cli-plugin-unit-jest/presets/typescript-and-babel/' +} diff --git a/frontend/package-lock.json b/frontend/package-lock.json new file mode 100644 index 00000000..5c158501 --- /dev/null +++ b/frontend/package-lock.json @@ -0,0 +1,33598 @@ +{ + "name": "omni-web", + "version": "0.0.1", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "omni-web", + "version": "0.0.1", + "dependencies": { + "@auth0/auth0-vue": "^1.0.2", + "@headlessui/vue": "^1.6.5", + "@heroicons/vue": "^2.0.0", + "@stardazed/streams-polyfill": "^2.4.0", + "apexcharts": "^3.35.3", + "buffer": "^6.0.3", + "click-outside-vue3": "^4.0.1", + "core-js": "^3.23.3", + "fetch-intercept": "^2.4.0", + "js-yaml": "^4.1.0", + "long": "^5.2.0", + "luxon": "^2.4.0", + "monaco-editor-vue3": "^0.1.10", + "monaco-yaml": "^4.0.4", + "pluralize": "^8.0.0", + "protobufjs": "^6.11.3", + "rxjs": "^7.5.5", + "semver-parser": "^4.0.1", + "slugify": "^1.6.5", + "uuid": "^8.3.2", + "vue": "^3.2.37", + "vue-router": "^4.0.16", + "vue-virtual-scroller": "^2.0.0-beta.3", + "vue-word-highlighter": "^1.0.4", + "vue3-apexcharts": "^1.4.1", + "vue3-clipboard": "^1.0.0", + "vue3-popper": "^1.5.0", + "whatwg-fetch": "^3.6.2" + }, + "devDependencies": { + "@rushstack/eslint-patch": "^1.1.4", + "@types/luxon": "^2.4.0", + "@types/pluralize": "^0.0.29", + "@types/uuid": "^9.0.0", + "@typescript-eslint/eslint-plugin": "^5.30.0", + "@typescript-eslint/parser": "^5.30.0", + "@volar-plugins/vetur": "latest", + "@vue/cli-plugin-babel": "^5.0.6", + "@vue/cli-plugin-eslint": "^5.0.6", + "@vue/cli-plugin-typescript": "^5.0.6", + "@vue/cli-plugin-unit-jest": "^5.0.6", + "@vue/cli-service": "^5.0.6", + "@vue/compiler-sfc": "^3.2.37", + "@vue/eslint-config-typescript": "^11.0.0", + "@vue/test-utils": "^2.0.0", + "autoprefixer": "^10.4.7", + "babel-eslint": "^10.1.0", + "eslint": "^8.18.0", + "eslint-plugin-vue": "^9.1.1", + "jest": "^27.5.1", + "kubernetes-types": "^1.26.0", + "lodash": "^4.17.21", + "openpgp": "^5.5.0", + "postcss": "^8.4.14", + "tailwindcss": "^3.1.4", + "ts-jest": "^27.1.5", + "ts-loader": "^9.3.1", + "typescript": "^4.7.4", + "vue-cli-plugin-tailwind": "^3.0.0" + } + }, + "node_modules/@achrinza/node-ipc": { + "version": "9.2.5", + "resolved": "https://registry.npmjs.org/@achrinza/node-ipc/-/node-ipc-9.2.5.tgz", + "integrity": "sha512-kBX7Ay911iXZ3VZ1pYltj3Rfu7Ow9H7sK4H4RSfWIfWR2JKNB40K808wppoRIEzE2j2hXLU+r6TJgCAliCGhyQ==", + "dev": true, + "dependencies": { + "@node-ipc/js-queue": "2.0.3", + "event-pubsub": "4.3.0", + "js-message": "1.0.7" + }, + "engines": { + "node": "8 || 9 || 10 || 11 || 12 || 13 || 14 || 15 || 16 || 17 || 18" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@auth0/auth0-spa-js": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/@auth0/auth0-spa-js/-/auth0-spa-js-1.22.4.tgz", + "integrity": "sha512-iOboSV+aUsExV1onKvGKEqi626sjJt+61c3EvA4mkn9RM7RV9RMjPI+cInNFHWjwAd2Sdi3LqBj6/MfcHh69dg==", + "dependencies": { + "abortcontroller-polyfill": "^1.7.3", + "browser-tabs-lock": "^1.2.15", + "core-js": "^3.24.0", + "es-cookie": "~1.3.2", + "fast-text-encoding": "^1.0.4", + "promise-polyfill": "^8.2.3", + "unfetch": "^4.2.0" + } + }, + "node_modules/@auth0/auth0-vue": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@auth0/auth0-vue/-/auth0-vue-1.0.2.tgz", + "integrity": "sha512-Oj64AV9ti3AwyKBpEnLvhj16xL2erXFRJrqVI/kvLxYjLnn5GWui/7/iJghvCEHjyxIaJRUtgh3+ZiQgMkDvzQ==", + "dependencies": { + "@auth0/auth0-spa-js": "^1.22.1", + "vue": "^3.2.35" + }, + "peerDependencies": { + "vue-router": "^4.0.12" + }, + "peerDependenciesMeta": { + "vue-router": { + "optional": true + } + } + }, + "node_modules/@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.6.tgz", + "integrity": "sha512-tzulrgDT0QD6U7BJ4TKVk2SDDg7wlP39P9yAx1RfLy7vP/7rsDRlWVfbWxElslu56+r7QOhB2NSDsabYYruoZQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.6.tgz", + "integrity": "sha512-cQbWBpxcbbs/IUredIPkHiAGULLV8iwgNRMFzvbhEXISp4f3rUUXE5+TIw6KwUWUR3DwyI6gmBRnmAtYaWehwQ==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.6", + "@babel/helper-compilation-targets": "^7.18.6", + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helpers": "^7.18.6", + "@babel/parser": "^7.18.6", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.6", + "@babel/types": "^7.18.6", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.18.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.7.tgz", + "integrity": "sha512-shck+7VLlY72a2w9c3zYWuE1pwOKEiQHV7GTUbSnhyl5eu3i04t30tBY82ZRWrDfo3gkakCFtevExnxbkf2a3A==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.7", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.6.tgz", + "integrity": "sha512-KT10c1oWEpmrIRYnthbzHgoOf6B+Xd6a5yhdbNtdhtG7aO1or5HViuf1TQR36xY/QprXA5nvxO6nAjhJ4y38jw==", + "dev": true, + "dependencies": { + "@babel/helper-explode-assignable-expression": "^7.18.6", + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.6.tgz", + "integrity": "sha512-vFjbfhNCzqdeAtZflUFrG5YIFqGTqsctrtkZ1D/NB0mDW9TwW3GmmUepYY4G9wCET5rY5ugz4OGTcLd614IzQg==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.20.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.6.tgz", + "integrity": "sha512-YfDzdnoxHGV8CzqHGyCbFvXg5QESPFkXlHtvdCkesLjjVMT2Adxe4FGUR5ChIb3DxSaXO12iIOCWoXdsUVwnqw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-function-name": "^7.18.6", + "@babel/helper-member-expression-to-functions": "^7.18.6", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz", + "integrity": "sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "regexpu-core": "^5.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", + "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.6.tgz", + "integrity": "sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-explode-assignable-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", + "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.6.tgz", + "integrity": "sha512-0mWMxV1aC97dhjCah5U5Ua7668r5ZmSC2DLfH2EZnf9c3/dHZKiFa5pRLMH5tjSl471tY6496ZWk/kjNONBxhw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.18.6", + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.6.tgz", + "integrity": "sha512-CeHxqwwipekotzPDUuJOfIMtcIHBuc7WAzLmTYWctVigqS5RktNMQ5bEwQSuGewzYnCtTWa3BARXeiLxDTv+Ng==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.6.tgz", + "integrity": "sha512-L//phhB4al5uucwzlimruukHB3jRd5JGClwRMD/ROrVjXfLqovYnvQrK/JK36WYyVwGGO7OD3kMyVTjx+WVPhw==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.18.6", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.6", + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", + "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.6.tgz", + "integrity": "sha512-gvZnm1YAAxh13eJdkb9EWHBnF3eAub3XTLCZEehHT2kWxiKVRL64+ae5Y6Ivne0mVHmMYKT+xWgZO+gQhuLUBg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.6.tgz", + "integrity": "sha512-z5wbmV55TveUPZlCLZvxWHtrjuJd+8inFhk7DG0WW87/oJuGDcjDiu7HIvGcpf5464L6xKCg3vNkmlVVz9hwyQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-wrap-function": "^7.18.6", + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.6.tgz", + "integrity": "sha512-fTf7zoXnUGl9gF25fXCWE26t7Tvtyn6H4hkLSYhATwJvw2uYxd3aoXplMSe0g9XbwK7bmxNes7+FGO0rB/xC0g==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-member-expression-to-functions": "^7.18.6", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/traverse": "^7.18.6", + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", + "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.6.tgz", + "integrity": "sha512-4KoLhwGS9vGethZpAhYnMejWkX64wsnHPDwvOsKWU6Fg4+AlK2Jz3TyjQLMEPvz+1zemi/WBdkYxCD0bAfIkiw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", + "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.6.tgz", + "integrity": "sha512-I5/LZfozwMNbwr/b1vhhuYD+J/mU+gfGAj5td7l5Rv9WYmH6i3Om69WGKNmlIpsVW/mF6O5bvTKbvDQZVgjqOw==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.18.6", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.6", + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.6.tgz", + "integrity": "sha512-vzSiiqbQOghPngUYt/zWGvK3LAsPhz55vc9XNN0xAl2gV4ieShI2OQli5duxWHD+72PZPTKAcfcZDE1Cwc5zsQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.6", + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.6.tgz", + "integrity": "sha512-uQVSa9jJUe/G/304lXspfWVpKpK4euFLgGiMQFOCpM/bgcAdeoHwi/OQz23O9GK2osz26ZiXRRV9aV+Yl1O8tw==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", + "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.6.tgz", + "integrity": "sha512-Udgu8ZRgrBrttVz6A0EVL0SJ1z+RLbIeqsu632SA1hf0awEppD6TvdznoH+orIF8wtFFAV/Enmw9Y+9oV8TQcw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.6.tgz", + "integrity": "sha512-WAz4R9bvozx4qwf74M+sfqPMKfSqwM0phxPTR6iJIi8robgzXwkEgmeJG1gEKhm6sDqT/U9aV3lfcqybIpev8w==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-remap-async-to-generator": "^7.18.6", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-static-block": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", + "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.18.6.tgz", + "integrity": "sha512-gAdhsjaYmiZVxx5vTMiRfj31nB7LhwBJFMSLzeDxc7X4tKLixup0+k9ughn0RcpBrv9E3PBaXJW7jF5TCihAOg==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/plugin-syntax-decorators": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-dynamic-import": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", + "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-namespace-from": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.6.tgz", + "integrity": "sha512-zr/QcUlUo7GPo6+X1wC98NJADqmy5QTFWWhqeQWiki4XHafJtLl/YMGkmRB2szDD2IYJCCdBTd4ElwhId9T7Xw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-json-strings": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", + "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.6.tgz", + "integrity": "sha512-zMo66azZth/0tVd7gmkxOkOjs2rpHyhpcFo565PUP37hSp6hSd9uUKIfTDFMz58BwqgQKhJ9YxtM5XddjXVn+Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.6.tgz", + "integrity": "sha512-9yuM6wr4rIsKa1wlUAbZEazkCrgw2sMPEXCr4Rnwetu7cEW1NydkCWytLuYletbf8vFxdJxFhwEZqMpOx2eZyw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.18.6", + "@babel/helper-compilation-targets": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", + "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.6.tgz", + "integrity": "sha512-PatI6elL5eMzoypFAiYDpYQyMtXTn+iMhuxxQt5mAXD4fEmKorpSI3PHd+i3JXBJN3xyA6MvJv7at23HffFHwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz", + "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.18.6.tgz", + "integrity": "sha512-fqyLgjcxf/1yhyZ6A+yo1u9gJ7eleFQod2lkaUsF9DQ7sbbY3Ligym3L0+I2c0WmqNKDpoD9UTb1AKP3qRMOAQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz", + "integrity": "sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", + "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz", + "integrity": "sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", + "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz", + "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-remap-async-to-generator": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", + "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.6.tgz", + "integrity": "sha512-pRqwb91C42vs1ahSAWJkxOxU1RHWDn16XAa6ggQ72wjLlWyYeAcLvTtE0aM8ph3KNydy9CQF2nLYcjq1WysgxQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.6.tgz", + "integrity": "sha512-XTg8XW/mKpzAF3actL554Jl/dOYoJtv3l8fxaEczpgz84IeeVf+T1u2CSvPHuZbt0w3JkIx4rdn/MRQI7mo0HQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-function-name": "^7.18.6", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.6.tgz", + "integrity": "sha512-9repI4BhNrR0KenoR9vm3/cIc1tSBIo+u1WVjKCAynahj25O8zfbiE6JtAtHPGQSs4yZ+bA8mRasRP+qc+2R5A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.6.tgz", + "integrity": "sha512-tgy3u6lRp17ilY8r1kP4i2+HDUwxlVqq3RTc943eAWSzGgpU1qhiKpqZ5CMyHReIYPHdo3Kg8v8edKtDqSVEyQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", + "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.6.tgz", + "integrity": "sha512-NJU26U/208+sxYszf82nmGYqVF9QN8py2HFTblPT9hbawi8+1C5a9JubODLTGFuT0qlkqVinmkwOD13s0sZktg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", + "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "dev": true, + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.6.tgz", + "integrity": "sha512-WAjoMf4wIiSsy88KmG7tgj2nFdEK7E46tArVtcgED7Bkj6Fg/tG5SbvNIOKxbFS2VFgNh6+iaPswBeQZm4ox8w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.6.tgz", + "integrity": "sha512-kJha/Gbs5RjzIu0CxZwf5e3aTTSlhZnHMT8zPWnJMjNpLOUgqevg+PN5oMH68nMCXnfiMo4Bhgxqj59KHTlAnA==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.18.6", + "@babel/helper-function-name": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.6.tgz", + "integrity": "sha512-x3HEw0cJZVDoENXOp20HlypIHfl0zMIhMVZEBVTfmqbObIpsMxMbmU5nOEO8R7LYT+z5RORKPlTI5Hj4OsO9/Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", + "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz", + "integrity": "sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz", + "integrity": "sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.6.tgz", + "integrity": "sha512-UbPYpXxLjTw6w6yXX2BYNxF3p6QY225wcTkfQCy3OMnSlS/C3xGtwUjEzGkldb/sy6PWLiCQ3NbYfjWUTI3t4g==", + "dev": true, + "dependencies": { + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-identifier": "^7.18.6", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", + "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz", + "integrity": "sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", + "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", + "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.6.tgz", + "integrity": "sha512-FjdqgMv37yVl/gwvzkcB+wfjRI8HQmc5EgOG9iGNvUY1ok+TjsoaMP7IqCDZBhkFcM5f3OPVMs6Dmp03C5k4/A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", + "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz", + "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "regenerator-transform": "^0.15.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", + "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.6.tgz", + "integrity": "sha512-8uRHk9ZmRSnWqUgyae249EJZ94b0yAGLBIqzZzl+0iEdbno55Pmlt/32JZsHwXD9k/uZj18Aqqk35wBX4CBTXA==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "babel-plugin-polyfill-corejs2": "^0.3.1", + "babel-plugin-polyfill-corejs3": "^0.5.2", + "babel-plugin-polyfill-regenerator": "^0.3.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", + "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.6.tgz", + "integrity": "sha512-ayT53rT/ENF8WWexIRg9AiV9h0aIteyWn5ptfZTZQrjk/+f3WdrJGCY4c9wcgl2+MKkKPhzbYp97FTsquZpDCw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", + "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.6.tgz", + "integrity": "sha512-UuqlRrQmT2SWRvahW46cGSany0uTlcj8NYOS5sRGYi8FxPYPoLd5DDmMd32ZXEj2Jq+06uGVQKHxa/hJx2EzKw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.6.tgz", + "integrity": "sha512-7m71iS/QhsPk85xSjFPovHPcH3H9qeyzsujhTc+vcdnsXavoWYJ74zx0lP5RhpC5+iDnVLO+PPMHzC11qels1g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.6.tgz", + "integrity": "sha512-XNRwQUXYMP7VLuy54cr/KS/WeL3AZeORhrmeZ7iewgu+X2eBqmpaLI/hzqr9ZxCeUoq0ASK4GUzSM0BDhZkLFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", + "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.6.tgz", + "integrity": "sha512-WrthhuIIYKrEFAwttYzgRNQ5hULGmwTj+D6l7Zdfsv5M7IWV/OZbUfbeL++Qrzx1nVJwWROIFhCHRYQV4xbPNw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.18.6", + "@babel/helper-compilation-targets": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.6", + "@babel/plugin-proposal-async-generator-functions": "^7.18.6", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-class-static-block": "^7.18.6", + "@babel/plugin-proposal-dynamic-import": "^7.18.6", + "@babel/plugin-proposal-export-namespace-from": "^7.18.6", + "@babel/plugin-proposal-json-strings": "^7.18.6", + "@babel/plugin-proposal-logical-assignment-operators": "^7.18.6", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", + "@babel/plugin-proposal-numeric-separator": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.18.6", + "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.6", + "@babel/plugin-proposal-private-methods": "^7.18.6", + "@babel/plugin-proposal-private-property-in-object": "^7.18.6", + "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.18.6", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.18.6", + "@babel/plugin-transform-async-to-generator": "^7.18.6", + "@babel/plugin-transform-block-scoped-functions": "^7.18.6", + "@babel/plugin-transform-block-scoping": "^7.18.6", + "@babel/plugin-transform-classes": "^7.18.6", + "@babel/plugin-transform-computed-properties": "^7.18.6", + "@babel/plugin-transform-destructuring": "^7.18.6", + "@babel/plugin-transform-dotall-regex": "^7.18.6", + "@babel/plugin-transform-duplicate-keys": "^7.18.6", + "@babel/plugin-transform-exponentiation-operator": "^7.18.6", + "@babel/plugin-transform-for-of": "^7.18.6", + "@babel/plugin-transform-function-name": "^7.18.6", + "@babel/plugin-transform-literals": "^7.18.6", + "@babel/plugin-transform-member-expression-literals": "^7.18.6", + "@babel/plugin-transform-modules-amd": "^7.18.6", + "@babel/plugin-transform-modules-commonjs": "^7.18.6", + "@babel/plugin-transform-modules-systemjs": "^7.18.6", + "@babel/plugin-transform-modules-umd": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6", + "@babel/plugin-transform-new-target": "^7.18.6", + "@babel/plugin-transform-object-super": "^7.18.6", + "@babel/plugin-transform-parameters": "^7.18.6", + "@babel/plugin-transform-property-literals": "^7.18.6", + "@babel/plugin-transform-regenerator": "^7.18.6", + "@babel/plugin-transform-reserved-words": "^7.18.6", + "@babel/plugin-transform-shorthand-properties": "^7.18.6", + "@babel/plugin-transform-spread": "^7.18.6", + "@babel/plugin-transform-sticky-regex": "^7.18.6", + "@babel/plugin-transform-template-literals": "^7.18.6", + "@babel/plugin-transform-typeof-symbol": "^7.18.6", + "@babel/plugin-transform-unicode-escapes": "^7.18.6", + "@babel/plugin-transform-unicode-regex": "^7.18.6", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.18.6", + "babel-plugin-polyfill-corejs2": "^0.3.1", + "babel-plugin-polyfill-corejs3": "^0.5.2", + "babel-plugin-polyfill-regenerator": "^0.3.1", + "core-js-compat": "^3.22.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.6.tgz", + "integrity": "sha512-t9wi7/AW6XtKahAe20Yw0/mMljKq0B1r2fPdvaAdV/KPDZewFXdaaa6K7lxmZBZ8FBNpCiAT6iHPmd6QO9bKfQ==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", + "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.6", + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.6.tgz", + "integrity": "sha512-zS/OKyqmD7lslOtFqbscH6gMLFYOfG1YPqCKfAW5KrTeolKqvB8UelR49Fpr6y93kYkW2Ik00mT1LOGiAGvizw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-function-name": "^7.18.6", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.18.6", + "@babel/types": "^7.18.6", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.18.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", + "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@eslint/eslintrc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", + "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.3.2", + "globals": "^13.15.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz", + "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", + "dev": true + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "dev": true, + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@headlessui/vue": { + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/@headlessui/vue/-/vue-1.6.5.tgz", + "integrity": "sha512-C/BeTVuowTDLkGgUd6UfiPZVDLdR7OTnd8o4wF37Ub9Js1uhQ3XSTfitdZvlJALUqeQ30j+5Hk3KyjVDLQ3GYQ==", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/@heroicons/vue": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@heroicons/vue/-/vue-2.0.13.tgz", + "integrity": "sha512-vVCVF02+rNKXEmanVNnmktJlxCbOn0qVFP1gfZPn4bcBIwPX3h9AVHGCkwly+IWDEME8w5oooG0KRd2hhSe/HQ==", + "peerDependencies": { + "vue": ">= 3" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", + "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.1.tgz", + "integrity": "sha512-0RiUocPVFEm3WRMOStIHbRWllG6iW6E3/gUPnf4lkrVFyXIIDeCe+vlKeYyFOMhB2EPE6FLFCNADSOOQMaqvyA==", + "dev": true, + "dependencies": { + "@jest/types": "^28.1.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^28.1.1", + "jest-util": "^28.1.1", + "slash": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/console/node_modules/@jest/types": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.1.tgz", + "integrity": "sha512-vRXVqSg1VhDnB8bWcmvLzmg0Bt9CRKVgHPXqYwvWMX3TvAjeO+nRuK6+VdTKCtWOvYlmkF/HqNAL/z+N3B53Kw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^28.0.2", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/console/node_modules/@types/yargs": { + "version": "17.0.10", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.10.tgz", + "integrity": "sha512-gmEaFwpj/7f/ROdtIlci1R1VYU1J4j95m8T+Tj3iBgiBFKg1foE/PSl93bBd5T9LDXNPo8UlNN6W0qwD8O5OaA==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/console/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/console/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/console/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/console/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/console/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console/node_modules/jest-util": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.1.tgz", + "integrity": "sha512-FktOu7ca1DZSyhPAxgxB6hfh2+9zMoJ7aEQA759Z6p45NuO8mWcqujH+UdHlCm/V6JTWwDztM2ITCzU1ijJAfw==", + "dev": true, + "dependencies": { + "@jest/types": "^28.1.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/console/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", + "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", + "dev": true, + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/reporters": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^27.5.1", + "jest-config": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-resolve-dependencies": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "jest-watcher": "^27.5.1", + "micromatch": "^4.0.4", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/core/node_modules/@jest/console": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", + "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/core/node_modules/@jest/test-result": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", + "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", + "dev": true, + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/core/node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@jest/core/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/core/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/core/node_modules/emittery": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", + "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/core/node_modules/jest-watcher": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", + "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^27.5.1", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/core/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@jest/environment": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", + "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", + "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@sinonjs/fake-timers": "^8.0.1", + "@types/node": "*", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/fake-timers/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/fake-timers/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/fake-timers/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/fake-timers/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/globals": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", + "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", + "dev": true, + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/types": "^27.5.1", + "expect": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", + "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-haste-map": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^8.1.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/node_modules/@jest/console": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", + "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/@jest/test-result": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", + "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", + "dev": true, + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/reporters/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/reporters/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/reporters/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/reporters/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/schemas": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.0.2.tgz", + "integrity": "sha512-YVDJZjd4izeTDkij00vHHAymNXQ6WWsdChFRK86qck6Jpr3DCL5W3Is3vslviRlP+bLuMYRLbdp98amMvqudhA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.23.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", + "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9", + "source-map": "^0.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.1.tgz", + "integrity": "sha512-hPmkugBktqL6rRzwWAtp1JtYT4VHwv8OQ+9lE5Gymj6dHzubI/oJHMUpPOt8NrdVWSrz9S7bHjJUmv2ggFoUNQ==", + "dev": true, + "dependencies": { + "@jest/console": "^28.1.1", + "@jest/types": "^28.1.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/test-result/node_modules/@jest/types": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.1.tgz", + "integrity": "sha512-vRXVqSg1VhDnB8bWcmvLzmg0Bt9CRKVgHPXqYwvWMX3TvAjeO+nRuK6+VdTKCtWOvYlmkF/HqNAL/z+N3B53Kw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^28.0.2", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/test-result/node_modules/@types/yargs": { + "version": "17.0.10", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.10.tgz", + "integrity": "sha512-gmEaFwpj/7f/ROdtIlci1R1VYU1J4j95m8T+Tj3iBgiBFKg1foE/PSl93bBd5T9LDXNPo8UlNN6W0qwD8O5OaA==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/test-result/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/test-result/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/test-result/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/test-result/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/test-result/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/test-result/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", + "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", + "dev": true, + "dependencies": { + "@jest/test-result": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-runtime": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/test-sequencer/node_modules/@jest/console": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", + "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/test-sequencer/node_modules/@jest/test-result": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", + "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", + "dev": true, + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/test-sequencer/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/test-sequencer/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/test-sequencer/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/test-sequencer/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/test-sequencer/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/test-sequencer/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/test-sequencer/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/transform": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", + "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/types": "^27.5.1", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-util": "^27.5.1", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/transform/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/transform/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/transform/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/transform/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/transform/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/transform/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/types/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/types/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/types/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/types/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/types/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/types/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "dev": true + }, + "node_modules/@node-ipc/js-queue": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@node-ipc/js-queue/-/js-queue-2.0.3.tgz", + "integrity": "sha512-fL1wpr8hhD5gT2dA1qifeVaoDFlQR5es8tFuKqjHX+kdOtdNHnxkVZbtIrR2rxnMFvehkjaZRNV2H/gPXlb0hw==", + "dev": true, + "dependencies": { + "easy-stack": "1.0.1" + }, + "engines": { + "node": ">=1.0.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.21", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", + "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==", + "dev": true + }, + "node_modules/@popperjs/core": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.5.tgz", + "integrity": "sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.1.4.tgz", + "integrity": "sha512-LwzQKA4vzIct1zNZzBmRKI9QuNpLgTQMEjsQLf3BXuGYb3QPTP4Yjf6mkdX+X1mYttZ808QpOwAzZjv28kq7DA==", + "dev": true + }, + "node_modules/@sideway/address": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", + "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", + "dev": true, + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", + "dev": true + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "dev": true + }, + "node_modules/@sinclair/typebox": { + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.23.5.tgz", + "integrity": "sha512-AFBVi/iT4g20DHoujvMH1aEDn8fGJh4xsRGCP6d8RpLPMqsNPvW01Jcn0QysXTsg++/xj25NmJsGyH9xug/wKg==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", + "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@soda/friendly-errors-webpack-plugin": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.8.1.tgz", + "integrity": "sha512-h2ooWqP8XuFqTXT+NyAFbrArzfQA7R6HTezADrvD9Re8fxMLTPPniLdqVTdDaO0eIoLaAwKT+d6w+5GeTk7Vbg==", + "dev": true, + "dependencies": { + "chalk": "^3.0.0", + "error-stack-parser": "^2.0.6", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@soda/get-current-script": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@soda/get-current-script/-/get-current-script-1.0.2.tgz", + "integrity": "sha512-T7VNNlYVM1SgQ+VsMYhnDkcGmWhQdL0bDyGm5TlQ3GBXnJscEClUUOKduWTmm2zCnvNLC1hc3JpuXjs/nFOc5w==", + "dev": true + }, + "node_modules/@stardazed/streams-polyfill": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@stardazed/streams-polyfill/-/streams-polyfill-2.4.0.tgz", + "integrity": "sha512-W6Yg9cA8YT1b9qCQsz/2+kmKt7i/Za2Nj4QOLqdiANzpTiGy5mOyCQNyh0CVpbvXkjCBo2QxrwPvbDlP9u9k+Q==" + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.1.19", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", + "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.17.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.17.1.tgz", + "integrity": "sha512-kVzjari1s2YVi77D3w1yuvohV2idweYXMCDzqBiVNN63TcDWrIlTVOYpqVrvbbyOE/IyzBoTKF0fdnLPEORFxA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.3.0" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", + "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "dev": true, + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.4.3", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.3.tgz", + "integrity": "sha512-YP1S7YJRMPs+7KZKDb9G63n8YejIwW9BALq7a5j2+H4yl6iOv9CB29edho+cuFRrvmJbbaH2yiVChKLJVysDGw==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", + "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "dev": true + }, + "node_modules/@types/express": { + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", + "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.29", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.29.tgz", + "integrity": "sha512-uMd++6dMKS32EOuw1Uli3e3BPgdLIXmezcfHv7N4c1s3gkhikBplORPpMq3fuWkxncZN1reb16d5n8yhQ80x7Q==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "dev": true + }, + "node_modules/@types/http-proxy": { + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", + "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "27.5.2", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.5.2.tgz", + "integrity": "sha512-mpT8LJJ4CMeeahobofYWIjFo0xonRS/HfxnVEPMPFSQdGUt1uHCnoPT7Zhb+sjDU2wz0oKV0OLUR0WzrHNgfeA==", + "dev": true, + "dependencies": { + "jest-matcher-utils": "^27.0.0", + "pretty-format": "^27.0.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" + }, + "node_modules/@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" + }, + "node_modules/@types/luxon": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-2.4.0.tgz", + "integrity": "sha512-oCavjEjRXuR6URJEtQm0eBdfsBiEcGBZbq21of8iGkeKxU1+1xgKuFPClaBZl2KB8ZZBSWlgk61tH6Mf+nvZVw==", + "dev": true + }, + "node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, + "node_modules/@types/minimist": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.0.tgz", + "integrity": "sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA==" + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "dev": true + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "node_modules/@types/pluralize": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/pluralize/-/pluralize-0.0.29.tgz", + "integrity": "sha512-BYOID+l2Aco2nBik+iYS4SZX0Lf20KPILP5RGmM1IgzdwNdTs0eebiFriOPcej1sX9mLnSoiNte5zcFxssgpGA==", + "dev": true + }, + "node_modules/@types/prettier": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.6.3.tgz", + "integrity": "sha512-ymZk3LEC/fsut+/Q5qejp6R9O1rMxz3XaRHDV6kX8MrGAhOSPqVARbDi+EZvInBpw+BnCX3TD240byVkOfQsHg==", + "dev": true + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true + }, + "node_modules/@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.13.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", + "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "node_modules/@types/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@types/strip-json-comments": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", + "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@types/uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-kr90f+ERiQtKWMz5rP32ltJ/BtULDI5RVO0uavn1HQUOwjx0R1h0rnDYNL0CepF1zL5bSY6FISAfd9tOdDhU5Q==", + "dev": true + }, + "node_modules/@types/webpack-env": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.17.0.tgz", + "integrity": "sha512-eHSaNYEyxRA5IAG0Ym/yCyf86niZUIF/TpWKofQI/CVfh5HsMEUyfE2kwFxha4ow0s5g0LfISQxpDKjbRDrizw==", + "dev": true + }, + "node_modules/@types/ws": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", + "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.30.0.tgz", + "integrity": "sha512-lvhRJ2pGe2V9MEU46ELTdiHgiAFZPKtLhiU5wlnaYpMc2+c1R8fh8i80ZAa665drvjHKUJyRRGg3gEm1If54ow==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.30.0", + "@typescript-eslint/type-utils": "5.30.0", + "@typescript-eslint/utils": "5.30.0", + "debug": "^4.3.4", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.2.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.30.0.tgz", + "integrity": "sha512-2oYYUws5o2liX6SrFQ5RB88+PuRymaM2EU02/9Ppoyu70vllPnHVO7ioxDdq/ypXHA277R04SVjxvwI8HmZpzA==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.30.0", + "@typescript-eslint/types": "5.30.0", + "@typescript-eslint/typescript-estree": "5.30.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.30.0.tgz", + "integrity": "sha512-3TZxvlQcK5fhTBw5solQucWSJvonXf5yua5nx8OqK94hxdrT7/6W3/CS42MLd/f1BmlmmbGEgQcTHHCktUX5bQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.30.0", + "@typescript-eslint/visitor-keys": "5.30.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.30.0.tgz", + "integrity": "sha512-GF8JZbZqSS+azehzlv/lmQQ3EU3VfWYzCczdZjJRxSEeXDQkqFhCBgFhallLDbPwQOEQ4MHpiPfkjKk7zlmeNg==", + "dev": true, + "dependencies": { + "@typescript-eslint/utils": "5.30.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.30.0.tgz", + "integrity": "sha512-vfqcBrsRNWw/LBXyncMF/KrUTYYzzygCSsVqlZ1qGu1QtGs6vMkt3US0VNSQ05grXi5Yadp3qv5XZdYLjpp8ag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.30.0.tgz", + "integrity": "sha512-hDEawogreZB4n1zoqcrrtg/wPyyiCxmhPLpZ6kmWfKF5M5G0clRLaEexpuWr31fZ42F96SlD/5xCt1bT5Qm4Nw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.30.0", + "@typescript-eslint/visitor-keys": "5.30.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.30.0.tgz", + "integrity": "sha512-0bIgOgZflLKIcZsWvfklsaQTM3ZUbmtH0rJ1hKyV3raoUYyeZwcjQ8ZUJTzS7KnhNcsVT1Rxs7zeeMHEhGlltw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.30.0", + "@typescript-eslint/types": "5.30.0", + "@typescript-eslint/typescript-estree": "5.30.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.30.0.tgz", + "integrity": "sha512-6WcIeRk2DQ3pHKxU1Ni0qMXJkjO/zLjBymlYBy/53qxe7yjEFSvzKLDToJjURUhSl2Fzhkl4SMXQoETauF74cw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.30.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@volar-plugins/vetur": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@volar-plugins/vetur/-/vetur-0.1.0.tgz", + "integrity": "sha512-Qaws7TI8d/kkjihSQrW/3YGqiLeLZ1dMjfxDBe4vJKhzXw82sN4+Wr8NwGf2s15KyVDPQTjkPHv6ukn4vFD9Og==", + "dev": true, + "dependencies": { + "@volar/vue-language-service-types": "^0.34.0", + "vls": "^0.8.0", + "vscode-html-languageservice": "^5.0.0", + "vscode-uri": "^3.0.3" + } + }, + "node_modules/@volar/vue-language-service-types": { + "version": "0.34.17", + "resolved": "https://registry.npmjs.org/@volar/vue-language-service-types/-/vue-language-service-types-0.34.17.tgz", + "integrity": "sha512-skDO8ZS6Vs0M+zbnYeoBWk7JX8WbCeCohOwnkstqYxXtcqEU4HTeTShhVxrfyWGS0FLHVE79VAhicxjul2EnHw==", + "dev": true, + "dependencies": { + "vscode-languageserver-protocol": "^3.17.1", + "vscode-languageserver-textdocument": "^1.0.4" + } + }, + "node_modules/@vscode/l10n": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/@vscode/l10n/-/l10n-0.0.11.tgz", + "integrity": "sha512-ukOMWnCg1tCvT7WnDfsUKQOFDQGsyR5tNgRpwmqi+5/vzU3ghdDXzvIM4IOPdSb3OeSsBNvmSL8nxIVOqi2WXA==", + "dev": true + }, + "node_modules/@vue/babel-helper-vue-jsx-merge-props": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.2.1.tgz", + "integrity": "sha512-QOi5OW45e2R20VygMSNhyQHvpdUwQZqGPc748JLGCYEy+yp8fNFNdbNIGAgZmi9e+2JHPd6i6idRuqivyicIkA==", + "dev": true + }, + "node_modules/@vue/babel-helper-vue-transform-on": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.0.2.tgz", + "integrity": "sha512-hz4R8tS5jMn8lDq6iD+yWL6XNB699pGIVLk7WSJnn1dbpjaazsjZQkieJoRX6gW5zpYSCFqQ7jUquPNY65tQYA==", + "dev": true + }, + "node_modules/@vue/babel-plugin-jsx": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.1.1.tgz", + "integrity": "sha512-j2uVfZjnB5+zkcbc/zsOc0fSNGCMMjaEXP52wdwdIfn0qjFfEYpYZBFKFg+HHnQeJCVrjOeO0YxgaL7DMrym9w==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.0.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "@vue/babel-helper-vue-transform-on": "^1.0.2", + "camelcase": "^6.0.0", + "html-tags": "^3.1.0", + "svg-tags": "^1.0.0" + } + }, + "node_modules/@vue/babel-plugin-transform-vue-jsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.2.1.tgz", + "integrity": "sha512-HJuqwACYehQwh1fNT8f4kyzqlNMpBuUK4rSiSES5D4QsYncv5fxFsLyrxFPG2ksO7t5WP+Vgix6tt6yKClwPzA==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1", + "html-tags": "^2.0.0", + "lodash.kebabcase": "^4.1.1", + "svg-tags": "^1.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-plugin-transform-vue-jsx/node_modules/html-tags": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", + "integrity": "sha512-+Il6N8cCo2wB/Vd3gqy/8TZhTD3QvcVeQLCnZiGkGCH3JP28IgGAY41giccp2W4R3jfyJPAP318FQTa1yU7K7g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@vue/babel-preset-app": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@vue/babel-preset-app/-/babel-preset-app-5.0.6.tgz", + "integrity": "sha512-hoVr5M5RIvAL8F6MX8ZG0RvjA7MB7eDOkykK+M+qThkkrsAvlianzygnE86xN1N7JVSq7kGOyZk0Te+L20KqeQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.16", + "@babel/helper-compilation-targets": "^7.12.16", + "@babel/helper-module-imports": "^7.12.13", + "@babel/plugin-proposal-class-properties": "^7.12.13", + "@babel/plugin-proposal-decorators": "^7.12.13", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-jsx": "^7.12.13", + "@babel/plugin-transform-runtime": "^7.12.15", + "@babel/preset-env": "^7.12.16", + "@babel/runtime": "^7.12.13", + "@vue/babel-plugin-jsx": "^1.0.3", + "@vue/babel-preset-jsx": "^1.1.2", + "babel-plugin-dynamic-import-node": "^2.3.3", + "core-js": "^3.8.3", + "core-js-compat": "^3.8.3", + "semver": "^7.3.4" + }, + "peerDependencies": { + "@babel/core": "*", + "core-js": "^3", + "vue": "^2 || ^3.2.13" + }, + "peerDependenciesMeta": { + "core-js": { + "optional": true + }, + "vue": { + "optional": true + } + } + }, + "node_modules/@vue/babel-preset-app/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@vue/babel-preset-jsx": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@vue/babel-preset-jsx/-/babel-preset-jsx-1.2.4.tgz", + "integrity": "sha512-oRVnmN2a77bYDJzeGSt92AuHXbkIxbf/XXSE3klINnh9AXBmVS1DGa1f0d+dDYpLfsAKElMnqKTQfKn7obcL4w==", + "dev": true, + "dependencies": { + "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1", + "@vue/babel-plugin-transform-vue-jsx": "^1.2.1", + "@vue/babel-sugar-composition-api-inject-h": "^1.2.1", + "@vue/babel-sugar-composition-api-render-instance": "^1.2.4", + "@vue/babel-sugar-functional-vue": "^1.2.2", + "@vue/babel-sugar-inject-h": "^1.2.2", + "@vue/babel-sugar-v-model": "^1.2.3", + "@vue/babel-sugar-v-on": "^1.2.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-composition-api-inject-h": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-composition-api-inject-h/-/babel-sugar-composition-api-inject-h-1.2.1.tgz", + "integrity": "sha512-4B3L5Z2G+7s+9Bwbf+zPIifkFNcKth7fQwekVbnOA3cr3Pq71q71goWr97sk4/yyzH8phfe5ODVzEjX7HU7ItQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-composition-api-render-instance": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-composition-api-render-instance/-/babel-sugar-composition-api-render-instance-1.2.4.tgz", + "integrity": "sha512-joha4PZznQMsxQYXtR3MnTgCASC9u3zt9KfBxIeuI5g2gscpTsSKRDzWQt4aqNIpx6cv8On7/m6zmmovlNsG7Q==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-functional-vue": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.2.2.tgz", + "integrity": "sha512-JvbgGn1bjCLByIAU1VOoepHQ1vFsroSA/QkzdiSs657V79q6OwEWLCQtQnEXD/rLTA8rRit4rMOhFpbjRFm82w==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-inject-h": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.2.2.tgz", + "integrity": "sha512-y8vTo00oRkzQTgufeotjCLPAvlhnpSkcHFEp60+LJUwygGcd5Chrpn5480AQp/thrxVm8m2ifAk0LyFel9oCnw==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-v-model": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.2.3.tgz", + "integrity": "sha512-A2jxx87mySr/ulAsSSyYE8un6SIH0NWHiLaCWpodPCVOlQVODCaSpiR4+IMsmBr73haG+oeCuSvMOM+ttWUqRQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1", + "@vue/babel-plugin-transform-vue-jsx": "^1.2.1", + "camelcase": "^5.0.0", + "html-tags": "^2.0.0", + "svg-tags": "^1.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-v-model/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@vue/babel-sugar-v-model/node_modules/html-tags": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", + "integrity": "sha512-+Il6N8cCo2wB/Vd3gqy/8TZhTD3QvcVeQLCnZiGkGCH3JP28IgGAY41giccp2W4R3jfyJPAP318FQTa1yU7K7g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@vue/babel-sugar-v-on": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.2.3.tgz", + "integrity": "sha512-kt12VJdz/37D3N3eglBywV8GStKNUhNrsxChXIV+o0MwVXORYuhDTHJRKPgLJRb/EY3vM2aRFQdxJBp9CLikjw==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-plugin-transform-vue-jsx": "^1.2.1", + "camelcase": "^5.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-v-on/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@vue/cli-overlay": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@vue/cli-overlay/-/cli-overlay-5.0.6.tgz", + "integrity": "sha512-rghCRMPVQ4FIKmQy8ipn8fKztdaQSQTktAKob2SGuEL/iBWfclSMAQCXfj908nyzOBymo+q/Sn/oiLhi07oHlA==", + "dev": true + }, + "node_modules/@vue/cli-plugin-babel": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-babel/-/cli-plugin-babel-5.0.6.tgz", + "integrity": "sha512-ruQhfhj2WM6Fe/VDQneQc/kqNp/p138SjQMfz7q/rxMTMG1kpV5B0jYWschXHXLQ6aDsFnqmBmIK+XjU3XTF3g==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.16", + "@vue/babel-preset-app": "^5.0.6", + "@vue/cli-shared-utils": "^5.0.6", + "babel-loader": "^8.2.2", + "thread-loader": "^3.0.0", + "webpack": "^5.54.0" + }, + "peerDependencies": { + "@vue/cli-service": "^3.0.0 || ^4.0.0 || ^5.0.0-0" + } + }, + "node_modules/@vue/cli-plugin-eslint": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-eslint/-/cli-plugin-eslint-5.0.6.tgz", + "integrity": "sha512-fuc8w2IujzoenA/cdr/QYYMq2yaI1fYr0Fqom/M55B+DmW19GIuIRxYQvh0CEeCbFB2hAl3Flrazfx96/nAaQA==", + "dev": true, + "dependencies": { + "@vue/cli-shared-utils": "^5.0.6", + "eslint-webpack-plugin": "^3.1.0", + "globby": "^11.0.2", + "webpack": "^5.54.0", + "yorkie": "^2.0.0" + }, + "peerDependencies": { + "@vue/cli-service": "^3.0.0 || ^4.0.0 || ^5.0.0-0", + "eslint": ">=7.5.0" + } + }, + "node_modules/@vue/cli-plugin-router": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-router/-/cli-plugin-router-5.0.6.tgz", + "integrity": "sha512-5ikUdfsSoKqpBhB5GhGYijH6mJnU+ZGqDv3QBf0brDeeh7PhClntxNAOLkB73c+LNxjBrlNCTkItuByF+AD29w==", + "dev": true, + "dependencies": { + "@vue/cli-shared-utils": "^5.0.6" + }, + "peerDependencies": { + "@vue/cli-service": "^3.0.0 || ^4.0.0 || ^5.0.0-0" + } + }, + "node_modules/@vue/cli-plugin-typescript": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-typescript/-/cli-plugin-typescript-5.0.6.tgz", + "integrity": "sha512-DKw3SZEWs+9v6oUMTJAGcmJY4XCIdLhwXU1MsXDmhea/VqoGTcY9yl1mb/QfZ3AttdRtC7n4Vk01tGa0pnewsA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.16", + "@types/webpack-env": "^1.15.2", + "@vue/cli-shared-utils": "^5.0.6", + "babel-loader": "^8.2.2", + "fork-ts-checker-webpack-plugin": "^6.4.0", + "globby": "^11.0.2", + "thread-loader": "^3.0.0", + "ts-loader": "^9.2.5", + "webpack": "^5.54.0" + }, + "peerDependencies": { + "@vue/cli-service": "^3.0.0 || ^4.0.0 || ^5.0.0-0", + "cache-loader": "^4.1.0", + "typescript": ">=2", + "vue": "^2 || ^3.2.13", + "vue-template-compiler": "^2.0.0" + }, + "peerDependenciesMeta": { + "cache-loader": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + } + } + }, + "node_modules/@vue/cli-plugin-unit-jest": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-unit-jest/-/cli-plugin-unit-jest-5.0.6.tgz", + "integrity": "sha512-PZ2/q4bo7UWKI2CXNomGrutJTPD+LHZWlz4QQ5uTTLSvrvWxZaULuMItIrTIZPUfDTnl98LpyTLRzNAhZBr63A==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.16", + "@babel/plugin-transform-modules-commonjs": "^7.15.0", + "@types/jest": "^27.0.1", + "@vue/cli-shared-utils": "^5.0.6", + "babel-jest": "^27.1.0", + "deepmerge": "^4.2.2", + "jest": "^27.1.0", + "jest-serializer-vue": "^2.0.2", + "jest-transform-stub": "^2.0.0", + "jest-watch-typeahead": "^1.0.0" + }, + "peerDependencies": { + "@vue/cli-service": "^3.0.0 || ^4.0.0 || ^5.0.0-0", + "@vue/vue2-jest": "^27.0.0-alpha.3", + "@vue/vue3-jest": "^27.0.0-alpha.3", + "jest": "^27.1.0", + "ts-jest": "^27.0.4" + }, + "peerDependenciesMeta": { + "@vue/vue2-jest": { + "optional": true + }, + "@vue/vue3-jest": { + "optional": true + }, + "ts-jest": { + "optional": true + } + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@vue/cli-plugin-vuex": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-vuex/-/cli-plugin-vuex-5.0.6.tgz", + "integrity": "sha512-9bwkaLxGqqrD5FPN7iNsIe5x60P0nScioMQvHf2ZIIoFAiM5yuTgOQkdSKGBhn0YG4IjYd1tnlVY4Q/P4ZHaTA==", + "dev": true, + "peerDependencies": { + "@vue/cli-service": "^3.0.0 || ^4.0.0 || ^5.0.0-0" + } + }, + "node_modules/@vue/cli-service": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@vue/cli-service/-/cli-service-5.0.6.tgz", + "integrity": "sha512-XSiTCjUMk8adjvQIJXBxk3ltEBLyBme8rpqdhJrpgCgSj+8pcPPyYKs1M0petkhwLMv3mEXVPNQmXKFzpdWVrw==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.12.16", + "@soda/friendly-errors-webpack-plugin": "^1.8.0", + "@soda/get-current-script": "^1.0.2", + "@types/minimist": "^1.2.0", + "@vue/cli-overlay": "^5.0.6", + "@vue/cli-plugin-router": "^5.0.6", + "@vue/cli-plugin-vuex": "^5.0.6", + "@vue/cli-shared-utils": "^5.0.6", + "@vue/component-compiler-utils": "^3.3.0", + "@vue/vue-loader-v15": "npm:vue-loader@^15.9.7", + "@vue/web-component-wrapper": "^1.3.0", + "acorn": "^8.0.5", + "acorn-walk": "^8.0.2", + "address": "^1.1.2", + "autoprefixer": "^10.2.4", + "browserslist": "^4.16.3", + "case-sensitive-paths-webpack-plugin": "^2.3.0", + "cli-highlight": "^2.1.10", + "clipboardy": "^2.3.0", + "cliui": "^7.0.4", + "copy-webpack-plugin": "^9.0.1", + "css-loader": "^6.5.0", + "css-minimizer-webpack-plugin": "^3.0.2", + "cssnano": "^5.0.0", + "debug": "^4.1.1", + "default-gateway": "^6.0.3", + "dotenv": "^10.0.0", + "dotenv-expand": "^5.1.0", + "fs-extra": "^9.1.0", + "globby": "^11.0.2", + "hash-sum": "^2.0.0", + "html-webpack-plugin": "^5.1.0", + "is-file-esm": "^1.0.0", + "launch-editor-middleware": "^2.2.1", + "lodash.defaultsdeep": "^4.6.1", + "lodash.mapvalues": "^4.6.0", + "mini-css-extract-plugin": "^2.5.3", + "minimist": "^1.2.5", + "module-alias": "^2.2.2", + "portfinder": "^1.0.26", + "postcss": "^8.2.6", + "postcss-loader": "^6.1.1", + "progress-webpack-plugin": "^1.0.12", + "ssri": "^8.0.1", + "terser-webpack-plugin": "^5.1.1", + "thread-loader": "^3.0.0", + "vue-loader": "^17.0.0", + "vue-style-loader": "^4.1.3", + "webpack": "^5.54.0", + "webpack-bundle-analyzer": "^4.4.0", + "webpack-chain": "^6.5.1", + "webpack-dev-server": "^4.7.3", + "webpack-merge": "^5.7.3", + "webpack-virtual-modules": "^0.4.2", + "whatwg-fetch": "^3.6.2" + }, + "bin": { + "vue-cli-service": "bin/vue-cli-service.js" + }, + "engines": { + "node": "^12.0.0 || >= 14.0.0" + }, + "peerDependencies": { + "vue-template-compiler": "^2.0.0", + "webpack-sources": "*" + }, + "peerDependenciesMeta": { + "cache-loader": { + "optional": true + }, + "less-loader": { + "optional": true + }, + "pug-plain-loader": { + "optional": true + }, + "raw-loader": { + "optional": true + }, + "sass-loader": { + "optional": true + }, + "stylus-loader": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + }, + "webpack-sources": { + "optional": true + } + } + }, + "node_modules/@vue/cli-shared-utils": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@vue/cli-shared-utils/-/cli-shared-utils-5.0.6.tgz", + "integrity": "sha512-5HmlRtMByOCFO0P3mMUx8dVruTRhZ3pqQ0f1cCH9TmAoDjetmD/Ib7yx/5KxTHV8QY3xZJxYvgAmOU5C49K5xA==", + "dev": true, + "dependencies": { + "@achrinza/node-ipc": "^9.2.5", + "chalk": "^4.1.2", + "execa": "^1.0.0", + "joi": "^17.4.0", + "launch-editor": "^2.2.1", + "lru-cache": "^6.0.0", + "node-fetch": "^2.6.7", + "open": "^8.0.2", + "ora": "^5.3.0", + "read-pkg": "^5.1.1", + "semver": "^7.3.4", + "strip-ansi": "^6.0.0" + } + }, + "node_modules/@vue/cli-shared-utils/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@vue/cli-shared-utils/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@vue/cli-shared-utils/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@vue/cli-shared-utils/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@vue/cli-shared-utils/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@vue/cli-shared-utils/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@vue/cli-shared-utils/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.2.37", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.37.tgz", + "integrity": "sha512-81KhEjo7YAOh0vQJoSmAD68wLfYqJvoiD4ulyedzF+OEk/bk6/hx3fTNVfuzugIIaTrOx4PGx6pAiBRe5e9Zmg==", + "dependencies": { + "@babel/parser": "^7.16.4", + "@vue/shared": "3.2.37", + "estree-walker": "^2.0.2", + "source-map": "^0.6.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.2.37", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.37.tgz", + "integrity": "sha512-yxJLH167fucHKxaqXpYk7x8z7mMEnXOw3G2q62FTkmsvNxu4FQSu5+3UMb+L7fjKa26DEzhrmCxAgFLLIzVfqQ==", + "dependencies": { + "@vue/compiler-core": "3.2.37", + "@vue/shared": "3.2.37" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.2.37", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.37.tgz", + "integrity": "sha512-+7i/2+9LYlpqDv+KTtWhOZH+pa8/HnX/905MdVmAcI/mPQOBwkHHIzrsEsucyOIZQYMkXUiTkmZq5am/NyXKkg==", + "dependencies": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.37", + "@vue/compiler-dom": "3.2.37", + "@vue/compiler-ssr": "3.2.37", + "@vue/reactivity-transform": "3.2.37", + "@vue/shared": "3.2.37", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7", + "postcss": "^8.1.10", + "source-map": "^0.6.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.2.37", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.37.tgz", + "integrity": "sha512-7mQJD7HdXxQjktmsWp/J67lThEIcxLemz1Vb5I6rYJHR5vI+lON3nPGOH3ubmbvYGt8xEUaAr1j7/tIFWiEOqw==", + "dependencies": { + "@vue/compiler-dom": "3.2.37", + "@vue/shared": "3.2.37" + } + }, + "node_modules/@vue/component-compiler-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.3.0.tgz", + "integrity": "sha512-97sfH2mYNU+2PzGrmK2haqffDpVASuib9/w2/noxiFi31Z54hW+q3izKQXXQZSNhtiUpAI36uSuYepeBe4wpHQ==", + "dev": true, + "dependencies": { + "consolidate": "^0.15.1", + "hash-sum": "^1.0.2", + "lru-cache": "^4.1.2", + "merge-source-map": "^1.1.0", + "postcss": "^7.0.36", + "postcss-selector-parser": "^6.0.2", + "source-map": "~0.6.1", + "vue-template-es2015-compiler": "^1.9.0" + }, + "optionalDependencies": { + "prettier": "^1.18.2 || ^2.0.0" + } + }, + "node_modules/@vue/component-compiler-utils/node_modules/hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==", + "dev": true + }, + "node_modules/@vue/component-compiler-utils/node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/@vue/component-compiler-utils/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/@vue/component-compiler-utils/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/@vue/component-compiler-utils/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "dev": true + }, + "node_modules/@vue/devtools-api": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.1.4.tgz", + "integrity": "sha512-IiA0SvDrJEgXvVxjNkHPFfDx6SXw0b/TUkqMcDZWNg9fnCAHbTpoo59YfJ9QLFkwa3raau5vSlRVzMSLDnfdtQ==" + }, + "node_modules/@vue/eslint-config-typescript": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-11.0.0.tgz", + "integrity": "sha512-txuRzxnQVmtUvvy9UyWUy9sHWXNeRPGmSPqP53hRtaiUeCTAondI9Ho9GQYI/8/eWljYOST7iA4Aa8sANBkWaA==", + "dev": true, + "dependencies": { + "@typescript-eslint/eslint-plugin": "^5.0.0", + "@typescript-eslint/parser": "^5.0.0", + "vue-eslint-parser": "^9.0.0" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0", + "eslint-plugin-vue": "^9.0.0", + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/reactivity": { + "version": "3.2.37", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.37.tgz", + "integrity": "sha512-/7WRafBOshOc6m3F7plwzPeCu/RCVv9uMpOwa/5PiY1Zz+WLVRWiy0MYKwmg19KBdGtFWsmZ4cD+LOdVPcs52A==", + "dependencies": { + "@vue/shared": "3.2.37" + } + }, + "node_modules/@vue/reactivity-transform": { + "version": "3.2.37", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.37.tgz", + "integrity": "sha512-IWopkKEb+8qpu/1eMKVeXrK0NLw9HicGviJzhJDEyfxTR9e1WtpnnbYkJWurX6WwoFP0sz10xQg8yL8lgskAZg==", + "dependencies": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.37", + "@vue/shared": "3.2.37", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.2.37", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.37.tgz", + "integrity": "sha512-JPcd9kFyEdXLl/i0ClS7lwgcs0QpUAWj+SKX2ZC3ANKi1U4DOtiEr6cRqFXsPwY5u1L9fAjkinIdB8Rz3FoYNQ==", + "dependencies": { + "@vue/reactivity": "3.2.37", + "@vue/shared": "3.2.37" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.2.37", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.37.tgz", + "integrity": "sha512-HimKdh9BepShW6YozwRKAYjYQWg9mQn63RGEiSswMbW+ssIht1MILYlVGkAGGQbkhSh31PCdoUcfiu4apXJoPw==", + "dependencies": { + "@vue/runtime-core": "3.2.37", + "@vue/shared": "3.2.37", + "csstype": "^2.6.8" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.2.37", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.37.tgz", + "integrity": "sha512-kLITEJvaYgZQ2h47hIzPh2K3jG8c1zCVbp/o/bzQOyvzaKiCquKS7AaioPI28GNxIsE/zSx+EwWYsNxDCX95MA==", + "dependencies": { + "@vue/compiler-ssr": "3.2.37", + "@vue/shared": "3.2.37" + }, + "peerDependencies": { + "vue": "3.2.37" + } + }, + "node_modules/@vue/shared": { + "version": "3.2.37", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.37.tgz", + "integrity": "sha512-4rSJemR2NQIo9Klm1vabqWjD8rs/ZaJSzMxkMNeJS6lHiUjjUeYFbooN19NgFjztubEKh3WlZUeOLVdbbUWHsw==" + }, + "node_modules/@vue/test-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-2.0.0.tgz", + "integrity": "sha512-zL5kygNq7hONrO1CzaUGprEAklAX+pH8J1MPMCU3Rd2xtSYkZ+PmKU3oEDRg8VAGdL5lNJHzDgrud5amFPtirw==", + "dev": true, + "peerDependencies": { + "vue": "^3.0.1" + } + }, + "node_modules/@vue/vue-loader-v15": { + "name": "vue-loader", + "version": "15.9.8", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.9.8.tgz", + "integrity": "sha512-GwSkxPrihfLR69/dSV3+5CdMQ0D+jXg8Ma1S4nQXKJAznYFX14vHdc/NetQc34Dw+rBbIJyP7JOuVb9Fhprvog==", + "dev": true, + "dependencies": { + "@vue/component-compiler-utils": "^3.1.0", + "hash-sum": "^1.0.2", + "loader-utils": "^1.1.0", + "vue-hot-reload-api": "^2.3.0", + "vue-style-loader": "^4.1.0" + }, + "peerDependencies": { + "css-loader": "*", + "webpack": "^3.0.0 || ^4.1.0 || ^5.0.0-0" + }, + "peerDependenciesMeta": { + "cache-loader": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + } + } + }, + "node_modules/@vue/vue-loader-v15/node_modules/hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==", + "dev": true + }, + "node_modules/@vue/vue3-jest": { + "version": "27.0.0", + "resolved": "https://registry.npmjs.org/@vue/vue3-jest/-/vue3-jest-27.0.0.tgz", + "integrity": "sha512-VL61CgZBoQqayXfzlZJHHpZuX4lsT8dmdZMJzADhdAJjKu26JBpypHr/2ppevxItljPiuALQW4MKhhCXZRXnLg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@babel/plugin-transform-modules-commonjs": "^7.2.0", + "chalk": "^2.1.0", + "convert-source-map": "^1.6.0", + "css-tree": "^2.0.1", + "source-map": "0.5.6", + "tsconfig": "^7.0.0" + }, + "peerDependencies": { + "@babel/core": "7.x", + "babel-jest": "27.x", + "jest": "27.x", + "ts-jest": "27.x", + "typescript": ">= 3.x", + "vue": "^3.0.0-0" + }, + "peerDependenciesMeta": { + "ts-jest": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/vue3-jest/node_modules/css-tree": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.1.0.tgz", + "integrity": "sha512-PcysZRzToBbrpoUrZ9qfblRIRf8zbEAkU0AIpQFtgkFK0vSbzOmBCvdSAx2Zg7Xx5wiYJKUKk0NMP7kxevie/A==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "mdn-data": "2.0.27", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@vue/vue3-jest/node_modules/mdn-data": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.27.tgz", + "integrity": "sha512-kwqO0I0jtWr25KcfLm9pia8vLZ8qoAKhWZuZMbneJq3jjBD3gl5nZs8l8Tu3ZBlBAHVQtDur9rdDGyvtfVraHQ==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@vue/vue3-jest/node_modules/source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@vue/web-component-wrapper": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@vue/web-component-wrapper/-/web-component-wrapper-1.3.0.tgz", + "integrity": "sha512-Iu8Tbg3f+emIIMmI2ycSI8QcEuAUgPTgHwesDU1eKMLE4YC/c/sFbGc70QgMq31ijRftV0R7vCm9co6rldCeOA==", + "dev": true + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": true + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/abortcontroller-polyfill": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.3.tgz", + "integrity": "sha512-zetDJxd89y3X99Kvo4qFx8GKlt6GsvN3UcRZHwU6iFA/0KiOmhkTVhe8oRoTBiTVPZu09x3vCra47+w8Yz1+2Q==" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals/node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "dev": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dev": true, + "dependencies": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } + }, + "node_modules/acorn-node/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-node/node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.0.tgz", + "integrity": "sha512-tNEZYz5G/zYunxFm7sfhAxkXEuLj3K6BKwv6ZURlsF6yiUQ65z0Q2wZW9L5cPUl9ocofGvXOdFYbFHp0+6MOig==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/apexcharts": { + "version": "3.35.3", + "resolved": "https://registry.npmjs.org/apexcharts/-/apexcharts-3.35.3.tgz", + "integrity": "sha512-UDlxslJr3DG63I/SgoiivIu4lpP25GMaKFK8NvCHmTksTQshx4ng3oPPrYvdsBFOvD/ajPYIh/p7rNB0jq8vXg==", + "dependencies": { + "svg.draggable.js": "^2.2.2", + "svg.easing.js": "^2.0.0", + "svg.filter.js": "^2.0.2", + "svg.pathmorphing.js": "^0.1.3", + "svg.resize.js": "^1.4.3", + "svg.select.js": "^3.0.1" + } + }, + "node_modules/arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.7", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.7.tgz", + "integrity": "sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + ], + "dependencies": { + "browserslist": "^4.20.3", + "caniuse-lite": "^1.0.30001335", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/babel-eslint": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", + "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", + "deprecated": "babel-eslint is now @babel/eslint-parser. This package will no longer receive updates.", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0", + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" + }, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "eslint": ">= 4.12.1" + } + }, + "node_modules/babel-eslint/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/babel-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", + "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", + "dev": true, + "dependencies": { + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-jest/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/babel-jest/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/babel-jest/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/babel-jest/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/babel-jest/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-jest/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-loader": { + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz", + "integrity": "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==", + "dev": true, + "dependencies": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^2.0.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 8.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" + } + }, + "node_modules/babel-loader/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/babel-loader/node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", + "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", + "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.3.1", + "semver": "^6.1.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", + "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.1", + "core-js-compat": "^3.21.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", + "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", + "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^27.5.1", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/body-parser": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", + "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.10.3", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/bonjour-service": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.13.tgz", + "integrity": "sha512-LWKRU/7EqDUC9CTAQtuZl5HzBALoCYwtLhffW3et7vZMwv3bWLpJf8bRYlMD5OCcDpTfnPgNCV4yo9ZIaJGMiA==", + "dev": true, + "dependencies": { + "array-flatten": "^2.1.2", + "dns-equal": "^1.0.0", + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "node_modules/browser-tabs-lock": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/browser-tabs-lock/-/browser-tabs-lock-1.2.15.tgz", + "integrity": "sha512-J8K9vdivK0Di+b8SBdE7EZxDr88TnATing7XoLw6+nFkXMQ6sVBh92K3NQvZlZU91AIkFRi0w3sztk5Z+vsswA==", + "hasInstallScript": true, + "dependencies": { + "lodash": ">=4.17.21" + } + }, + "node_modules/browserslist": { + "version": "4.21.10", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001519", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001519.tgz", + "integrity": "sha512-0QHgqR+Jv4bxHMp8kZ1Kn8CH55OikjKJ6JmKkZYP1F3D7w+lnFXF70nG5eNfsZS89jadi5Ywy5UCSKLAglIRkg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/case-sensitive-paths-webpack-plugin": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", + "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/character-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", + "integrity": "sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==", + "dev": true, + "dependencies": { + "is-regex": "^1.0.3" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.2.tgz", + "integrity": "sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg==", + "dev": true + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "dev": true + }, + "node_modules/clean-css": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.0.tgz", + "integrity": "sha512-YYuuxv4H/iNb1Z/5IbMRoxgrzjWGhOEFfd+groZ5dMCVkpENiMZmwspdrzBo9286JjM1gZJPAyL7ZIdzuvu2AQ==", + "dev": true, + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-highlight": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", + "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "highlight.js": "^10.7.1", + "mz": "^2.4.0", + "parse5": "^5.1.1", + "parse5-htmlparser2-tree-adapter": "^6.0.0", + "yargs": "^16.0.0" + }, + "bin": { + "highlight": "bin/highlight" + }, + "engines": { + "node": ">=8.0.0", + "npm": ">=5.0.0" + } + }, + "node_modules/cli-highlight/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cli-highlight/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/cli-highlight/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/cli-highlight/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/cli-highlight/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-highlight/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/click-outside-vue3": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/click-outside-vue3/-/click-outside-vue3-4.0.1.tgz", + "integrity": "sha512-sbplNecrup5oGqA3o4bo8XmvHRT6q9fvw21Z67aDbTqB9M6LF7CuYLTlLvNtOgKU6W3zst5H5zJuEh4auqA34g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/clipboard": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.11.tgz", + "integrity": "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==", + "dependencies": { + "good-listener": "^1.2.2", + "select": "^1.1.2", + "tiny-emitter": "^2.0.0" + } + }, + "node_modules/clipboardy": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-2.3.0.tgz", + "integrity": "sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ==", + "dev": true, + "dependencies": { + "arch": "^2.1.1", + "execa": "^1.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/colord": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.2.tgz", + "integrity": "sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ==", + "dev": true + }, + "node_modules/colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/condense-newlines": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/condense-newlines/-/condense-newlines-0.2.1.tgz", + "integrity": "sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-whitespace": "^0.3.0", + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/condense-newlines/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dev": true, + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/consolidate": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz", + "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==", + "dev": true, + "dependencies": { + "bluebird": "^3.1.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "node_modules/copy-webpack-plugin": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-9.1.0.tgz", + "integrity": "sha512-rxnR7PaGigJzhqETHGmAcxKnLZSR5u1Y3/bcIv/1FnqXedcL/E2ewK7ZCNrArJKCiSv8yVXhTqetJh8inDvfsA==", + "dev": true, + "dependencies": { + "fast-glob": "^3.2.7", + "glob-parent": "^6.0.1", + "globby": "^11.0.3", + "normalize-path": "^3.0.0", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/core-js": { + "version": "3.25.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.25.1.tgz", + "integrity": "sha512-sr0FY4lnO1hkQ4gLDr24K0DGnweGO1QwSj5BpfQjpSJPdqWalja4cTps29Y/PJVG/P7FYlPDkH3hO+Tr0CvDgQ==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.32.0.tgz", + "integrity": "sha512-7a9a3D1k4UCVKnLhrgALyFcP7YCsLOQIxPd0dKjf/6GuPcgyiGP70ewWdCGrSK7evyhymi0qO4EqCmSJofDeYw==", + "dev": true, + "dependencies": { + "browserslist": "^4.21.9" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "dev": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/cross-spawn/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/css-declaration-sorter": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.0.tgz", + "integrity": "sha512-OGT677UGHJTAVMRhPO+HJ4oKln3wkBTwtDFH0ojbqm+MJm6xuDMHp2nkhh/ThaBqq20IbraBQSWKfSLNHQO9Og==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-loader": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz", + "integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==", + "dev": true, + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.7", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.3.5" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/css-loader/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/css-minimizer-webpack-plugin": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz", + "integrity": "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==", + "dev": true, + "dependencies": { + "cssnano": "^5.0.6", + "jest-worker": "^27.0.2", + "postcss": "^8.3.5", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@parcel/css": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "5.1.12", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.12.tgz", + "integrity": "sha512-TgvArbEZu0lk/dvg2ja+B7kYoD7BBCmn3+k58xD0qjrGHsFzXY/wKTo9M5egcUCabPol05e/PVoIu79s2JN4WQ==", + "dev": true, + "dependencies": { + "cssnano-preset-default": "^5.2.12", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-preset-default": { + "version": "5.2.12", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.12.tgz", + "integrity": "sha512-OyCBTZi+PXgylz9HAA5kHyoYhfGcYdwFmyaJzWnzxuGRtnMw/kR6ilW9XzlzlRAtB6PLT/r+prYgkef7hngFew==", + "dev": true, + "dependencies": { + "css-declaration-sorter": "^6.3.0", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.0", + "postcss-convert-values": "^5.1.2", + "postcss-discard-comments": "^5.1.2", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.6", + "postcss-merge-rules": "^5.1.2", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.3", + "postcss-minify-selectors": "^5.2.1", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.0", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.3", + "postcss-reduce-initial": "^5.1.0", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "node_modules/csstype": { + "version": "2.6.20", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.20.tgz", + "integrity": "sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==" + }, + "node_modules/data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/data-urls/node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dev": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/data-urls/node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true, + "engines": { + "node": ">=10.4" + } + }, + "node_modules/data-urls/node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dev": true, + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", + "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", + "dev": true + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz", + "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/default-gateway/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/default-gateway/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/default-gateway/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-gateway/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-gateway/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/default-gateway/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/default-gateway/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/default-gateway/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/default-gateway/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==", + "dev": true + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegate": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", + "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==" + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "node_modules/detective": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", + "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", + "dev": true, + "dependencies": { + "acorn-node": "^1.8.2", + "defined": "^1.0.0", + "minimist": "^1.2.6" + }, + "bin": { + "detective": "bin/detective.js" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", + "dev": true, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", + "dev": true + }, + "node_modules/dns-packet": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", + "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", + "dev": true, + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, + "dependencies": { + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", + "dev": true + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "node_modules/easy-stack": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/easy-stack/-/easy-stack-1.0.1.tgz", + "integrity": "sha512-wK2sCs4feiiJeFXn3zvY0p41mdU5VUgbgs1rNsc/y5ngFUijdWd+iIN8eoyuZHKB8xN6BL4PdWmzqFmxNg6V2w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/editorconfig": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", + "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==", + "dev": true, + "dependencies": { + "commander": "^2.19.0", + "lru-cache": "^4.1.5", + "semver": "^5.6.0", + "sigmund": "^1.0.1" + }, + "bin": { + "editorconfig": "bin/editorconfig" + } + }, + "node_modules/editorconfig/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/editorconfig/node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/editorconfig/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/editorconfig/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "dev": true + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.4.482", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.482.tgz", + "integrity": "sha512-h+UqpfmEr1Qkk0zp7ej/jid7CXoq4m4QzW6wNTb0ELJ/BZCpA4wgUylBIMGCe621tnr4l5VmoHjdoSx2lbnNJA==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", + "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.0.tgz", + "integrity": "sha512-+DCows0XNwLDcUhbFJPdlQEVnT2zXlCv7hPxemTz86/O+B/hCQ+mb7ydkPKiflpVraqLPCAfu7lDy+hBXueojw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "dev": true, + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "node_modules/es-cookie": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/es-cookie/-/es-cookie-1.3.2.tgz", + "integrity": "sha512-UTlYYhXGLOy05P/vKVT2Ui7WtC7NiRzGtJyAKKn32g5Gvcjn7KAClLPWlipCtxIus934dFg9o9jXiBL0nP+t9Q==" + }, + "node_modules/es-module-lexer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", + "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/escodegen/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.18.0.tgz", + "integrity": "sha512-As1EfFMVk7Xc6/CvhssHUjsAQSkpfXvUGMFC3ce8JDe6WvqCgRrLOBQbVpsBFr1X1V+RACOadnzVvcUS5ni2bA==", + "dev": true, + "dependencies": { + "@eslint/eslintrc": "^1.3.0", + "@humanwhocodes/config-array": "^0.9.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.2", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.15.0", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-vue": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.1.1.tgz", + "integrity": "sha512-W9n5PB1X2jzC7CK6riG0oAcxjmKrjTF6+keL1rni8n57DZeilx/Fulz+IRJK3lYseLNAygN0I62L7DvioW40Tw==", + "dev": true, + "dependencies": { + "eslint-utils": "^3.0.0", + "natural-compare": "^1.4.0", + "nth-check": "^2.0.1", + "postcss-selector-parser": "^6.0.9", + "semver": "^7.3.5", + "vue-eslint-parser": "^9.0.1", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-plugin-vue/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz", + "integrity": "sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==", + "dev": true, + "dependencies": { + "@types/eslint": "^7.29.0 || ^8.4.1", + "jest-worker": "^28.0.2", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0", + "webpack": "^5.0.0" + } + }, + "node_modules/eslint-webpack-plugin/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/eslint-webpack-plugin/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint-webpack-plugin/node_modules/jest-worker": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.1.tgz", + "integrity": "sha512-Au7slXB08C6h+xbJPp7VIb6U0XX5Kc9uel/WFc6/rcTzGiaVCBRngBExSYuXSLFPULPSYU3cJ3ybS988lNFQhQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/eslint-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/eslint-webpack-plugin/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/eslint-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz", + "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/espree": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz", + "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==", + "dev": true, + "dependencies": { + "acorn": "^8.7.1", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-pubsub": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/event-pubsub/-/event-pubsub-4.3.0.tgz", + "integrity": "sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/expect/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/expect/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/expect/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/expect/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/expect/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/expect/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/expect/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/express": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", + "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", + "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.0", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.10.3", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/express/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fast-text-encoding": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz", + "integrity": "sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==" + }, + "node_modules/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fetch-intercept": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/fetch-intercept/-/fetch-intercept-2.4.0.tgz", + "integrity": "sha512-BPZ2LM9Dh1ua2ovQf03N6rhWg1qxdVD5qK/G4llvcemt6M+jjxCuIDxJ+6IiG+uz//3UQmgfKEv0gOGvYIxZ7g==" + }, + "node_modules/figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz", + "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", + "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/fork-ts-checker-webpack-plugin": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz", + "integrity": "sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.8.3", + "@types/json-schema": "^7.0.5", + "chalk": "^4.1.0", + "chokidar": "^3.4.2", + "cosmiconfig": "^6.0.0", + "deepmerge": "^4.2.2", + "fs-extra": "^9.0.0", + "glob": "^7.1.6", + "memfs": "^3.1.2", + "minimatch": "^3.0.4", + "schema-utils": "2.7.0", + "semver": "^7.3.2", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=10", + "yarn": ">=1.0.0" + }, + "peerDependencies": { + "eslint": ">= 6", + "typescript": ">= 2.7", + "vue-template-compiler": "*", + "webpack": ">= 4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + } + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "dev": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", + "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/good-listener": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", + "integrity": "sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==", + "dependencies": { + "delegate": "^3.1.2" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "dev": true, + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hash-sum": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz", + "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==", + "dev": true + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/html-entities": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", + "dev": true + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "dev": true, + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-tags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz", + "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", + "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", + "dev": true, + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "webpack": "^5.20.0" + } + }, + "node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dev": true, + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/ipaddr.js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, + "dependencies": { + "ci-info": "^1.5.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-ci/node_modules/ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "dev": true + }, + "node_modules/is-core-module": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-expression": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-4.0.0.tgz", + "integrity": "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==", + "dev": true, + "dependencies": { + "acorn": "^7.1.1", + "object-assign": "^4.1.1" + } + }, + "node_modules/is-expression/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-file-esm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-file-esm/-/is-file-esm-1.0.0.tgz", + "integrity": "sha512-rZlaNKb4Mr8WlRu2A9XdeoKgnO5aA53XdPHgCKVyCrQ/rWi89RET1+bq37Ru46obaQXeiX4vmFIm1vks41hoSA==", + "dev": true, + "dependencies": { + "read-pkg-up": "^7.0.1" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-whitespace": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-whitespace/-/is-whitespace-0.3.0.tgz", + "integrity": "sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz", + "integrity": "sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", + "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/javascript-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.1.0.tgz", + "integrity": "sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==", + "dev": true + }, + "node_modules/jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", + "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", + "dev": true, + "dependencies": { + "@jest/core": "^27.5.1", + "import-local": "^3.0.2", + "jest-cli": "^27.5.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", + "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "execa": "^5.0.0", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-changed-files/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/jest-changed-files/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/jest-changed-files/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-changed-files/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-changed-files/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-changed-files/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-changed-files/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-changed-files/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-changed-files/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/jest-circus": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", + "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", + "dev": true, + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/node_modules/@jest/console": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", + "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/node_modules/@jest/test-result": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", + "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", + "dev": true, + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-circus/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-circus/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-circus/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", + "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", + "dev": true, + "dependencies": { + "@jest/core": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "prompts": "^2.0.1", + "yargs": "^16.2.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-cli/node_modules/@jest/console": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", + "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-cli/node_modules/@jest/test-result": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", + "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", + "dev": true, + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-cli/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-cli/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-cli/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-cli/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-cli/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-cli/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", + "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.8.0", + "@jest/test-sequencer": "^27.5.1", + "@jest/types": "^27.5.1", + "babel-jest": "^27.5.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.9", + "jest-circus": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-jasmine2": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-config/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-config/node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-config/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-diff": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-diff/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-diff/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-diff/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-diff/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-docblock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", + "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", + "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-each/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-each/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-each/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-jsdom": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", + "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", + "dev": true, + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1", + "jsdom": "^16.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", + "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", + "dev": true, + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "dev": true, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", + "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^27.5.1", + "jest-serializer": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-jasmine2": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", + "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/@jest/console": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", + "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/@jest/test-result": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", + "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", + "dev": true, + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-jasmine2/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-jasmine2/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-jasmine2/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-jasmine2/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-leak-detector": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", + "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", + "dev": true, + "dependencies": { + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-matcher-utils/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-matcher-utils/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.1.tgz", + "integrity": "sha512-xoDOOT66fLfmTRiqkoLIU7v42mal/SqwDKvfmfiWAdJMSJiU+ozgluO7KbvoAgiwIrrGZsV7viETjc8GNrA/IQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^28.1.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^28.1.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-message-util/node_modules/@jest/types": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.1.tgz", + "integrity": "sha512-vRXVqSg1VhDnB8bWcmvLzmg0Bt9CRKVgHPXqYwvWMX3TvAjeO+nRuK6+VdTKCtWOvYlmkF/HqNAL/z+N3B53Kw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^28.0.2", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-message-util/node_modules/@types/yargs": { + "version": "17.0.10", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.10.tgz", + "integrity": "sha512-gmEaFwpj/7f/ROdtIlci1R1VYU1J4j95m8T+Tj3iBgiBFKg1foE/PSl93bBd5T9LDXNPo8UlNN6W0qwD8O5OaA==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-message-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-message-util/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-message-util/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util/node_modules/pretty-format": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.1.tgz", + "integrity": "sha512-wwJbVTGFHeucr5Jw2bQ9P+VYHyLdAqedFLEkdQUVaBF/eiidDwH5OpilINq4mEfhbCjLnirt6HTTDhv1HaTIQw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^28.0.2", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-message-util/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/jest-message-util/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-mock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", + "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "dev": true, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", + "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", + "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-snapshot": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-resolve/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-resolve/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-resolve/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-resolve/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", + "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", + "dev": true, + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-leak-detector": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "source-map-support": "^0.5.6", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runner/node_modules/@jest/console": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", + "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runner/node_modules/@jest/test-result": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", + "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", + "dev": true, + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runner/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-runner/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-runner/node_modules/emittery": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", + "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runner/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", + "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", + "dev": true, + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/globals": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "execa": "^5.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runtime/node_modules/@jest/console": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", + "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runtime/node_modules/@jest/test-result": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", + "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", + "dev": true, + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runtime/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-runtime/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-runtime/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/jest-runtime/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-runtime/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-runtime/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runtime/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/jest-serializer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", + "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", + "dev": true, + "dependencies": { + "@types/node": "*", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-serializer-vue": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/jest-serializer-vue/-/jest-serializer-vue-2.0.2.tgz", + "integrity": "sha512-nK/YIFo6qe3i9Ge+hr3h4PpRehuPPGZFt8LDBdTHYldMb7ZWlkanZS8Ls7D8h6qmQP2lBQVDLP0DKn5bJ9QApQ==", + "dev": true, + "dependencies": { + "pretty": "2.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", + "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.7.2", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.0.0", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^27.5.1", + "semver": "^7.3.2" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-snapshot/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-transform-stub": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jest-transform-stub/-/jest-transform-stub-2.0.0.tgz", + "integrity": "sha512-lspHaCRx/mBbnm3h4uMMS3R5aZzMwyNpNIJLXj4cEsV0mIUtS4IjYJLSoyjRCtnxb6RIGJ4NL2quZzfIeNhbkg==", + "dev": true + }, + "node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-util/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-util/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-validate": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", + "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "leven": "^3.1.0", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-validate/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-validate/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-validate/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-validate/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz", + "integrity": "sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.3.1", + "chalk": "^4.0.0", + "jest-regex-util": "^28.0.0", + "jest-watcher": "^28.0.0", + "slash": "^4.0.0", + "string-length": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "jest": "^27.0.0 || ^28.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watch-typeahead/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-watch-typeahead/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-regex-util": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", + "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watch-typeahead/node_modules/string-length": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz", + "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==", + "dev": true, + "dependencies": { + "char-regex": "^2.0.0", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watch-typeahead/node_modules/string-length/node_modules/char-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.1.tgz", + "integrity": "sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==", + "dev": true, + "engines": { + "node": ">=12.20" + } + }, + "node_modules/jest-watch-typeahead/node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.1.tgz", + "integrity": "sha512-RQIpeZ8EIJMxbQrXpJQYIIlubBnB9imEHsxxE41f54ZwcqWLysL/A0ZcdMirf+XsMn3xfphVQVV4EW0/p7i7Ug==", + "dev": true, + "dependencies": { + "@jest/test-result": "^28.1.1", + "@jest/types": "^28.1.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.10.2", + "jest-util": "^28.1.1", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watcher/node_modules/@jest/types": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.1.tgz", + "integrity": "sha512-vRXVqSg1VhDnB8bWcmvLzmg0Bt9CRKVgHPXqYwvWMX3TvAjeO+nRuK6+VdTKCtWOvYlmkF/HqNAL/z+N3B53Kw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^28.0.2", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watcher/node_modules/@types/yargs": { + "version": "17.0.10", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.10.tgz", + "integrity": "sha512-gmEaFwpj/7f/ROdtIlci1R1VYU1J4j95m8T+Tj3iBgiBFKg1foE/PSl93bBd5T9LDXNPo8UlNN6W0qwD8O5OaA==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-watcher/node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-watcher/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-watcher/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-watcher/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-watcher/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watcher/node_modules/jest-util": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.1.tgz", + "integrity": "sha512-FktOu7ca1DZSyhPAxgxB6hfh2+9zMoJ7aEQA759Z6p45NuO8mWcqujH+UdHlCm/V6JTWwDztM2ITCzU1ijJAfw==", + "dev": true, + "dependencies": { + "@jest/types": "^28.1.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watcher/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watcher/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/joi": { + "version": "17.6.0", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.6.0.tgz", + "integrity": "sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw==", + "dev": true, + "dependencies": { + "@hapi/hoek": "^9.0.0", + "@hapi/topo": "^5.0.0", + "@sideway/address": "^4.1.3", + "@sideway/formula": "^3.0.0", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/js-beautify": { + "version": "1.14.4", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.14.4.tgz", + "integrity": "sha512-+b4A9c3glceZEmxyIbxDOYB0ZJdReLvyU1077RqKsO4dZx9FUHjTOJn8VHwpg33QoucIykOiYbh7MfqBOghnrA==", + "dev": true, + "dependencies": { + "config-chain": "^1.1.13", + "editorconfig": "^0.15.3", + "glob": "^7.1.3", + "nopt": "^5.0.0" + }, + "bin": { + "css-beautify": "js/bin/css-beautify.js", + "html-beautify": "js/bin/html-beautify.js", + "js-beautify": "js/bin/js-beautify.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/js-message": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/js-message/-/js-message-1.0.7.tgz", + "integrity": "sha512-efJLHhLjIyKRewNS9EGZ4UpI8NguuL6fKkhRxVuMmrGV2xN/0APGdQYwLFky5w9naebSZ0OwAGp0G6/2Cg90rA==", + "dev": true, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "dev": true, + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "node_modules/jsdom/node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dev": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jsdom/node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true, + "engines": { + "node": ">=10.4" + } + }, + "node_modules/jsdom/node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dev": true, + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jsdom/node_modules/xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==" + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/klona": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", + "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/kubernetes-types": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/kubernetes-types/-/kubernetes-types-1.26.0.tgz", + "integrity": "sha512-jv0XaTIGW/p18jaiKRD85hLTYWx0yEj+cb6PDX3GdNa3dWoRxnD4Gv7+bE6C/ehcsp2skcdy34vT25jbPofDIQ==", + "dev": true + }, + "node_modules/launch-editor": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.4.0.tgz", + "integrity": "sha512-mZ0BHeSn/ohL+Ib+b+JnxC59vcNz6v5IR9d0CuM8f0x8ni8oK3IIG6G0vMkpxc0gFsmvINkztGOHiWTaX4BmAg==", + "dev": true, + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.6.1" + } + }, + "node_modules/launch-editor-middleware": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/launch-editor-middleware/-/launch-editor-middleware-2.4.0.tgz", + "integrity": "sha512-/M7AX/6xktZY60KE7j71XLrj9U6H5TBoP+mJzhYB3fcdAq8rcazit/K0qWiu1jvytUPXP4lJRd1VJFwvdMQ/uw==", + "dev": true, + "dependencies": { + "launch-editor": "^2.4.0" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz", + "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/loader-utils/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "node_modules/lodash.defaultsdeep": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz", + "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==", + "dev": true + }, + "node_modules/lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", + "dev": true + }, + "node_modules/lodash.mapvalues": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", + "integrity": "sha512-JPFqXFeZQ7BfS00H58kClY7SPVeHertPE0lNuCyZ26/XlN8TvakYD7b9bGyNmXbT/D3BbtPAAmq90gPWqLkxlQ==", + "dev": true + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-update": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-2.3.0.tgz", + "integrity": "sha512-vlP11XfFGyeNQlmEn9tJ66rEW1coA/79m5z6BCkudjbAGE83uhAcGYrBFwfs3AdLiLzGRusRPAbSPK9xZteCmg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^3.0.0", + "cli-cursor": "^2.0.0", + "wrap-ansi": "^3.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-update/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-update/node_modules/cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "dev": true, + "dependencies": { + "restore-cursor": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-update/node_modules/mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-update/node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-update/node_modules/restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "dev": true, + "dependencies": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-update/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-update/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dev": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz", + "integrity": "sha512-iXR3tDXpbnTpzjKSylUJRkLuOrEC7hwEB221cgn6wtF8wpmz28puFXAEfPT5zrjM3wahygB//VuWEr1vTkDcNQ==", + "dev": true, + "dependencies": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/long": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.0.tgz", + "integrity": "sha512-9RTUNjK60eJbx3uz+TEGF7fUr29ZDxR5QzXcyDpeSfeH28S9ycINflOgOlppit5U+4kNTe83KQnMEerw7GmE8w==" + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/luxon": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-2.5.2.tgz", + "integrity": "sha512-Yg7/RDp4nedqmLgyH0LwgGRvMEKVzKbUdkBYyCosbHgJ+kaOUx0qzSiSatVc3DFygnirTPYnMM2P5dg2uH1WvA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.7.tgz", + "integrity": "sha512-ygaiUSNalBX85388uskeCyhSAoOSgzBbtVCr9jA2RROssFL9Q19/ZXFqS+2Th2sr1ewNIWgFdLzLC3Yl1Zv+lw==", + "dev": true, + "dependencies": { + "fs-monkey": "^1.0.3" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true + }, + "node_modules/merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dev": true, + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz", + "integrity": "sha512-wd+SD57/K6DiV7jIR34P+s3uckTRuQvx0tKPcvjFlrEylk6P4mQ2KSWk1hblj1Kxaqok7LogKOieygXqBczNlg==", + "dev": true, + "dependencies": { + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, + "node_modules/minipass": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz", + "integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mitt": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-2.1.0.tgz", + "integrity": "sha512-ILj2TpLiysu2wkBbWjAmww7TkZb65aiQO+DkVdUTBpBXq+MHYiETENkKFMtsJZX1Lf4pe4QOrTSjIfUwN5lRdg==" + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/module-alias": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/module-alias/-/module-alias-2.2.2.tgz", + "integrity": "sha512-A/78XjoX2EmNvppVWEhM2oGk3x4lLxnkEA4jTbaK97QKSDjkIoOsKQlfylt/d3kKKi596Qy3NP5XrXJ6fZIC9Q==", + "dev": true + }, + "node_modules/monaco-editor": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.33.0.tgz", + "integrity": "sha512-VcRWPSLIUEgQJQIE0pVT8FcGBIgFoxz7jtqctE+IiCxWugD0DwgyQBcZBhdSrdMC84eumoqMZsGl2GTreOzwqw==" + }, + "node_modules/monaco-editor-vue3": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/monaco-editor-vue3/-/monaco-editor-vue3-0.1.10.tgz", + "integrity": "sha512-C1jhyx+KHQyW1AbjuA8DhIZSqkVquV7MnuWXG9jESd0e+CkzEFzuk1RvNqlN2eJ2fRkvF32yEPHYfvz9quOhHQ==", + "dependencies": { + "monaco-editor": "^0.33.0", + "vite-plugin-monaco-editor": "^1.1.0", + "vue": "^3.2.37" + } + }, + "node_modules/monaco-marker-data-provider": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/monaco-marker-data-provider/-/monaco-marker-data-provider-1.1.1.tgz", + "integrity": "sha512-PGB7TJSZE5tmHzkxv/OEwK2RGNC2A7dcq4JRJnnj31CUAsfmw0Gl+1QTrH0W0deKhcQmQM0YVPaqgQ+0wCt8Mg==", + "funding": { + "url": "https://github.com/sponsors/remcohaszing" + }, + "peerDependencies": { + "monaco-editor": ">=0.30.0" + } + }, + "node_modules/monaco-worker-manager": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/monaco-worker-manager/-/monaco-worker-manager-2.0.1.tgz", + "integrity": "sha512-kdPL0yvg5qjhKPNVjJoym331PY/5JC11aPJXtCZNwWRvBr6jhkIamvYAyiY5P1AWFmNOy0aRDRoMdZfa71h8kg==", + "peerDependencies": { + "monaco-editor": ">=0.30.0" + } + }, + "node_modules/monaco-yaml": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/monaco-yaml/-/monaco-yaml-4.0.4.tgz", + "integrity": "sha512-qbM36fY1twpDUs4lhhxoXDQGUPVyYAFCPJi3E0JKgLioD8wzsD/pawgauFFXSzpMa09z8wbt/DTLXjXEehnVFA==", + "dependencies": { + "@types/json-schema": "^7.0.0", + "jsonc-parser": "^3.0.0", + "monaco-marker-data-provider": "^1.0.0", + "monaco-worker-manager": "^2.0.0", + "path-browserify": "^1.0.0", + "prettier": "^2.0.0", + "vscode-languageserver-textdocument": "^1.0.0", + "vscode-languageserver-types": "^3.0.0", + "vscode-uri": "^3.0.0", + "yaml": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/remcohaszing" + }, + "peerDependencies": { + "monaco-editor": ">=0.30" + } + }, + "node_modules/monaco-yaml/node_modules/yaml": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.2.tgz", + "integrity": "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/mrmime": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", + "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dev": true, + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nwsapi": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.1.tgz", + "integrity": "sha512-JYOWTeFoS0Z93587vRJgASD5Ut11fYl5NyihP3KrYBvMe1FRRs6RN7m20SA/16GM4P6hTnZjT+UmDOt38UeXNg==", + "dev": true + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true, + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/openpgp": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/openpgp/-/openpgp-5.5.0.tgz", + "integrity": "sha512-SpwcJnxrK9Y0HRM6KxSFqkAEOSWEabCH/c8dII/+y2e5f6KvuDG5ZE7JXaPBaVJNE4VUZZeTphxXDoZD0KOHrw==", + "dev": true, + "dependencies": { + "asn1.js": "^5.0.0" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ora/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/ora/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/ora/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dev": true, + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "dev": true + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dev": true, + "dependencies": { + "parse5": "^6.0.1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "dev": true, + "dependencies": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/portfinder/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/postcss": { + "version": "8.4.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", + "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-calc": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", + "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/postcss-colormin": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", + "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", + "dev": true, + "dependencies": { + "browserslist": "^4.16.6", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-convert-values": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.2.tgz", + "integrity": "sha512-c6Hzc4GAv95B7suy4udszX9Zy4ETyMCgFPUDtWjdFTKH1SE9eFY/jEpHSwTH1QPuwxHpWslhckUQWbNRM4ho5g==", + "dev": true, + "dependencies": { + "browserslist": "^4.20.3", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-comments": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-empty": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-import": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", + "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", + "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", + "dev": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.3.3" + } + }, + "node_modules/postcss-load-config": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", + "dev": true, + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-loader": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", + "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", + "dev": true, + "dependencies": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.5", + "semver": "^7.3.5" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-loader/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.6.tgz", + "integrity": "sha512-6C/UGF/3T5OE2CEbOuX7iNO63dnvqhGZeUnKkDeifebY0XqkkvrctYSZurpNE902LDf2yKwwPFgotnfSoPhQiw==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-merge-rules": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.2.tgz", + "integrity": "sha512-zKMUlnw+zYCWoPN6yhPjtcEdlJaMUZ0WyVcxTAmw3lkkN/NDMRkOkiuctQEoWAOvH7twaxUUdvBWl0d4+hifRQ==", + "dev": true, + "dependencies": { + "browserslist": "^4.16.6", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^3.1.0", + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", + "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", + "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "dev": true, + "dependencies": { + "colord": "^2.9.1", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-params": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.3.tgz", + "integrity": "sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg==", + "dev": true, + "dependencies": { + "browserslist": "^4.16.6", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", + "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-nested": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz", + "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.6" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", + "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", + "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", + "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-string": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", + "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", + "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz", + "integrity": "sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==", + "dev": true, + "dependencies": { + "browserslist": "^4.16.6", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", + "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "dev": true, + "dependencies": { + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", + "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-ordered-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", + "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", + "dev": true, + "dependencies": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz", + "integrity": "sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==", + "dev": true, + "dependencies": { + "browserslist": "^4.16.6", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", + "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", + "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^2.7.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", + "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/pretty": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pretty/-/pretty-2.0.0.tgz", + "integrity": "sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w==", + "dev": true, + "dependencies": { + "condense-newlines": "^0.2.1", + "extend-shallow": "^2.0.1", + "js-beautify": "^1.6.12" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "dev": true, + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/progress-webpack-plugin": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/progress-webpack-plugin/-/progress-webpack-plugin-1.0.16.tgz", + "integrity": "sha512-sdiHuuKOzELcBANHfrupYo+r99iPRyOnw15qX+rNlVUqXGfjXdH4IgxriKwG1kNJwVswKQHMdj1hYZMcb9jFaA==", + "dev": true, + "dependencies": { + "chalk": "^2.1.0", + "figures": "^2.0.0", + "log-update": "^2.3.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "peerDependencies": { + "webpack": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0" + } + }, + "node_modules/promise-polyfill": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.2.3.tgz", + "integrity": "sha512-Og0+jCRQetV84U8wVjMNccfGCnMQ9mGs9Hv78QFe+pSDD3gWTpz0y+1QCuxy5d/vBFuZ3iwP2eycAkvqIMPmWg==" + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "dev": true + }, + "node_modules/protobufjs": { + "version": "6.11.3", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.3.tgz", + "integrity": "sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + }, + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts" + } + }, + "node_modules/protobufjs/node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", + "dev": true + }, + "node_modules/psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "node_modules/pug-error": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-2.0.0.tgz", + "integrity": "sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ==", + "dev": true + }, + "node_modules/pug-lexer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-5.0.1.tgz", + "integrity": "sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==", + "dev": true, + "dependencies": { + "character-parser": "^2.2.0", + "is-expression": "^4.0.0", + "pug-error": "^2.0.0" + } + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", + "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", + "dev": true + }, + "node_modules/regenerator-transform": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", + "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/regexpu-core": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.1.0.tgz", + "integrity": "sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.0.1", + "regjsgen": "^0.6.0", + "regjsparser": "^0.8.2", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", + "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==", + "dev": true + }, + "node_modules/regjsparser": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", + "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", + "dev": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "dev": true, + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve.exports": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", + "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz", + "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/schema-utils": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", + "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/select": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", + "integrity": "sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==" + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true + }, + "node_modules/selfsigned": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz", + "integrity": "sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==", + "dev": true, + "dependencies": { + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/semver-parser": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/semver-parser/-/semver-parser-4.0.1.tgz", + "integrity": "sha512-ZdnhLJSeLkc9fXEwqdvVXqrVJ8jq/vhGlFfsMhOE4oIiSZlvUC6Ar4NAbdj+H5DEkhFjyhucce7BO8VL/rpY9g==" + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shell-quote": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", + "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", + "dev": true + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==", + "dev": true + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/sirv": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz", + "integrity": "sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==", + "dev": true, + "dependencies": { + "@polka/url": "^1.0.0-next.20", + "mrmime": "^1.0.0", + "totalist": "^1.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/slice-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/slugify": { + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.5.tgz", + "integrity": "sha512-8mo9bslnBO3tr5PEVFzMPIWwWnipGS0xVbYf65zxDqfNwmzYn1LpiKNrR6DlClusuvo+hDHd1zKpmfAe83NQSQ==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", + "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", + "dev": true + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dev": true, + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", + "dev": true + }, + "node_modules/stack-utils": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", + "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", + "dev": true + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylehacks": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", + "integrity": "sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==", + "dev": true, + "dependencies": { + "browserslist": "^4.16.6", + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", + "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", + "dev": true + }, + "node_modules/svg.draggable.js": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/svg.draggable.js/-/svg.draggable.js-2.2.2.tgz", + "integrity": "sha512-JzNHBc2fLQMzYCZ90KZHN2ohXL0BQJGQimK1kGk6AvSeibuKcIdDX9Kr0dT9+UJ5O8nYA0RB839Lhvk4CY4MZw==", + "dependencies": { + "svg.js": "^2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/svg.easing.js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/svg.easing.js/-/svg.easing.js-2.0.0.tgz", + "integrity": "sha512-//ctPdJMGy22YoYGV+3HEfHbm6/69LJUTAqI2/5qBvaNHZ9uUFVC82B0Pl299HzgH13rKrBgi4+XyXXyVWWthA==", + "dependencies": { + "svg.js": ">=2.3.x" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/svg.filter.js": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/svg.filter.js/-/svg.filter.js-2.0.2.tgz", + "integrity": "sha512-xkGBwU+dKBzqg5PtilaTb0EYPqPfJ9Q6saVldX+5vCRy31P6TlRCP3U9NxH3HEufkKkpNgdTLBJnmhDHeTqAkw==", + "dependencies": { + "svg.js": "^2.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/svg.js": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/svg.js/-/svg.js-2.7.1.tgz", + "integrity": "sha512-ycbxpizEQktk3FYvn/8BH+6/EuWXg7ZpQREJvgacqn46gIddG24tNNe4Son6omdXCnSOaApnpZw6MPCBA1dODA==" + }, + "node_modules/svg.pathmorphing.js": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/svg.pathmorphing.js/-/svg.pathmorphing.js-0.1.3.tgz", + "integrity": "sha512-49HWI9X4XQR/JG1qXkSDV8xViuTLIWm/B/7YuQELV5KMOPtXjiwH4XPJvr/ghEDibmLQ9Oc22dpWpG0vUDDNww==", + "dependencies": { + "svg.js": "^2.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/svg.resize.js": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/svg.resize.js/-/svg.resize.js-1.4.3.tgz", + "integrity": "sha512-9k5sXJuPKp+mVzXNvxz7U0uC9oVMQrrf7cFsETznzUDDm0x8+77dtZkWdMfRlmbkEEYvUn9btKuZ3n41oNA+uw==", + "dependencies": { + "svg.js": "^2.6.5", + "svg.select.js": "^2.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/svg.resize.js/node_modules/svg.select.js": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/svg.select.js/-/svg.select.js-2.1.2.tgz", + "integrity": "sha512-tH6ABEyJsAOVAhwcCjF8mw4crjXSI1aa7j2VQR8ZuJ37H2MBUbyeqYr5nEO7sSN3cy9AR9DUwNg0t/962HlDbQ==", + "dependencies": { + "svg.js": "^2.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/svg.select.js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/svg.select.js/-/svg.select.js-3.0.1.tgz", + "integrity": "sha512-h5IS/hKkuVCbKSieR9uQCj9w+zLHoPh+ce19bBYyqF53g6mnPB8sAtIbe1s9dh2S2fCmYX2xel1Ln3PJBbK4kw==", + "dependencies": { + "svg.js": "^2.6.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "dev": true, + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "node_modules/table": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", + "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/tailwindcss": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.1.4.tgz", + "integrity": "sha512-NrxbFV4tYsga/hpWbRyUfIaBrNMXDxx5BsHgBS4v5tlyjf+sDsgBg5m9OxjrXIqAS/uR9kicxLKP+bEHI7BSeQ==", + "dev": true, + "dependencies": { + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "color-name": "^1.1.4", + "detective": "^5.2.1", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "lilconfig": "^2.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.14", + "postcss-import": "^14.1.0", + "postcss-js": "^4.0.0", + "postcss-load-config": "^3.1.4", + "postcss-nested": "5.0.6", + "postcss-selector-parser": "^6.0.10", + "postcss-value-parser": "^4.2.0", + "quick-lru": "^5.1.1", + "resolve": "^1.22.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/tailwindcss/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terminal-link/node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terminal-link/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser": { + "version": "5.17.3", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.3.tgz", + "integrity": "sha512-AudpAZKmZHkG9jueayypz4duuCFJMMNGRMwaPvQKWfxKedh8Z2x3OCoDqIIi1xx5+iwx1u6Au8XQcc9Lke65Yg==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.8.tgz", + "integrity": "sha512-WiHL3ElchZMsK27P8uIUh4604IgJyAW47LVXGbEoB21DbQcZ+OuMpGjVYnEUaqcWM6dO8uS2qUbA7LSCWqvsbg==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/thread-loader": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/thread-loader/-/thread-loader-3.0.4.tgz", + "integrity": "sha512-ByaL2TPb+m6yArpqQUZvP+5S1mZtXsEP7nWKKlAUTm7fCml8kB5s1uI3+eHRP2bk5mVYfRSBI7FFf+tWEyLZwA==", + "dev": true, + "dependencies": { + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^4.1.0", + "loader-utils": "^2.0.0", + "neo-async": "^2.6.2", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.27.0 || ^5.0.0" + } + }, + "node_modules/thread-loader/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/throat": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", + "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", + "dev": true + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "node_modules/tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/totalist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", + "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "dev": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, + "node_modules/ts-jest": { + "version": "27.1.5", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.1.5.tgz", + "integrity": "sha512-Xv6jBQPoBEvBq/5i2TeSG9tt/nqkbpcurrEG1b+2yfBrcJelOZF9Ml6dmyMh7bcW9JyFbRYpR5rxROSlBLTZHA==", + "dev": true, + "dependencies": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^27.0.0", + "json5": "2.x", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "7.x", + "yargs-parser": "20.x" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@types/jest": "^27.0.0", + "babel-jest": ">=27.0.0 <28", + "jest": "^27.0.0", + "typescript": ">=3.8 <5.0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@types/jest": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-loader": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.3.1.tgz", + "integrity": "sha512-OkyShkcZTsTwyS3Kt7a4rsT/t2qvEVQuKCTg4LJmpj9fhFR7ukGdZwV6Qq3tRUkqcXtfGpPR7+hFKHCG/0d3Lw==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "typescript": "*", + "webpack": "^5.0.0" + } + }, + "node_modules/ts-loader/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ts-loader/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ts-loader/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/ts-loader/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/ts-loader/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-loader/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-loader/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tsconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", + "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@types/strip-bom": "^3.0.0", + "@types/strip-json-comments": "0.0.30", + "strip-bom": "^3.0.0", + "strip-json-comments": "^2.0.0" + } + }, + "node_modules/tsconfig/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/tsconfig/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "node_modules/tslint": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", + "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", + "deprecated": "TSLint has been deprecated in favor of ESLint. Please see https://github.com/palantir/tslint/issues/4534 for more information.", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^4.0.1", + "glob": "^7.1.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.3", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.13.0", + "tsutils": "^2.29.0" + }, + "bin": { + "tslint": "bin/tslint" + }, + "engines": { + "node": ">=4.8.0" + }, + "peerDependencies": { + "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev || >= 4.0.0-dev" + } + }, + "node_modules/tslint/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/tslint/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/tslint/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/tslint/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/tslint/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/tslint/node_modules/tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "peerDependencies": { + "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" + } + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/unfetch": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz", + "integrity": "sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", + "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "node_modules/v8-to-istanbul": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", + "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite-plugin-monaco-editor": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vite-plugin-monaco-editor/-/vite-plugin-monaco-editor-1.1.0.tgz", + "integrity": "sha512-IvtUqZotrRoVqwT0PBBDIZPNraya3BxN/bfcNfnxZ5rkJiGcNtO5eAOWWSgT7zullIAEqQwxMU83yL9J5k7gww==", + "peerDependencies": { + "monaco-editor": ">=0.33.0" + } + }, + "node_modules/vls": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/vls/-/vls-0.8.2.tgz", + "integrity": "sha512-esrJmf7yRY5rlG7d5Jmucp7P2ZeWHOi7p1aADwxbPiN69SgNUq1Tp24YJ0vUXiEU8mgOW0tf0dL4f6LlSu6K/g==", + "dev": true, + "dependencies": { + "eslint": "^7.32.0", + "eslint-plugin-vue": "^7.19.1", + "prettier": "^2.4.1", + "pug-lexer": "^5.0.1", + "tslint": "6.1.3", + "typescript": "^4.4.4" + }, + "bin": { + "vls": "bin/vls" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/vls/node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/vls/node_modules/@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/vls/node_modules/@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/vls/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/vls/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/vls/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/vls/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/vls/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/vls/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/vls/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/vls/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vls/node_modules/eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/vls/node_modules/eslint-plugin-vue": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-7.20.0.tgz", + "integrity": "sha512-oVNDqzBC9h3GO+NTgWeLMhhGigy6/bQaQbHS+0z7C4YEu/qK/yxHvca/2PTZtGNPsCrHwOTgKMrwu02A9iPBmw==", + "dev": true, + "dependencies": { + "eslint-utils": "^2.1.0", + "natural-compare": "^1.4.0", + "semver": "^6.3.0", + "vue-eslint-parser": "^7.10.0" + }, + "engines": { + "node": ">=8.10" + }, + "peerDependencies": { + "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/vls/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/vls/node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/vls/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/vls/node_modules/eslint/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/vls/node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/vls/node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/vls/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/vls/node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vls/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/vls/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/vls/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/vls/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/vls/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/vls/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/vls/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/vls/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vls/node_modules/vue-eslint-parser": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-7.11.0.tgz", + "integrity": "sha512-qh3VhDLeh773wjgNTl7ss0VejY9bMMa0GoDG2fQVyDzRFdiU3L7fw74tWZDHNQXdZqxO3EveQroa9ct39D2nqg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "eslint-scope": "^5.1.1", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.2.1", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8.10" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5.0.0" + } + }, + "node_modules/vls/node_modules/vue-eslint-parser/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/vls/node_modules/vue-eslint-parser/node_modules/espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "dev": true, + "dependencies": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/vls/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/vscode-html-languageservice": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/vscode-html-languageservice/-/vscode-html-languageservice-5.0.4.tgz", + "integrity": "sha512-tvrySfpglu4B2rQgWGVO/IL+skvU7kBkQotRlxA7ocSyRXOZUd6GA13XHkxo8LPe07KWjeoBlN1aVGqdfTK4xA==", + "dev": true, + "dependencies": { + "@vscode/l10n": "^0.0.11", + "vscode-languageserver-textdocument": "^1.0.8", + "vscode-languageserver-types": "^3.17.2", + "vscode-uri": "^3.0.7" + } + }, + "node_modules/vscode-jsonrpc": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.0.2.tgz", + "integrity": "sha512-RY7HwI/ydoC1Wwg4gJ3y6LpU9FJRZAUnTYMXthqhFXXu77ErDd/xkREpGuk4MyYkk4a+XDWAMqe0S3KkelYQEQ==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.17.2", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.2.tgz", + "integrity": "sha512-8kYisQ3z/SQ2kyjlNeQxbkkTNmVFoQCqkmGrzLH6A9ecPlgTbp3wDTnUNqaUxYr4vlAcloxx8zwy7G5WdguYNg==", + "dev": true, + "dependencies": { + "vscode-jsonrpc": "8.0.2", + "vscode-languageserver-types": "3.17.2" + } + }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.8.tgz", + "integrity": "sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==" + }, + "node_modules/vscode-languageserver-types": { + "version": "3.17.2", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.2.tgz", + "integrity": "sha512-zHhCWatviizPIq9B7Vh9uvrH6x3sK8itC84HkamnBWoDFJtzBf7SWlpLCZUit72b3os45h6RWQNC9xHRDF8dRA==" + }, + "node_modules/vscode-uri": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.7.tgz", + "integrity": "sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==" + }, + "node_modules/vue": { + "version": "3.2.37", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.37.tgz", + "integrity": "sha512-bOKEZxrm8Eh+fveCqS1/NkG/n6aMidsI6hahas7pa0w/l7jkbssJVsRhVDs07IdDq7h9KHswZOgItnwJAgtVtQ==", + "dependencies": { + "@vue/compiler-dom": "3.2.37", + "@vue/compiler-sfc": "3.2.37", + "@vue/runtime-dom": "3.2.37", + "@vue/server-renderer": "3.2.37", + "@vue/shared": "3.2.37" + } + }, + "node_modules/vue-cli-plugin-tailwind": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/vue-cli-plugin-tailwind/-/vue-cli-plugin-tailwind-3.0.0.tgz", + "integrity": "sha512-bUWjfwGtJCeBU7pL4lD86RC+HsJAmAlYqr8e65NGC3q/ZBzC9KQs1Iy/vTyfDTnB7ZJm3huB+1a/m+17fdMZ8A==", + "dev": true + }, + "node_modules/vue-eslint-parser": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.0.3.tgz", + "integrity": "sha512-yL+ZDb+9T0ELG4VIFo/2anAOz8SvBdlqEnQnvJ3M7Scq56DvtjY0VY88bByRZB0D4J0u8olBcfrXTVONXsh4og==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^7.3.6" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/vue-eslint-parser/node_modules/eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/vue-eslint-parser/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/vue-eslint-parser/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/vue-hot-reload-api": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz", + "integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==", + "dev": true + }, + "node_modules/vue-loader": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-17.0.0.tgz", + "integrity": "sha512-OWSXjrzIvbF2LtOUmxT3HYgwwubbfFelN8PAP9R9dwpIkj48TVioHhWWSx7W7fk+iF5cgg3CBJRxwTdtLU4Ecg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "hash-sum": "^2.0.0", + "loader-utils": "^2.0.0" + }, + "peerDependencies": { + "webpack": "^4.1.0 || ^5.0.0-0" + } + }, + "node_modules/vue-loader/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/vue-loader/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/vue-loader/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/vue-loader/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/vue-loader/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/vue-loader/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/vue-loader/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/vue-observe-visibility": { + "version": "2.0.0-alpha.1", + "resolved": "https://registry.npmjs.org/vue-observe-visibility/-/vue-observe-visibility-2.0.0-alpha.1.tgz", + "integrity": "sha512-flFbp/gs9pZniXR6fans8smv1kDScJ8RS7rEpMjhVabiKeq7Qz3D9+eGsypncjfIyyU84saU88XZ0zjbD6Gq/g==", + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/vue-resize": { + "version": "2.0.0-alpha.1", + "resolved": "https://registry.npmjs.org/vue-resize/-/vue-resize-2.0.0-alpha.1.tgz", + "integrity": "sha512-7+iqOueLU7uc9NrMfrzbG8hwMqchfVfSzpVlCMeJQe4pyibqyoifDNbKTZvwxZKDvGkB+PdFeKvnGZMoEb8esg==", + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/vue-router": { + "version": "4.0.16", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.0.16.tgz", + "integrity": "sha512-JcO7cb8QJLBWE+DfxGUL3xUDOae/8nhM1KVdnudadTAORbuxIC/xAydC5Zr/VLHUDQi1ppuTF5/rjBGzgzrJNA==", + "dependencies": { + "@vue/devtools-api": "^6.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/vue-style-loader": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz", + "integrity": "sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg==", + "dev": true, + "dependencies": { + "hash-sum": "^1.0.2", + "loader-utils": "^1.0.2" + } + }, + "node_modules/vue-style-loader/node_modules/hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==", + "dev": true + }, + "node_modules/vue-template-es2015-compiler": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz", + "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==", + "dev": true + }, + "node_modules/vue-virtual-scroller": { + "version": "2.0.0-beta.8", + "resolved": "https://registry.npmjs.org/vue-virtual-scroller/-/vue-virtual-scroller-2.0.0-beta.8.tgz", + "integrity": "sha512-b8/f5NQ5nIEBRTNi6GcPItE4s7kxNHw2AIHLtDp+2QvqdTjVN0FgONwX9cr53jWRgnu+HRLPaWDOR2JPI5MTfQ==", + "dependencies": { + "mitt": "^2.1.0", + "vue-observe-visibility": "^2.0.0-alpha.1", + "vue-resize": "^2.0.0-alpha.1" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/vue-word-highlighter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vue-word-highlighter/-/vue-word-highlighter-1.0.4.tgz", + "integrity": "sha512-jtwnkEBnwMzmKTvpStbffbEpWkW4Fpb2ErdqDqAGOZlrjCgTJczBCpIQiGyBF2jNvYxvCvN5HqIldoNaMS0XYQ==", + "dependencies": { + "vue-demi": "^0.11.2" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^2.0.0 || >=3.0.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/vue-word-highlighter/node_modules/vue-demi": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.11.4.tgz", + "integrity": "sha512-/3xFwzSykLW2HiiLie43a+FFgNOcokbBJ+fzvFXd0r2T8MYohqvphUyDQ8lbAwzQ3Dlcrb1c9ykifGkhSIAk6A==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/vue3-apexcharts": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/vue3-apexcharts/-/vue3-apexcharts-1.4.1.tgz", + "integrity": "sha512-96qP8JDqB9vwU7bkG5nVU+E0UGQn7yYQVqUUCLQMYWDuQyu2vE77H/UFZ1yI+hwzlSTBKT9BqnNG8JsFegB3eg==", + "peerDependencies": { + "apexcharts": "> 3.0.0", + "vue": "> 3.0.0" + } + }, + "node_modules/vue3-clipboard": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/vue3-clipboard/-/vue3-clipboard-1.0.0.tgz", + "integrity": "sha512-GUqKh1oO79xDpq0z+cCv/NDVTpcJGNDzeNgT3PmTdTp/WJh3gcTrDqIYKycKhzMFOtIFJ7hO/+usgyWtT+fNhA==", + "dependencies": { + "clipboard": "^2.0.6" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/vue3-popper": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/vue3-popper/-/vue3-popper-1.5.0.tgz", + "integrity": "sha512-xaEnx90YBnlSg5G2yWqm2DHWHg+DB99UVRp4VsyTF0QLXyHrqSuE1Xo5+sG0AQq/lBcrGMlk5NU5xE2MDLKViw==", + "dependencies": { + "@popperjs/core": "^2.9.2", + "debounce": "^1.2.1" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "vue": "^3.2.20" + } + }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/w3c-xmlserializer/node_modules/xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, + "node_modules/webpack": { + "version": "5.82.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.82.1.tgz", + "integrity": "sha512-C6uiGQJ+Gt4RyHXXYt+v9f+SN1v83x68URwgxNQ98cvH8kxiuywWGP4XeNZ1paOzZ63aY3cTciCEQJNFUljlLw==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.14.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.2", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-bundle-analyzer": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz", + "integrity": "sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ==", + "dev": true, + "dependencies": { + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "chalk": "^4.1.0", + "commander": "^7.2.0", + "gzip-size": "^6.0.0", + "lodash": "^4.17.20", + "opener": "^1.5.2", + "sirv": "^1.0.7", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-chain": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/webpack-chain/-/webpack-chain-6.5.1.tgz", + "integrity": "sha512-7doO/SRtLu8q5WM0s7vPKPWX580qhi0/yBHkOxNkv50f6qB76Zy9o2wRTrrPULqYTvQlVHuvbA8v+G5ayuUDsA==", + "dev": true, + "dependencies": { + "deepmerge": "^1.5.2", + "javascript-stringify": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "dev": true, + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/webpack-dev-middleware/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.3.tgz", + "integrity": "sha512-3qp/eoboZG5/6QgiZ3llN8TUzkSpYg1Ko9khWX1h40MIEUNS2mDoIa8aXsPfskER+GbTvs/IJZ1QTBBhhuetSw==", + "dev": true, + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.1", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.0.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.4.2" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-server/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.0.tgz", + "integrity": "sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.4.4.tgz", + "integrity": "sha512-h9atBP/bsZohWpHnr+2sic8Iecb60GxftXsWNLLLSqewgIsGzByd2gcIID4nXcG+3tNe4GQG3dLcff3kXupdRA==", + "dev": true + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/whatwg-fetch": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", + "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==" + }, + "node_modules/whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.8.tgz", + "integrity": "sha512-ri1Id1WinAX5Jqn9HejiGb8crfRio0Qgu8+MtL36rlTA6RLsMdWt1Az/19A2Qij6uSHUMphEFaTKa4WG+UNHNw==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yorkie": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yorkie/-/yorkie-2.0.0.tgz", + "integrity": "sha512-jcKpkthap6x63MB4TxwCyuIGkV0oYP/YRyuQU5UO0Yz/E/ZAu+653/uov+phdmO54n6BcvFRyyt0RRrWdN2mpw==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "execa": "^0.8.0", + "is-ci": "^1.0.10", + "normalize-path": "^1.0.0", + "strip-indent": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/yorkie/node_modules/cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", + "dev": true, + "dependencies": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "node_modules/yorkie/node_modules/execa": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz", + "integrity": "sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA==", + "dev": true, + "dependencies": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/yorkie/node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/yorkie/node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/yorkie/node_modules/normalize-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-1.0.0.tgz", + "integrity": "sha512-7WyT0w8jhpDStXRq5836AMmihQwq2nrUVQrgjvUo/p/NZf9uy/MeJ246lBJVmWuYXMlJuG9BNZHF0hWjfTbQUA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yorkie/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "dev": true + } + }, + "dependencies": { + "@achrinza/node-ipc": { + "version": "9.2.5", + "resolved": "https://registry.npmjs.org/@achrinza/node-ipc/-/node-ipc-9.2.5.tgz", + "integrity": "sha512-kBX7Ay911iXZ3VZ1pYltj3Rfu7Ow9H7sK4H4RSfWIfWR2JKNB40K808wppoRIEzE2j2hXLU+r6TJgCAliCGhyQ==", + "dev": true, + "requires": { + "@node-ipc/js-queue": "2.0.3", + "event-pubsub": "4.3.0", + "js-message": "1.0.7" + } + }, + "@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@auth0/auth0-spa-js": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/@auth0/auth0-spa-js/-/auth0-spa-js-1.22.4.tgz", + "integrity": "sha512-iOboSV+aUsExV1onKvGKEqi626sjJt+61c3EvA4mkn9RM7RV9RMjPI+cInNFHWjwAd2Sdi3LqBj6/MfcHh69dg==", + "requires": { + "abortcontroller-polyfill": "^1.7.3", + "browser-tabs-lock": "^1.2.15", + "core-js": "^3.24.0", + "es-cookie": "~1.3.2", + "fast-text-encoding": "^1.0.4", + "promise-polyfill": "^8.2.3", + "unfetch": "^4.2.0" + } + }, + "@auth0/auth0-vue": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@auth0/auth0-vue/-/auth0-vue-1.0.2.tgz", + "integrity": "sha512-Oj64AV9ti3AwyKBpEnLvhj16xL2erXFRJrqVI/kvLxYjLnn5GWui/7/iJghvCEHjyxIaJRUtgh3+ZiQgMkDvzQ==", + "requires": { + "@auth0/auth0-spa-js": "^1.22.1", + "vue": "^3.2.35" + } + }, + "@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "requires": { + "@babel/highlight": "^7.18.6" + } + }, + "@babel/compat-data": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.6.tgz", + "integrity": "sha512-tzulrgDT0QD6U7BJ4TKVk2SDDg7wlP39P9yAx1RfLy7vP/7rsDRlWVfbWxElslu56+r7QOhB2NSDsabYYruoZQ==", + "dev": true + }, + "@babel/core": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.6.tgz", + "integrity": "sha512-cQbWBpxcbbs/IUredIPkHiAGULLV8iwgNRMFzvbhEXISp4f3rUUXE5+TIw6KwUWUR3DwyI6gmBRnmAtYaWehwQ==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.6", + "@babel/helper-compilation-targets": "^7.18.6", + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helpers": "^7.18.6", + "@babel/parser": "^7.18.6", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.6", + "@babel/types": "^7.18.6", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + } + }, + "@babel/generator": { + "version": "7.18.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.7.tgz", + "integrity": "sha512-shck+7VLlY72a2w9c3zYWuE1pwOKEiQHV7GTUbSnhyl5eu3i04t30tBY82ZRWrDfo3gkakCFtevExnxbkf2a3A==", + "dev": true, + "requires": { + "@babel/types": "^7.18.7", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.6.tgz", + "integrity": "sha512-KT10c1oWEpmrIRYnthbzHgoOf6B+Xd6a5yhdbNtdhtG7aO1or5HViuf1TQR36xY/QprXA5nvxO6nAjhJ4y38jw==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.18.6", + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.6.tgz", + "integrity": "sha512-vFjbfhNCzqdeAtZflUFrG5YIFqGTqsctrtkZ1D/NB0mDW9TwW3GmmUepYY4G9wCET5rY5ugz4OGTcLd614IzQg==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.20.2", + "semver": "^6.3.0" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.6.tgz", + "integrity": "sha512-YfDzdnoxHGV8CzqHGyCbFvXg5QESPFkXlHtvdCkesLjjVMT2Adxe4FGUR5ChIb3DxSaXO12iIOCWoXdsUVwnqw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-function-name": "^7.18.6", + "@babel/helper-member-expression-to-functions": "^7.18.6", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz", + "integrity": "sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "regexpu-core": "^5.1.0" + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", + "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + } + }, + "@babel/helper-environment-visitor": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.6.tgz", + "integrity": "sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q==", + "dev": true + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", + "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-function-name": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.6.tgz", + "integrity": "sha512-0mWMxV1aC97dhjCah5U5Ua7668r5ZmSC2DLfH2EZnf9c3/dHZKiFa5pRLMH5tjSl471tY6496ZWk/kjNONBxhw==", + "dev": true, + "requires": { + "@babel/template": "^7.18.6", + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.6.tgz", + "integrity": "sha512-CeHxqwwipekotzPDUuJOfIMtcIHBuc7WAzLmTYWctVigqS5RktNMQ5bEwQSuGewzYnCtTWa3BARXeiLxDTv+Ng==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-module-transforms": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.6.tgz", + "integrity": "sha512-L//phhB4al5uucwzlimruukHB3jRd5JGClwRMD/ROrVjXfLqovYnvQrK/JK36WYyVwGGO7OD3kMyVTjx+WVPhw==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.18.6", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.6", + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", + "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.6.tgz", + "integrity": "sha512-gvZnm1YAAxh13eJdkb9EWHBnF3eAub3XTLCZEehHT2kWxiKVRL64+ae5Y6Ivne0mVHmMYKT+xWgZO+gQhuLUBg==", + "dev": true + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.6.tgz", + "integrity": "sha512-z5wbmV55TveUPZlCLZvxWHtrjuJd+8inFhk7DG0WW87/oJuGDcjDiu7HIvGcpf5464L6xKCg3vNkmlVVz9hwyQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-wrap-function": "^7.18.6", + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-replace-supers": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.6.tgz", + "integrity": "sha512-fTf7zoXnUGl9gF25fXCWE26t7Tvtyn6H4hkLSYhATwJvw2uYxd3aoXplMSe0g9XbwK7bmxNes7+FGO0rB/xC0g==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-member-expression-to-functions": "^7.18.6", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/traverse": "^7.18.6", + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-simple-access": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", + "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.6.tgz", + "integrity": "sha512-4KoLhwGS9vGethZpAhYnMejWkX64wsnHPDwvOsKWU6Fg4+AlK2Jz3TyjQLMEPvz+1zemi/WBdkYxCD0bAfIkiw==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", + "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.6.tgz", + "integrity": "sha512-I5/LZfozwMNbwr/b1vhhuYD+J/mU+gfGAj5td7l5Rv9WYmH6i3Om69WGKNmlIpsVW/mF6O5bvTKbvDQZVgjqOw==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.18.6", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.6", + "@babel/types": "^7.18.6" + } + }, + "@babel/helpers": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.6.tgz", + "integrity": "sha512-vzSiiqbQOghPngUYt/zWGvK3LAsPhz55vc9XNN0xAl2gV4ieShI2OQli5duxWHD+72PZPTKAcfcZDE1Cwc5zsQ==", + "dev": true, + "requires": { + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.6", + "@babel/types": "^7.18.6" + } + }, + "@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.6.tgz", + "integrity": "sha512-uQVSa9jJUe/G/304lXspfWVpKpK4euFLgGiMQFOCpM/bgcAdeoHwi/OQz23O9GK2osz26ZiXRRV9aV+Yl1O8tw==" + }, + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", + "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.6.tgz", + "integrity": "sha512-Udgu8ZRgrBrttVz6A0EVL0SJ1z+RLbIeqsu632SA1hf0awEppD6TvdznoH+orIF8wtFFAV/Enmw9Y+9oV8TQcw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.6" + } + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.6.tgz", + "integrity": "sha512-WAz4R9bvozx4qwf74M+sfqPMKfSqwM0phxPTR6iJIi8robgzXwkEgmeJG1gEKhm6sDqT/U9aV3lfcqybIpev8w==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-remap-async-to-generator": "^7.18.6", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-proposal-class-static-block": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", + "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + } + }, + "@babel/plugin-proposal-decorators": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.18.6.tgz", + "integrity": "sha512-gAdhsjaYmiZVxx5vTMiRfj31nB7LhwBJFMSLzeDxc7X4tKLixup0+k9ughn0RcpBrv9E3PBaXJW7jF5TCihAOg==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/plugin-syntax-decorators": "^7.18.6" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", + "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.6.tgz", + "integrity": "sha512-zr/QcUlUo7GPo6+X1wC98NJADqmy5QTFWWhqeQWiki4XHafJtLl/YMGkmRB2szDD2IYJCCdBTd4ElwhId9T7Xw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", + "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.6.tgz", + "integrity": "sha512-zMo66azZth/0tVd7gmkxOkOjs2rpHyhpcFo565PUP37hSp6hSd9uUKIfTDFMz58BwqgQKhJ9YxtM5XddjXVn+Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.6.tgz", + "integrity": "sha512-9yuM6wr4rIsKa1wlUAbZEazkCrgw2sMPEXCr4Rnwetu7cEW1NydkCWytLuYletbf8vFxdJxFhwEZqMpOx2eZyw==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.18.6", + "@babel/helper-compilation-targets": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.18.6" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", + "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.6.tgz", + "integrity": "sha512-PatI6elL5eMzoypFAiYDpYQyMtXTn+iMhuxxQt5mAXD4fEmKorpSI3PHd+i3JXBJN3xyA6MvJv7at23HffFHwA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz", + "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-decorators": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.18.6.tgz", + "integrity": "sha512-fqyLgjcxf/1yhyZ6A+yo1u9gJ7eleFQod2lkaUsF9DQ7sbbY3Ligym3L0+I2c0WmqNKDpoD9UTb1AKP3qRMOAQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-import-assertions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz", + "integrity": "sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", + "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz", + "integrity": "sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", + "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz", + "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-remap-async-to-generator": "^7.18.6" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", + "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.6.tgz", + "integrity": "sha512-pRqwb91C42vs1ahSAWJkxOxU1RHWDn16XAa6ggQ72wjLlWyYeAcLvTtE0aM8ph3KNydy9CQF2nLYcjq1WysgxQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.6.tgz", + "integrity": "sha512-XTg8XW/mKpzAF3actL554Jl/dOYoJtv3l8fxaEczpgz84IeeVf+T1u2CSvPHuZbt0w3JkIx4rdn/MRQI7mo0HQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-function-name": "^7.18.6", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.6.tgz", + "integrity": "sha512-9repI4BhNrR0KenoR9vm3/cIc1tSBIo+u1WVjKCAynahj25O8zfbiE6JtAtHPGQSs4yZ+bA8mRasRP+qc+2R5A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.6.tgz", + "integrity": "sha512-tgy3u6lRp17ilY8r1kP4i2+HDUwxlVqq3RTc943eAWSzGgpU1qhiKpqZ5CMyHReIYPHdo3Kg8v8edKtDqSVEyQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", + "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.6.tgz", + "integrity": "sha512-NJU26U/208+sxYszf82nmGYqVF9QN8py2HFTblPT9hbawi8+1C5a9JubODLTGFuT0qlkqVinmkwOD13s0sZktg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", + "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.6.tgz", + "integrity": "sha512-WAjoMf4wIiSsy88KmG7tgj2nFdEK7E46tArVtcgED7Bkj6Fg/tG5SbvNIOKxbFS2VFgNh6+iaPswBeQZm4ox8w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.6.tgz", + "integrity": "sha512-kJha/Gbs5RjzIu0CxZwf5e3aTTSlhZnHMT8zPWnJMjNpLOUgqevg+PN5oMH68nMCXnfiMo4Bhgxqj59KHTlAnA==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.18.6", + "@babel/helper-function-name": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.6.tgz", + "integrity": "sha512-x3HEw0cJZVDoENXOp20HlypIHfl0zMIhMVZEBVTfmqbObIpsMxMbmU5nOEO8R7LYT+z5RORKPlTI5Hj4OsO9/Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", + "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz", + "integrity": "sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz", + "integrity": "sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.6.tgz", + "integrity": "sha512-UbPYpXxLjTw6w6yXX2BYNxF3p6QY225wcTkfQCy3OMnSlS/C3xGtwUjEzGkldb/sy6PWLiCQ3NbYfjWUTI3t4g==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-identifier": "^7.18.6", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", + "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz", + "integrity": "sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", + "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", + "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.6.tgz", + "integrity": "sha512-FjdqgMv37yVl/gwvzkcB+wfjRI8HQmc5EgOG9iGNvUY1ok+TjsoaMP7IqCDZBhkFcM5f3OPVMs6Dmp03C5k4/A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", + "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz", + "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "regenerator-transform": "^0.15.0" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", + "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.6.tgz", + "integrity": "sha512-8uRHk9ZmRSnWqUgyae249EJZ94b0yAGLBIqzZzl+0iEdbno55Pmlt/32JZsHwXD9k/uZj18Aqqk35wBX4CBTXA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "babel-plugin-polyfill-corejs2": "^0.3.1", + "babel-plugin-polyfill-corejs3": "^0.5.2", + "babel-plugin-polyfill-regenerator": "^0.3.1", + "semver": "^6.3.0" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", + "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.6.tgz", + "integrity": "sha512-ayT53rT/ENF8WWexIRg9AiV9h0aIteyWn5ptfZTZQrjk/+f3WdrJGCY4c9wcgl2+MKkKPhzbYp97FTsquZpDCw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", + "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.6.tgz", + "integrity": "sha512-UuqlRrQmT2SWRvahW46cGSany0uTlcj8NYOS5sRGYi8FxPYPoLd5DDmMd32ZXEj2Jq+06uGVQKHxa/hJx2EzKw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.6.tgz", + "integrity": "sha512-7m71iS/QhsPk85xSjFPovHPcH3H9qeyzsujhTc+vcdnsXavoWYJ74zx0lP5RhpC5+iDnVLO+PPMHzC11qels1g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.6.tgz", + "integrity": "sha512-XNRwQUXYMP7VLuy54cr/KS/WeL3AZeORhrmeZ7iewgu+X2eBqmpaLI/hzqr9ZxCeUoq0ASK4GUzSM0BDhZkLFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", + "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/preset-env": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.6.tgz", + "integrity": "sha512-WrthhuIIYKrEFAwttYzgRNQ5hULGmwTj+D6l7Zdfsv5M7IWV/OZbUfbeL++Qrzx1nVJwWROIFhCHRYQV4xbPNw==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.18.6", + "@babel/helper-compilation-targets": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.6", + "@babel/plugin-proposal-async-generator-functions": "^7.18.6", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-class-static-block": "^7.18.6", + "@babel/plugin-proposal-dynamic-import": "^7.18.6", + "@babel/plugin-proposal-export-namespace-from": "^7.18.6", + "@babel/plugin-proposal-json-strings": "^7.18.6", + "@babel/plugin-proposal-logical-assignment-operators": "^7.18.6", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", + "@babel/plugin-proposal-numeric-separator": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.18.6", + "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.6", + "@babel/plugin-proposal-private-methods": "^7.18.6", + "@babel/plugin-proposal-private-property-in-object": "^7.18.6", + "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.18.6", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.18.6", + "@babel/plugin-transform-async-to-generator": "^7.18.6", + "@babel/plugin-transform-block-scoped-functions": "^7.18.6", + "@babel/plugin-transform-block-scoping": "^7.18.6", + "@babel/plugin-transform-classes": "^7.18.6", + "@babel/plugin-transform-computed-properties": "^7.18.6", + "@babel/plugin-transform-destructuring": "^7.18.6", + "@babel/plugin-transform-dotall-regex": "^7.18.6", + "@babel/plugin-transform-duplicate-keys": "^7.18.6", + "@babel/plugin-transform-exponentiation-operator": "^7.18.6", + "@babel/plugin-transform-for-of": "^7.18.6", + "@babel/plugin-transform-function-name": "^7.18.6", + "@babel/plugin-transform-literals": "^7.18.6", + "@babel/plugin-transform-member-expression-literals": "^7.18.6", + "@babel/plugin-transform-modules-amd": "^7.18.6", + "@babel/plugin-transform-modules-commonjs": "^7.18.6", + "@babel/plugin-transform-modules-systemjs": "^7.18.6", + "@babel/plugin-transform-modules-umd": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6", + "@babel/plugin-transform-new-target": "^7.18.6", + "@babel/plugin-transform-object-super": "^7.18.6", + "@babel/plugin-transform-parameters": "^7.18.6", + "@babel/plugin-transform-property-literals": "^7.18.6", + "@babel/plugin-transform-regenerator": "^7.18.6", + "@babel/plugin-transform-reserved-words": "^7.18.6", + "@babel/plugin-transform-shorthand-properties": "^7.18.6", + "@babel/plugin-transform-spread": "^7.18.6", + "@babel/plugin-transform-sticky-regex": "^7.18.6", + "@babel/plugin-transform-template-literals": "^7.18.6", + "@babel/plugin-transform-typeof-symbol": "^7.18.6", + "@babel/plugin-transform-unicode-escapes": "^7.18.6", + "@babel/plugin-transform-unicode-regex": "^7.18.6", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.18.6", + "babel-plugin-polyfill-corejs2": "^0.3.1", + "babel-plugin-polyfill-corejs3": "^0.5.2", + "babel-plugin-polyfill-regenerator": "^0.3.1", + "core-js-compat": "^3.22.1", + "semver": "^6.3.0" + } + }, + "@babel/preset-modules": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/runtime": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.6.tgz", + "integrity": "sha512-t9wi7/AW6XtKahAe20Yw0/mMljKq0B1r2fPdvaAdV/KPDZewFXdaaa6K7lxmZBZ8FBNpCiAT6iHPmd6QO9bKfQ==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", + "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.6", + "@babel/types": "^7.18.6" + } + }, + "@babel/traverse": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.6.tgz", + "integrity": "sha512-zS/OKyqmD7lslOtFqbscH6gMLFYOfG1YPqCKfAW5KrTeolKqvB8UelR49Fpr6y93kYkW2Ik00mT1LOGiAGvizw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-function-name": "^7.18.6", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.18.6", + "@babel/types": "^7.18.6", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.18.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", + "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "to-fast-properties": "^2.0.0" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "@eslint/eslintrc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", + "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.3.2", + "globals": "^13.15.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "globals": { + "version": "13.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz", + "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + } + } + }, + "@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", + "dev": true + }, + "@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "dev": true, + "requires": { + "@hapi/hoek": "^9.0.0" + } + }, + "@headlessui/vue": { + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/@headlessui/vue/-/vue-1.6.5.tgz", + "integrity": "sha512-C/BeTVuowTDLkGgUd6UfiPZVDLdR7OTnd8o4wF37Ub9Js1uhQ3XSTfitdZvlJALUqeQ30j+5Hk3KyjVDLQ3GYQ==", + "requires": {} + }, + "@heroicons/vue": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@heroicons/vue/-/vue-2.0.13.tgz", + "integrity": "sha512-vVCVF02+rNKXEmanVNnmktJlxCbOn0qVFP1gfZPn4bcBIwPX3h9AVHGCkwly+IWDEME8w5oooG0KRd2hhSe/HQ==", + "requires": {} + }, + "@humanwhocodes/config-array": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", + "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@jest/console": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.1.tgz", + "integrity": "sha512-0RiUocPVFEm3WRMOStIHbRWllG6iW6E3/gUPnf4lkrVFyXIIDeCe+vlKeYyFOMhB2EPE6FLFCNADSOOQMaqvyA==", + "dev": true, + "requires": { + "@jest/types": "^28.1.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^28.1.1", + "jest-util": "^28.1.1", + "slash": "^3.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.1.tgz", + "integrity": "sha512-vRXVqSg1VhDnB8bWcmvLzmg0Bt9CRKVgHPXqYwvWMX3TvAjeO+nRuK6+VdTKCtWOvYlmkF/HqNAL/z+N3B53Kw==", + "dev": true, + "requires": { + "@jest/schemas": "^28.0.2", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "17.0.10", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.10.tgz", + "integrity": "sha512-gmEaFwpj/7f/ROdtIlci1R1VYU1J4j95m8T+Tj3iBgiBFKg1foE/PSl93bBd5T9LDXNPo8UlNN6W0qwD8O5OaA==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-util": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.1.tgz", + "integrity": "sha512-FktOu7ca1DZSyhPAxgxB6hfh2+9zMoJ7aEQA759Z6p45NuO8mWcqujH+UdHlCm/V6JTWwDztM2ITCzU1ijJAfw==", + "dev": true, + "requires": { + "@jest/types": "^28.1.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/core": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", + "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", + "dev": true, + "requires": { + "@jest/console": "^27.5.1", + "@jest/reporters": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^27.5.1", + "jest-config": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-resolve-dependencies": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "jest-watcher": "^27.5.1", + "micromatch": "^4.0.4", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "@jest/console": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", + "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0" + } + }, + "@jest/test-result": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", + "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", + "dev": true, + "requires": { + "@jest/console": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "emittery": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", + "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + } + }, + "jest-watcher": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", + "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", + "dev": true, + "requires": { + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^27.5.1", + "string-length": "^4.0.1" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + } + } + }, + "@jest/environment": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", + "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", + "dev": true, + "requires": { + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1" + } + }, + "@jest/fake-timers": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", + "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@sinonjs/fake-timers": "^8.0.1", + "@types/node": "*", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/globals": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", + "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", + "dev": true, + "requires": { + "@jest/environment": "^27.5.1", + "@jest/types": "^27.5.1", + "expect": "^27.5.1" + } + }, + "@jest/reporters": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", + "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-haste-map": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^8.1.0" + }, + "dependencies": { + "@jest/console": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", + "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0" + } + }, + "@jest/test-result": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", + "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", + "dev": true, + "requires": { + "@jest/console": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/schemas": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.0.2.tgz", + "integrity": "sha512-YVDJZjd4izeTDkij00vHHAymNXQ6WWsdChFRK86qck6Jpr3DCL5W3Is3vslviRlP+bLuMYRLbdp98amMvqudhA==", + "dev": true, + "requires": { + "@sinclair/typebox": "^0.23.3" + } + }, + "@jest/source-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", + "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9", + "source-map": "^0.6.0" + } + }, + "@jest/test-result": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.1.tgz", + "integrity": "sha512-hPmkugBktqL6rRzwWAtp1JtYT4VHwv8OQ+9lE5Gymj6dHzubI/oJHMUpPOt8NrdVWSrz9S7bHjJUmv2ggFoUNQ==", + "dev": true, + "requires": { + "@jest/console": "^28.1.1", + "@jest/types": "^28.1.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.1.tgz", + "integrity": "sha512-vRXVqSg1VhDnB8bWcmvLzmg0Bt9CRKVgHPXqYwvWMX3TvAjeO+nRuK6+VdTKCtWOvYlmkF/HqNAL/z+N3B53Kw==", + "dev": true, + "requires": { + "@jest/schemas": "^28.0.2", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "17.0.10", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.10.tgz", + "integrity": "sha512-gmEaFwpj/7f/ROdtIlci1R1VYU1J4j95m8T+Tj3iBgiBFKg1foE/PSl93bBd5T9LDXNPo8UlNN6W0qwD8O5OaA==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/test-sequencer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", + "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", + "dev": true, + "requires": { + "@jest/test-result": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-runtime": "^27.5.1" + }, + "dependencies": { + "@jest/console": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", + "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0" + } + }, + "@jest/test-result": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", + "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", + "dev": true, + "requires": { + "@jest/console": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/transform": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", + "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^27.5.1", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-util": "^27.5.1", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "dev": true + }, + "@node-ipc/js-queue": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@node-ipc/js-queue/-/js-queue-2.0.3.tgz", + "integrity": "sha512-fL1wpr8hhD5gT2dA1qifeVaoDFlQR5es8tFuKqjHX+kdOtdNHnxkVZbtIrR2rxnMFvehkjaZRNV2H/gPXlb0hw==", + "dev": true, + "requires": { + "easy-stack": "1.0.1" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@polka/url": { + "version": "1.0.0-next.21", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", + "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==", + "dev": true + }, + "@popperjs/core": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.5.tgz", + "integrity": "sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw==" + }, + "@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "requires": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "@rushstack/eslint-patch": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.1.4.tgz", + "integrity": "sha512-LwzQKA4vzIct1zNZzBmRKI9QuNpLgTQMEjsQLf3BXuGYb3QPTP4Yjf6mkdX+X1mYttZ808QpOwAzZjv28kq7DA==", + "dev": true + }, + "@sideway/address": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", + "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", + "dev": true, + "requires": { + "@hapi/hoek": "^9.0.0" + } + }, + "@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", + "dev": true + }, + "@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "dev": true + }, + "@sinclair/typebox": { + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.23.5.tgz", + "integrity": "sha512-AFBVi/iT4g20DHoujvMH1aEDn8fGJh4xsRGCP6d8RpLPMqsNPvW01Jcn0QysXTsg++/xj25NmJsGyH9xug/wKg==", + "dev": true + }, + "@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", + "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@soda/friendly-errors-webpack-plugin": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.8.1.tgz", + "integrity": "sha512-h2ooWqP8XuFqTXT+NyAFbrArzfQA7R6HTezADrvD9Re8fxMLTPPniLdqVTdDaO0eIoLaAwKT+d6w+5GeTk7Vbg==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "error-stack-parser": "^2.0.6", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@soda/get-current-script": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@soda/get-current-script/-/get-current-script-1.0.2.tgz", + "integrity": "sha512-T7VNNlYVM1SgQ+VsMYhnDkcGmWhQdL0bDyGm5TlQ3GBXnJscEClUUOKduWTmm2zCnvNLC1hc3JpuXjs/nFOc5w==", + "dev": true + }, + "@stardazed/streams-polyfill": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@stardazed/streams-polyfill/-/streams-polyfill-2.4.0.tgz", + "integrity": "sha512-W6Yg9cA8YT1b9qCQsz/2+kmKt7i/Za2Nj4QOLqdiANzpTiGy5mOyCQNyh0CVpbvXkjCBo2QxrwPvbDlP9u9k+Q==" + }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true + }, + "@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true + }, + "@types/babel__core": { + "version": "7.1.19", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", + "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.17.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.17.1.tgz", + "integrity": "sha512-kVzjari1s2YVi77D3w1yuvohV2idweYXMCDzqBiVNN63TcDWrIlTVOYpqVrvbbyOE/IyzBoTKF0fdnLPEORFxA==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0" + } + }, + "@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/connect-history-api-fallback": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", + "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "dev": true, + "requires": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "@types/eslint": { + "version": "8.4.3", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.3.tgz", + "integrity": "sha512-YP1S7YJRMPs+7KZKDb9G63n8YejIwW9BALq7a5j2+H4yl6iOv9CB29edho+cuFRrvmJbbaH2yiVChKLJVysDGw==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", + "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", + "dev": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "dev": true + }, + "@types/express": { + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", + "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "dev": true, + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.29", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.29.tgz", + "integrity": "sha512-uMd++6dMKS32EOuw1Uli3e3BPgdLIXmezcfHv7N4c1s3gkhikBplORPpMq3fuWkxncZN1reb16d5n8yhQ80x7Q==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "@types/graceful-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "dev": true + }, + "@types/http-proxy": { + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", + "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/jest": { + "version": "27.5.2", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.5.2.tgz", + "integrity": "sha512-mpT8LJJ4CMeeahobofYWIjFo0xonRS/HfxnVEPMPFSQdGUt1uHCnoPT7Zhb+sjDU2wz0oKV0OLUR0WzrHNgfeA==", + "dev": true, + "requires": { + "jest-matcher-utils": "^27.0.0", + "pretty-format": "^27.0.0" + } + }, + "@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" + }, + "@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" + }, + "@types/luxon": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-2.4.0.tgz", + "integrity": "sha512-oCavjEjRXuR6URJEtQm0eBdfsBiEcGBZbq21of8iGkeKxU1+1xgKuFPClaBZl2KB8ZZBSWlgk61tH6Mf+nvZVw==", + "dev": true + }, + "@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, + "@types/minimist": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "dev": true + }, + "@types/node": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.0.tgz", + "integrity": "sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA==" + }, + "@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "dev": true + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "@types/pluralize": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/pluralize/-/pluralize-0.0.29.tgz", + "integrity": "sha512-BYOID+l2Aco2nBik+iYS4SZX0Lf20KPILP5RGmM1IgzdwNdTs0eebiFriOPcej1sX9mLnSoiNte5zcFxssgpGA==", + "dev": true + }, + "@types/prettier": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.6.3.tgz", + "integrity": "sha512-ymZk3LEC/fsut+/Q5qejp6R9O1rMxz3XaRHDV6kX8MrGAhOSPqVARbDi+EZvInBpw+BnCX3TD240byVkOfQsHg==", + "dev": true + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true + }, + "@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "dev": true, + "requires": { + "@types/express": "*" + } + }, + "@types/serve-static": { + "version": "1.13.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", + "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", + "dev": true, + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "@types/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ==", + "dev": true, + "optional": true, + "peer": true + }, + "@types/strip-json-comments": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", + "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", + "dev": true, + "optional": true, + "peer": true + }, + "@types/uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-kr90f+ERiQtKWMz5rP32ltJ/BtULDI5RVO0uavn1HQUOwjx0R1h0rnDYNL0CepF1zL5bSY6FISAfd9tOdDhU5Q==", + "dev": true + }, + "@types/webpack-env": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.17.0.tgz", + "integrity": "sha512-eHSaNYEyxRA5IAG0Ym/yCyf86niZUIF/TpWKofQI/CVfh5HsMEUyfE2kwFxha4ow0s5g0LfISQxpDKjbRDrizw==", + "dev": true + }, + "@types/ws": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", + "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/yargs": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.30.0.tgz", + "integrity": "sha512-lvhRJ2pGe2V9MEU46ELTdiHgiAFZPKtLhiU5wlnaYpMc2+c1R8fh8i80ZAa665drvjHKUJyRRGg3gEm1If54ow==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.30.0", + "@typescript-eslint/type-utils": "5.30.0", + "@typescript-eslint/utils": "5.30.0", + "debug": "^4.3.4", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.2.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "dependencies": { + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/parser": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.30.0.tgz", + "integrity": "sha512-2oYYUws5o2liX6SrFQ5RB88+PuRymaM2EU02/9Ppoyu70vllPnHVO7ioxDdq/ypXHA277R04SVjxvwI8HmZpzA==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.30.0", + "@typescript-eslint/types": "5.30.0", + "@typescript-eslint/typescript-estree": "5.30.0", + "debug": "^4.3.4" + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.30.0.tgz", + "integrity": "sha512-3TZxvlQcK5fhTBw5solQucWSJvonXf5yua5nx8OqK94hxdrT7/6W3/CS42MLd/f1BmlmmbGEgQcTHHCktUX5bQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.30.0", + "@typescript-eslint/visitor-keys": "5.30.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.30.0.tgz", + "integrity": "sha512-GF8JZbZqSS+azehzlv/lmQQ3EU3VfWYzCczdZjJRxSEeXDQkqFhCBgFhallLDbPwQOEQ4MHpiPfkjKk7zlmeNg==", + "dev": true, + "requires": { + "@typescript-eslint/utils": "5.30.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/types": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.30.0.tgz", + "integrity": "sha512-vfqcBrsRNWw/LBXyncMF/KrUTYYzzygCSsVqlZ1qGu1QtGs6vMkt3US0VNSQ05grXi5Yadp3qv5XZdYLjpp8ag==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.30.0.tgz", + "integrity": "sha512-hDEawogreZB4n1zoqcrrtg/wPyyiCxmhPLpZ6kmWfKF5M5G0clRLaEexpuWr31fZ42F96SlD/5xCt1bT5Qm4Nw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.30.0", + "@typescript-eslint/visitor-keys": "5.30.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "dependencies": { + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/utils": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.30.0.tgz", + "integrity": "sha512-0bIgOgZflLKIcZsWvfklsaQTM3ZUbmtH0rJ1hKyV3raoUYyeZwcjQ8ZUJTzS7KnhNcsVT1Rxs7zeeMHEhGlltw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.30.0", + "@typescript-eslint/types": "5.30.0", + "@typescript-eslint/typescript-estree": "5.30.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.30.0.tgz", + "integrity": "sha512-6WcIeRk2DQ3pHKxU1Ni0qMXJkjO/zLjBymlYBy/53qxe7yjEFSvzKLDToJjURUhSl2Fzhkl4SMXQoETauF74cw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.30.0", + "eslint-visitor-keys": "^3.3.0" + } + }, + "@volar-plugins/vetur": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@volar-plugins/vetur/-/vetur-0.1.0.tgz", + "integrity": "sha512-Qaws7TI8d/kkjihSQrW/3YGqiLeLZ1dMjfxDBe4vJKhzXw82sN4+Wr8NwGf2s15KyVDPQTjkPHv6ukn4vFD9Og==", + "dev": true, + "requires": { + "@volar/vue-language-service-types": "^0.34.0", + "vls": "^0.8.0", + "vscode-html-languageservice": "^5.0.0", + "vscode-uri": "^3.0.3" + } + }, + "@volar/vue-language-service-types": { + "version": "0.34.17", + "resolved": "https://registry.npmjs.org/@volar/vue-language-service-types/-/vue-language-service-types-0.34.17.tgz", + "integrity": "sha512-skDO8ZS6Vs0M+zbnYeoBWk7JX8WbCeCohOwnkstqYxXtcqEU4HTeTShhVxrfyWGS0FLHVE79VAhicxjul2EnHw==", + "dev": true, + "requires": { + "vscode-languageserver-protocol": "^3.17.1", + "vscode-languageserver-textdocument": "^1.0.4" + } + }, + "@vscode/l10n": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/@vscode/l10n/-/l10n-0.0.11.tgz", + "integrity": "sha512-ukOMWnCg1tCvT7WnDfsUKQOFDQGsyR5tNgRpwmqi+5/vzU3ghdDXzvIM4IOPdSb3OeSsBNvmSL8nxIVOqi2WXA==", + "dev": true + }, + "@vue/babel-helper-vue-jsx-merge-props": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.2.1.tgz", + "integrity": "sha512-QOi5OW45e2R20VygMSNhyQHvpdUwQZqGPc748JLGCYEy+yp8fNFNdbNIGAgZmi9e+2JHPd6i6idRuqivyicIkA==", + "dev": true + }, + "@vue/babel-helper-vue-transform-on": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.0.2.tgz", + "integrity": "sha512-hz4R8tS5jMn8lDq6iD+yWL6XNB699pGIVLk7WSJnn1dbpjaazsjZQkieJoRX6gW5zpYSCFqQ7jUquPNY65tQYA==", + "dev": true + }, + "@vue/babel-plugin-jsx": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.1.1.tgz", + "integrity": "sha512-j2uVfZjnB5+zkcbc/zsOc0fSNGCMMjaEXP52wdwdIfn0qjFfEYpYZBFKFg+HHnQeJCVrjOeO0YxgaL7DMrym9w==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.0.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "@vue/babel-helper-vue-transform-on": "^1.0.2", + "camelcase": "^6.0.0", + "html-tags": "^3.1.0", + "svg-tags": "^1.0.0" + } + }, + "@vue/babel-plugin-transform-vue-jsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.2.1.tgz", + "integrity": "sha512-HJuqwACYehQwh1fNT8f4kyzqlNMpBuUK4rSiSES5D4QsYncv5fxFsLyrxFPG2ksO7t5WP+Vgix6tt6yKClwPzA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1", + "html-tags": "^2.0.0", + "lodash.kebabcase": "^4.1.1", + "svg-tags": "^1.0.0" + }, + "dependencies": { + "html-tags": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", + "integrity": "sha512-+Il6N8cCo2wB/Vd3gqy/8TZhTD3QvcVeQLCnZiGkGCH3JP28IgGAY41giccp2W4R3jfyJPAP318FQTa1yU7K7g==", + "dev": true + } + } + }, + "@vue/babel-preset-app": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@vue/babel-preset-app/-/babel-preset-app-5.0.6.tgz", + "integrity": "sha512-hoVr5M5RIvAL8F6MX8ZG0RvjA7MB7eDOkykK+M+qThkkrsAvlianzygnE86xN1N7JVSq7kGOyZk0Te+L20KqeQ==", + "dev": true, + "requires": { + "@babel/core": "^7.12.16", + "@babel/helper-compilation-targets": "^7.12.16", + "@babel/helper-module-imports": "^7.12.13", + "@babel/plugin-proposal-class-properties": "^7.12.13", + "@babel/plugin-proposal-decorators": "^7.12.13", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-jsx": "^7.12.13", + "@babel/plugin-transform-runtime": "^7.12.15", + "@babel/preset-env": "^7.12.16", + "@babel/runtime": "^7.12.13", + "@vue/babel-plugin-jsx": "^1.0.3", + "@vue/babel-preset-jsx": "^1.1.2", + "babel-plugin-dynamic-import-node": "^2.3.3", + "core-js": "^3.8.3", + "core-js-compat": "^3.8.3", + "semver": "^7.3.4" + }, + "dependencies": { + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@vue/babel-preset-jsx": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@vue/babel-preset-jsx/-/babel-preset-jsx-1.2.4.tgz", + "integrity": "sha512-oRVnmN2a77bYDJzeGSt92AuHXbkIxbf/XXSE3klINnh9AXBmVS1DGa1f0d+dDYpLfsAKElMnqKTQfKn7obcL4w==", + "dev": true, + "requires": { + "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1", + "@vue/babel-plugin-transform-vue-jsx": "^1.2.1", + "@vue/babel-sugar-composition-api-inject-h": "^1.2.1", + "@vue/babel-sugar-composition-api-render-instance": "^1.2.4", + "@vue/babel-sugar-functional-vue": "^1.2.2", + "@vue/babel-sugar-inject-h": "^1.2.2", + "@vue/babel-sugar-v-model": "^1.2.3", + "@vue/babel-sugar-v-on": "^1.2.3" + } + }, + "@vue/babel-sugar-composition-api-inject-h": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-composition-api-inject-h/-/babel-sugar-composition-api-inject-h-1.2.1.tgz", + "integrity": "sha512-4B3L5Z2G+7s+9Bwbf+zPIifkFNcKth7fQwekVbnOA3cr3Pq71q71goWr97sk4/yyzH8phfe5ODVzEjX7HU7ItQ==", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@vue/babel-sugar-composition-api-render-instance": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-composition-api-render-instance/-/babel-sugar-composition-api-render-instance-1.2.4.tgz", + "integrity": "sha512-joha4PZznQMsxQYXtR3MnTgCASC9u3zt9KfBxIeuI5g2gscpTsSKRDzWQt4aqNIpx6cv8On7/m6zmmovlNsG7Q==", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@vue/babel-sugar-functional-vue": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.2.2.tgz", + "integrity": "sha512-JvbgGn1bjCLByIAU1VOoepHQ1vFsroSA/QkzdiSs657V79q6OwEWLCQtQnEXD/rLTA8rRit4rMOhFpbjRFm82w==", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@vue/babel-sugar-inject-h": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.2.2.tgz", + "integrity": "sha512-y8vTo00oRkzQTgufeotjCLPAvlhnpSkcHFEp60+LJUwygGcd5Chrpn5480AQp/thrxVm8m2ifAk0LyFel9oCnw==", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@vue/babel-sugar-v-model": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.2.3.tgz", + "integrity": "sha512-A2jxx87mySr/ulAsSSyYE8un6SIH0NWHiLaCWpodPCVOlQVODCaSpiR4+IMsmBr73haG+oeCuSvMOM+ttWUqRQ==", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1", + "@vue/babel-plugin-transform-vue-jsx": "^1.2.1", + "camelcase": "^5.0.0", + "html-tags": "^2.0.0", + "svg-tags": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "html-tags": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", + "integrity": "sha512-+Il6N8cCo2wB/Vd3gqy/8TZhTD3QvcVeQLCnZiGkGCH3JP28IgGAY41giccp2W4R3jfyJPAP318FQTa1yU7K7g==", + "dev": true + } + } + }, + "@vue/babel-sugar-v-on": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.2.3.tgz", + "integrity": "sha512-kt12VJdz/37D3N3eglBywV8GStKNUhNrsxChXIV+o0MwVXORYuhDTHJRKPgLJRb/EY3vM2aRFQdxJBp9CLikjw==", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-plugin-transform-vue-jsx": "^1.2.1", + "camelcase": "^5.0.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } + } + }, + "@vue/cli-overlay": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@vue/cli-overlay/-/cli-overlay-5.0.6.tgz", + "integrity": "sha512-rghCRMPVQ4FIKmQy8ipn8fKztdaQSQTktAKob2SGuEL/iBWfclSMAQCXfj908nyzOBymo+q/Sn/oiLhi07oHlA==", + "dev": true + }, + "@vue/cli-plugin-babel": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-babel/-/cli-plugin-babel-5.0.6.tgz", + "integrity": "sha512-ruQhfhj2WM6Fe/VDQneQc/kqNp/p138SjQMfz7q/rxMTMG1kpV5B0jYWschXHXLQ6aDsFnqmBmIK+XjU3XTF3g==", + "dev": true, + "requires": { + "@babel/core": "^7.12.16", + "@vue/babel-preset-app": "^5.0.6", + "@vue/cli-shared-utils": "^5.0.6", + "babel-loader": "^8.2.2", + "thread-loader": "^3.0.0", + "webpack": "^5.54.0" + } + }, + "@vue/cli-plugin-eslint": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-eslint/-/cli-plugin-eslint-5.0.6.tgz", + "integrity": "sha512-fuc8w2IujzoenA/cdr/QYYMq2yaI1fYr0Fqom/M55B+DmW19GIuIRxYQvh0CEeCbFB2hAl3Flrazfx96/nAaQA==", + "dev": true, + "requires": { + "@vue/cli-shared-utils": "^5.0.6", + "eslint-webpack-plugin": "^3.1.0", + "globby": "^11.0.2", + "webpack": "^5.54.0", + "yorkie": "^2.0.0" + } + }, + "@vue/cli-plugin-router": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-router/-/cli-plugin-router-5.0.6.tgz", + "integrity": "sha512-5ikUdfsSoKqpBhB5GhGYijH6mJnU+ZGqDv3QBf0brDeeh7PhClntxNAOLkB73c+LNxjBrlNCTkItuByF+AD29w==", + "dev": true, + "requires": { + "@vue/cli-shared-utils": "^5.0.6" + } + }, + "@vue/cli-plugin-typescript": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-typescript/-/cli-plugin-typescript-5.0.6.tgz", + "integrity": "sha512-DKw3SZEWs+9v6oUMTJAGcmJY4XCIdLhwXU1MsXDmhea/VqoGTcY9yl1mb/QfZ3AttdRtC7n4Vk01tGa0pnewsA==", + "dev": true, + "requires": { + "@babel/core": "^7.12.16", + "@types/webpack-env": "^1.15.2", + "@vue/cli-shared-utils": "^5.0.6", + "babel-loader": "^8.2.2", + "fork-ts-checker-webpack-plugin": "^6.4.0", + "globby": "^11.0.2", + "thread-loader": "^3.0.0", + "ts-loader": "^9.2.5", + "webpack": "^5.54.0" + } + }, + "@vue/cli-plugin-unit-jest": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-unit-jest/-/cli-plugin-unit-jest-5.0.6.tgz", + "integrity": "sha512-PZ2/q4bo7UWKI2CXNomGrutJTPD+LHZWlz4QQ5uTTLSvrvWxZaULuMItIrTIZPUfDTnl98LpyTLRzNAhZBr63A==", + "dev": true, + "requires": { + "@babel/core": "^7.12.16", + "@babel/plugin-transform-modules-commonjs": "^7.15.0", + "@types/jest": "^27.0.1", + "@vue/cli-shared-utils": "^5.0.6", + "babel-jest": "^27.1.0", + "deepmerge": "^4.2.2", + "jest": "^27.1.0", + "jest-serializer-vue": "^2.0.2", + "jest-transform-stub": "^2.0.0", + "jest-watch-typeahead": "^1.0.0" + }, + "dependencies": { + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true + } + } + }, + "@vue/cli-plugin-vuex": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-vuex/-/cli-plugin-vuex-5.0.6.tgz", + "integrity": "sha512-9bwkaLxGqqrD5FPN7iNsIe5x60P0nScioMQvHf2ZIIoFAiM5yuTgOQkdSKGBhn0YG4IjYd1tnlVY4Q/P4ZHaTA==", + "dev": true, + "requires": {} + }, + "@vue/cli-service": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@vue/cli-service/-/cli-service-5.0.6.tgz", + "integrity": "sha512-XSiTCjUMk8adjvQIJXBxk3ltEBLyBme8rpqdhJrpgCgSj+8pcPPyYKs1M0petkhwLMv3mEXVPNQmXKFzpdWVrw==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.12.16", + "@soda/friendly-errors-webpack-plugin": "^1.8.0", + "@soda/get-current-script": "^1.0.2", + "@types/minimist": "^1.2.0", + "@vue/cli-overlay": "^5.0.6", + "@vue/cli-plugin-router": "^5.0.6", + "@vue/cli-plugin-vuex": "^5.0.6", + "@vue/cli-shared-utils": "^5.0.6", + "@vue/component-compiler-utils": "^3.3.0", + "@vue/vue-loader-v15": "npm:vue-loader@^15.9.7", + "@vue/web-component-wrapper": "^1.3.0", + "acorn": "^8.0.5", + "acorn-walk": "^8.0.2", + "address": "^1.1.2", + "autoprefixer": "^10.2.4", + "browserslist": "^4.16.3", + "case-sensitive-paths-webpack-plugin": "^2.3.0", + "cli-highlight": "^2.1.10", + "clipboardy": "^2.3.0", + "cliui": "^7.0.4", + "copy-webpack-plugin": "^9.0.1", + "css-loader": "^6.5.0", + "css-minimizer-webpack-plugin": "^3.0.2", + "cssnano": "^5.0.0", + "debug": "^4.1.1", + "default-gateway": "^6.0.3", + "dotenv": "^10.0.0", + "dotenv-expand": "^5.1.0", + "fs-extra": "^9.1.0", + "globby": "^11.0.2", + "hash-sum": "^2.0.0", + "html-webpack-plugin": "^5.1.0", + "is-file-esm": "^1.0.0", + "launch-editor-middleware": "^2.2.1", + "lodash.defaultsdeep": "^4.6.1", + "lodash.mapvalues": "^4.6.0", + "mini-css-extract-plugin": "^2.5.3", + "minimist": "^1.2.5", + "module-alias": "^2.2.2", + "portfinder": "^1.0.26", + "postcss": "^8.2.6", + "postcss-loader": "^6.1.1", + "progress-webpack-plugin": "^1.0.12", + "ssri": "^8.0.1", + "terser-webpack-plugin": "^5.1.1", + "thread-loader": "^3.0.0", + "vue-loader": "^17.0.0", + "vue-style-loader": "^4.1.3", + "webpack": "^5.54.0", + "webpack-bundle-analyzer": "^4.4.0", + "webpack-chain": "^6.5.1", + "webpack-dev-server": "^4.7.3", + "webpack-merge": "^5.7.3", + "webpack-virtual-modules": "^0.4.2", + "whatwg-fetch": "^3.6.2" + } + }, + "@vue/cli-shared-utils": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@vue/cli-shared-utils/-/cli-shared-utils-5.0.6.tgz", + "integrity": "sha512-5HmlRtMByOCFO0P3mMUx8dVruTRhZ3pqQ0f1cCH9TmAoDjetmD/Ib7yx/5KxTHV8QY3xZJxYvgAmOU5C49K5xA==", + "dev": true, + "requires": { + "@achrinza/node-ipc": "^9.2.5", + "chalk": "^4.1.2", + "execa": "^1.0.0", + "joi": "^17.4.0", + "launch-editor": "^2.2.1", + "lru-cache": "^6.0.0", + "node-fetch": "^2.6.7", + "open": "^8.0.2", + "ora": "^5.3.0", + "read-pkg": "^5.1.1", + "semver": "^7.3.4", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@vue/compiler-core": { + "version": "3.2.37", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.37.tgz", + "integrity": "sha512-81KhEjo7YAOh0vQJoSmAD68wLfYqJvoiD4ulyedzF+OEk/bk6/hx3fTNVfuzugIIaTrOx4PGx6pAiBRe5e9Zmg==", + "requires": { + "@babel/parser": "^7.16.4", + "@vue/shared": "3.2.37", + "estree-walker": "^2.0.2", + "source-map": "^0.6.1" + } + }, + "@vue/compiler-dom": { + "version": "3.2.37", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.37.tgz", + "integrity": "sha512-yxJLH167fucHKxaqXpYk7x8z7mMEnXOw3G2q62FTkmsvNxu4FQSu5+3UMb+L7fjKa26DEzhrmCxAgFLLIzVfqQ==", + "requires": { + "@vue/compiler-core": "3.2.37", + "@vue/shared": "3.2.37" + } + }, + "@vue/compiler-sfc": { + "version": "3.2.37", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.37.tgz", + "integrity": "sha512-+7i/2+9LYlpqDv+KTtWhOZH+pa8/HnX/905MdVmAcI/mPQOBwkHHIzrsEsucyOIZQYMkXUiTkmZq5am/NyXKkg==", + "requires": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.37", + "@vue/compiler-dom": "3.2.37", + "@vue/compiler-ssr": "3.2.37", + "@vue/reactivity-transform": "3.2.37", + "@vue/shared": "3.2.37", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7", + "postcss": "^8.1.10", + "source-map": "^0.6.1" + } + }, + "@vue/compiler-ssr": { + "version": "3.2.37", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.37.tgz", + "integrity": "sha512-7mQJD7HdXxQjktmsWp/J67lThEIcxLemz1Vb5I6rYJHR5vI+lON3nPGOH3ubmbvYGt8xEUaAr1j7/tIFWiEOqw==", + "requires": { + "@vue/compiler-dom": "3.2.37", + "@vue/shared": "3.2.37" + } + }, + "@vue/component-compiler-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.3.0.tgz", + "integrity": "sha512-97sfH2mYNU+2PzGrmK2haqffDpVASuib9/w2/noxiFi31Z54hW+q3izKQXXQZSNhtiUpAI36uSuYepeBe4wpHQ==", + "dev": true, + "requires": { + "consolidate": "^0.15.1", + "hash-sum": "^1.0.2", + "lru-cache": "^4.1.2", + "merge-source-map": "^1.1.0", + "postcss": "^7.0.36", + "postcss-selector-parser": "^6.0.2", + "prettier": "^1.18.2 || ^2.0.0", + "source-map": "~0.6.1", + "vue-template-es2015-compiler": "^1.9.0" + }, + "dependencies": { + "hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "dev": true + } + } + }, + "@vue/devtools-api": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.1.4.tgz", + "integrity": "sha512-IiA0SvDrJEgXvVxjNkHPFfDx6SXw0b/TUkqMcDZWNg9fnCAHbTpoo59YfJ9QLFkwa3raau5vSlRVzMSLDnfdtQ==" + }, + "@vue/eslint-config-typescript": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-11.0.0.tgz", + "integrity": "sha512-txuRzxnQVmtUvvy9UyWUy9sHWXNeRPGmSPqP53hRtaiUeCTAondI9Ho9GQYI/8/eWljYOST7iA4Aa8sANBkWaA==", + "dev": true, + "requires": { + "@typescript-eslint/eslint-plugin": "^5.0.0", + "@typescript-eslint/parser": "^5.0.0", + "vue-eslint-parser": "^9.0.0" + } + }, + "@vue/reactivity": { + "version": "3.2.37", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.37.tgz", + "integrity": "sha512-/7WRafBOshOc6m3F7plwzPeCu/RCVv9uMpOwa/5PiY1Zz+WLVRWiy0MYKwmg19KBdGtFWsmZ4cD+LOdVPcs52A==", + "requires": { + "@vue/shared": "3.2.37" + } + }, + "@vue/reactivity-transform": { + "version": "3.2.37", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.37.tgz", + "integrity": "sha512-IWopkKEb+8qpu/1eMKVeXrK0NLw9HicGviJzhJDEyfxTR9e1WtpnnbYkJWurX6WwoFP0sz10xQg8yL8lgskAZg==", + "requires": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.37", + "@vue/shared": "3.2.37", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7" + } + }, + "@vue/runtime-core": { + "version": "3.2.37", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.37.tgz", + "integrity": "sha512-JPcd9kFyEdXLl/i0ClS7lwgcs0QpUAWj+SKX2ZC3ANKi1U4DOtiEr6cRqFXsPwY5u1L9fAjkinIdB8Rz3FoYNQ==", + "requires": { + "@vue/reactivity": "3.2.37", + "@vue/shared": "3.2.37" + } + }, + "@vue/runtime-dom": { + "version": "3.2.37", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.37.tgz", + "integrity": "sha512-HimKdh9BepShW6YozwRKAYjYQWg9mQn63RGEiSswMbW+ssIht1MILYlVGkAGGQbkhSh31PCdoUcfiu4apXJoPw==", + "requires": { + "@vue/runtime-core": "3.2.37", + "@vue/shared": "3.2.37", + "csstype": "^2.6.8" + } + }, + "@vue/server-renderer": { + "version": "3.2.37", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.37.tgz", + "integrity": "sha512-kLITEJvaYgZQ2h47hIzPh2K3jG8c1zCVbp/o/bzQOyvzaKiCquKS7AaioPI28GNxIsE/zSx+EwWYsNxDCX95MA==", + "requires": { + "@vue/compiler-ssr": "3.2.37", + "@vue/shared": "3.2.37" + } + }, + "@vue/shared": { + "version": "3.2.37", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.37.tgz", + "integrity": "sha512-4rSJemR2NQIo9Klm1vabqWjD8rs/ZaJSzMxkMNeJS6lHiUjjUeYFbooN19NgFjztubEKh3WlZUeOLVdbbUWHsw==" + }, + "@vue/test-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-2.0.0.tgz", + "integrity": "sha512-zL5kygNq7hONrO1CzaUGprEAklAX+pH8J1MPMCU3Rd2xtSYkZ+PmKU3oEDRg8VAGdL5lNJHzDgrud5amFPtirw==", + "dev": true, + "requires": {} + }, + "@vue/vue-loader-v15": { + "version": "npm:vue-loader@15.9.8", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.9.8.tgz", + "integrity": "sha512-GwSkxPrihfLR69/dSV3+5CdMQ0D+jXg8Ma1S4nQXKJAznYFX14vHdc/NetQc34Dw+rBbIJyP7JOuVb9Fhprvog==", + "dev": true, + "requires": { + "@vue/component-compiler-utils": "^3.1.0", + "hash-sum": "^1.0.2", + "loader-utils": "^1.1.0", + "vue-hot-reload-api": "^2.3.0", + "vue-style-loader": "^4.1.0" + }, + "dependencies": { + "hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==", + "dev": true + } + } + }, + "@vue/vue3-jest": { + "version": "27.0.0", + "resolved": "https://registry.npmjs.org/@vue/vue3-jest/-/vue3-jest-27.0.0.tgz", + "integrity": "sha512-VL61CgZBoQqayXfzlZJHHpZuX4lsT8dmdZMJzADhdAJjKu26JBpypHr/2ppevxItljPiuALQW4MKhhCXZRXnLg==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "@babel/plugin-transform-modules-commonjs": "^7.2.0", + "chalk": "^2.1.0", + "convert-source-map": "^1.6.0", + "css-tree": "^2.0.1", + "source-map": "0.5.6", + "tsconfig": "^7.0.0" + }, + "dependencies": { + "css-tree": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.1.0.tgz", + "integrity": "sha512-PcysZRzToBbrpoUrZ9qfblRIRf8zbEAkU0AIpQFtgkFK0vSbzOmBCvdSAx2Zg7Xx5wiYJKUKk0NMP7kxevie/A==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "mdn-data": "2.0.27", + "source-map-js": "^1.0.1" + } + }, + "mdn-data": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.27.tgz", + "integrity": "sha512-kwqO0I0jtWr25KcfLm9pia8vLZ8qoAKhWZuZMbneJq3jjBD3gl5nZs8l8Tu3ZBlBAHVQtDur9rdDGyvtfVraHQ==", + "dev": true, + "optional": true, + "peer": true + }, + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==", + "dev": true, + "optional": true, + "peer": true + } + } + }, + "@vue/web-component-wrapper": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@vue/web-component-wrapper/-/web-component-wrapper-1.3.0.tgz", + "integrity": "sha512-Iu8Tbg3f+emIIMmI2ycSI8QcEuAUgPTgHwesDU1eKMLE4YC/c/sFbGc70QgMq31ijRftV0R7vCm9co6rldCeOA==", + "dev": true + }, + "@webassemblyjs/ast": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "dev": true, + "requires": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "dev": true + }, + "@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "abortcontroller-polyfill": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.3.tgz", + "integrity": "sha512-zetDJxd89y3X99Kvo4qFx8GKlt6GsvN3UcRZHwU6iFA/0KiOmhkTVhe8oRoTBiTVPZu09x3vCra47+w8Yz1+2Q==" + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "acorn": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "dev": true + }, + "acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true + } + } + }, + "acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "dev": true, + "requires": {} + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, + "acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dev": true, + "requires": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true + } + } + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true + }, + "address": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.0.tgz", + "integrity": "sha512-tNEZYz5G/zYunxFm7sfhAxkXEuLj3K6BKwv6ZURlsF6yiUQ65z0Q2wZW9L5cPUl9ocofGvXOdFYbFHp0+6MOig==", + "dev": true + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "requires": { + "ajv": "^8.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + } + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true + }, + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, + "ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "apexcharts": { + "version": "3.35.3", + "resolved": "https://registry.npmjs.org/apexcharts/-/apexcharts-3.35.3.tgz", + "integrity": "sha512-UDlxslJr3DG63I/SgoiivIu4lpP25GMaKFK8NvCHmTksTQshx4ng3oPPrYvdsBFOvD/ajPYIh/p7rNB0jq8vXg==", + "requires": { + "svg.draggable.js": "^2.2.2", + "svg.easing.js": "^2.0.0", + "svg.filter.js": "^2.0.2", + "svg.pathmorphing.js": "^0.1.3", + "svg.resize.js": "^1.4.3", + "svg.select.js": "^3.0.1" + } + }, + "arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "dev": true + }, + "arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, + "async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true + }, + "autoprefixer": { + "version": "10.4.7", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.7.tgz", + "integrity": "sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA==", + "dev": true, + "requires": { + "browserslist": "^4.20.3", + "caniuse-lite": "^1.0.30001335", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + } + }, + "babel-eslint": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", + "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0", + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "babel-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", + "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", + "dev": true, + "requires": { + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "babel-loader": { + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz", + "integrity": "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==", + "dev": true, + "requires": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^2.0.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "dependencies": { + "loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + } + }, + "babel-plugin-jest-hoist": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", + "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", + "dev": true, + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", + "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.3.1", + "semver": "^6.1.1" + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", + "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.1", + "core-js-compat": "^3.21.0" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", + "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.1" + } + }, + "babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "requires": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + } + }, + "babel-preset-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", + "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^27.5.1", + "babel-preset-current-node-syntax": "^1.0.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + } + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "body-parser": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", + "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.10.3", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "bonjour-service": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.13.tgz", + "integrity": "sha512-LWKRU/7EqDUC9CTAQtuZl5HzBALoCYwtLhffW3et7vZMwv3bWLpJf8bRYlMD5OCcDpTfnPgNCV4yo9ZIaJGMiA==", + "dev": true, + "requires": { + "array-flatten": "^2.1.2", + "dns-equal": "^1.0.0", + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "browser-tabs-lock": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/browser-tabs-lock/-/browser-tabs-lock-1.2.15.tgz", + "integrity": "sha512-J8K9vdivK0Di+b8SBdE7EZxDr88TnATing7XoLw6+nFkXMQ6sVBh92K3NQvZlZU91AIkFRi0w3sztk5Z+vsswA==", + "requires": { + "lodash": ">=4.17.21" + } + }, + "browserslist": { + "version": "4.21.10", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.11" + } + }, + "bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "requires": { + "fast-json-stable-stringify": "2.x" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + }, + "camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true + }, + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001519", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001519.tgz", + "integrity": "sha512-0QHgqR+Jv4bxHMp8kZ1Kn8CH55OikjKJ6JmKkZYP1F3D7w+lnFXF70nG5eNfsZS89jadi5Ywy5UCSKLAglIRkg==", + "dev": true + }, + "case-sensitive-paths-webpack-plugin": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", + "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true + }, + "character-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", + "integrity": "sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==", + "dev": true, + "requires": { + "is-regex": "^1.0.3" + } + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true + }, + "ci-info": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.2.tgz", + "integrity": "sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg==", + "dev": true + }, + "cjs-module-lexer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "dev": true + }, + "clean-css": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.0.tgz", + "integrity": "sha512-YYuuxv4H/iNb1Z/5IbMRoxgrzjWGhOEFfd+groZ5dMCVkpENiMZmwspdrzBo9286JjM1gZJPAyL7ZIdzuvu2AQ==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + } + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-highlight": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", + "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "highlight.js": "^10.7.1", + "mz": "^2.4.0", + "parse5": "^5.1.1", + "parse5-htmlparser2-tree-adapter": "^6.0.0", + "yargs": "^16.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "cli-spinners": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", + "dev": true + }, + "click-outside-vue3": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/click-outside-vue3/-/click-outside-vue3-4.0.1.tgz", + "integrity": "sha512-sbplNecrup5oGqA3o4bo8XmvHRT6q9fvw21Z67aDbTqB9M6LF7CuYLTlLvNtOgKU6W3zst5H5zJuEh4auqA34g==" + }, + "clipboard": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.11.tgz", + "integrity": "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==", + "requires": { + "good-listener": "^1.2.2", + "select": "^1.1.2", + "tiny-emitter": "^2.0.0" + } + }, + "clipboardy": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-2.3.0.tgz", + "integrity": "sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ==", + "dev": true, + "requires": { + "arch": "^2.1.1", + "execa": "^1.0.0", + "is-wsl": "^2.1.1" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true + }, + "collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "colord": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.2.tgz", + "integrity": "sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ==", + "dev": true + }, + "colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "condense-newlines": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/condense-newlines/-/condense-newlines-0.2.1.tgz", + "integrity": "sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-whitespace": "^0.3.0", + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dev": true, + "requires": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true + }, + "consolidate": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz", + "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==", + "dev": true, + "requires": { + "bluebird": "^3.1.1" + } + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "requires": { + "safe-buffer": "5.2.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "copy-webpack-plugin": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-9.1.0.tgz", + "integrity": "sha512-rxnR7PaGigJzhqETHGmAcxKnLZSR5u1Y3/bcIv/1FnqXedcL/E2ewK7ZCNrArJKCiSv8yVXhTqetJh8inDvfsA==", + "dev": true, + "requires": { + "fast-glob": "^3.2.7", + "glob-parent": "^6.0.1", + "globby": "^11.0.3", + "normalize-path": "^3.0.0", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0" + } + }, + "core-js": { + "version": "3.25.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.25.1.tgz", + "integrity": "sha512-sr0FY4lnO1hkQ4gLDr24K0DGnweGO1QwSj5BpfQjpSJPdqWalja4cTps29Y/PJVG/P7FYlPDkH3hO+Tr0CvDgQ==" + }, + "core-js-compat": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.32.0.tgz", + "integrity": "sha512-7a9a3D1k4UCVKnLhrgALyFcP7YCsLOQIxPd0dKjf/6GuPcgyiGP70ewWdCGrSK7evyhymi0qO4EqCmSJofDeYw==", + "dev": true, + "requires": { + "browserslist": "^4.21.9" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true + } + } + }, + "css-declaration-sorter": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.0.tgz", + "integrity": "sha512-OGT677UGHJTAVMRhPO+HJ4oKln3wkBTwtDFH0ojbqm+MJm6xuDMHp2nkhh/ThaBqq20IbraBQSWKfSLNHQO9Og==", + "dev": true, + "requires": {} + }, + "css-loader": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz", + "integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==", + "dev": true, + "requires": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.7", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.3.5" + }, + "dependencies": { + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "css-minimizer-webpack-plugin": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz", + "integrity": "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==", + "dev": true, + "requires": { + "cssnano": "^5.0.6", + "jest-worker": "^27.0.2", + "postcss": "^8.3.5", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + } + } + }, + "css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "requires": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + } + }, + "css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "cssnano": { + "version": "5.1.12", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.12.tgz", + "integrity": "sha512-TgvArbEZu0lk/dvg2ja+B7kYoD7BBCmn3+k58xD0qjrGHsFzXY/wKTo9M5egcUCabPol05e/PVoIu79s2JN4WQ==", + "dev": true, + "requires": { + "cssnano-preset-default": "^5.2.12", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + } + }, + "cssnano-preset-default": { + "version": "5.2.12", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.12.tgz", + "integrity": "sha512-OyCBTZi+PXgylz9HAA5kHyoYhfGcYdwFmyaJzWnzxuGRtnMw/kR6ilW9XzlzlRAtB6PLT/r+prYgkef7hngFew==", + "dev": true, + "requires": { + "css-declaration-sorter": "^6.3.0", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.0", + "postcss-convert-values": "^5.1.2", + "postcss-discard-comments": "^5.1.2", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.6", + "postcss-merge-rules": "^5.1.2", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.3", + "postcss-minify-selectors": "^5.2.1", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.0", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.3", + "postcss-reduce-initial": "^5.1.0", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" + } + }, + "cssnano-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", + "dev": true, + "requires": {} + }, + "csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "requires": { + "css-tree": "^1.1.2" + } + }, + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + } + } + }, + "csstype": { + "version": "2.6.20", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.20.tgz", + "integrity": "sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==" + }, + "data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "requires": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "dependencies": { + "tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dev": true, + "requires": { + "punycode": "^2.1.1" + } + }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true + }, + "whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dev": true, + "requires": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + } + } + } + }, + "debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==" + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "decimal.js": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", + "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", + "dev": true + }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "deepmerge": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz", + "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==", + "dev": true + }, + "default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "requires": { + "execa": "^5.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==", + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true + }, + "define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==", + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true + }, + "delegate": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", + "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==" + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true + }, + "detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true + }, + "detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "detective": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", + "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", + "dev": true, + "requires": { + "acorn-node": "^1.8.2", + "defined": "^1.0.0", + "minimist": "^1.2.6" + } + }, + "didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "diff-sequences": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", + "dev": true + }, + "dns-packet": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", + "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", + "dev": true, + "requires": { + "@leichtgewicht/ip-codec": "^2.0.1" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "requires": { + "utila": "~0.4" + } + }, + "dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true + }, + "domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, + "requires": { + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true + } + } + }, + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "dev": true + }, + "dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", + "dev": true + }, + "duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "easy-stack": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/easy-stack/-/easy-stack-1.0.1.tgz", + "integrity": "sha512-wK2sCs4feiiJeFXn3zvY0p41mdU5VUgbgs1rNsc/y5ngFUijdWd+iIN8eoyuZHKB8xN6BL4PdWmzqFmxNg6V2w==", + "dev": true + }, + "editorconfig": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", + "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==", + "dev": true, + "requires": { + "commander": "^2.19.0", + "lru-cache": "^4.1.5", + "semver": "^5.6.0", + "sigmund": "^1.0.1" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "dev": true + } + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.4.482", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.482.tgz", + "integrity": "sha512-h+UqpfmEr1Qkk0zp7ej/jid7CXoq4m4QzW6wNTb0ELJ/BZCpA4wgUylBIMGCe621tnr4l5VmoHjdoSx2lbnNJA==", + "dev": true + }, + "emittery": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", + "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.0.tgz", + "integrity": "sha512-+DCows0XNwLDcUhbFJPdlQEVnT2zXlCv7hPxemTz86/O+B/hCQ+mb7ydkPKiflpVraqLPCAfu7lDy+hBXueojw==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "dev": true, + "requires": { + "stackframe": "^1.3.4" + } + }, + "es-cookie": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/es-cookie/-/es-cookie-1.3.2.tgz", + "integrity": "sha512-UTlYYhXGLOy05P/vKVT2Ui7WtC7NiRzGtJyAKKn32g5Gvcjn7KAClLPWlipCtxIus934dFg9o9jXiBL0nP+t9Q==" + }, + "es-module-lexer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", + "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==", + "dev": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + } + } + }, + "eslint": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.18.0.tgz", + "integrity": "sha512-As1EfFMVk7Xc6/CvhssHUjsAQSkpfXvUGMFC3ce8JDe6WvqCgRrLOBQbVpsBFr1X1V+RACOadnzVvcUS5ni2bA==", + "dev": true, + "requires": { + "@eslint/eslintrc": "^1.3.0", + "@humanwhocodes/config-array": "^0.9.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.2", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.15.0", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "globals": { + "version": "13.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz", + "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "eslint-plugin-vue": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.1.1.tgz", + "integrity": "sha512-W9n5PB1X2jzC7CK6riG0oAcxjmKrjTF6+keL1rni8n57DZeilx/Fulz+IRJK3lYseLNAygN0I62L7DvioW40Tw==", + "dev": true, + "requires": { + "eslint-utils": "^3.0.0", + "natural-compare": "^1.4.0", + "nth-check": "^2.0.1", + "postcss-selector-parser": "^6.0.9", + "semver": "^7.3.5", + "vue-eslint-parser": "^9.0.1", + "xml-name-validator": "^4.0.0" + }, + "dependencies": { + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true + }, + "eslint-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz", + "integrity": "sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==", + "dev": true, + "requires": { + "@types/eslint": "^7.29.0 || ^8.4.1", + "jest-worker": "^28.0.2", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-worker": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.1.tgz", + "integrity": "sha512-Au7slXB08C6h+xbJPp7VIb6U0XX5Kc9uel/WFc6/rcTzGiaVCBRngBExSYuXSLFPULPSYU3cJ3ybS988lNFQhQ==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "espree": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz", + "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==", + "dev": true, + "requires": { + "acorn": "^8.7.1", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true + }, + "event-pubsub": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/event-pubsub/-/event-pubsub-4.3.0.tgz", + "integrity": "sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ==", + "dev": true + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true + }, + "expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "express": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", + "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", + "dev": true, + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.0", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.10.3", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "fast-text-encoding": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz", + "integrity": "sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==" + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "dev": true, + "requires": { + "bser": "2.1.1" + } + }, + "fetch-intercept": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/fetch-intercept/-/fetch-intercept-2.4.0.tgz", + "integrity": "sha512-BPZ2LM9Dh1ua2ovQf03N6rhWg1qxdVD5qK/G4llvcemt6M+jjxCuIDxJ+6IiG+uz//3UQmgfKEv0gOGvYIxZ7g==" + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz", + "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==", + "dev": true + }, + "follow-redirects": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", + "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", + "dev": true + }, + "fork-ts-checker-webpack-plugin": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz", + "integrity": "sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@types/json-schema": "^7.0.5", + "chalk": "^4.1.0", + "chokidar": "^3.4.2", + "cosmiconfig": "^6.0.0", + "deepmerge": "^4.2.2", + "fs-extra": "^9.0.0", + "glob": "^7.1.6", + "memfs": "^3.1.2", + "minimatch": "^3.0.4", + "schema-utils": "2.7.0", + "semver": "^7.3.2", + "tapable": "^1.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + } + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "schema-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + } + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + } + } + }, + "form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true + }, + "fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "dev": true + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", + "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "good-listener": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", + "integrity": "sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==", + "requires": { + "delegate": "^3.1.2" + } + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "dev": true, + "requires": { + "duplexer": "^0.1.2" + } + }, + "handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "hash-sum": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz", + "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==", + "dev": true + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "dev": true + }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.5" + } + }, + "html-entities": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", + "dev": true + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "dev": true, + "requires": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + } + }, + "html-tags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz", + "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==", + "dev": true + }, + "html-webpack-plugin": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", + "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", + "dev": true, + "requires": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + } + }, + "htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dev": true, + "requires": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + } + }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "requires": {} + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "ipaddr.js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, + "requires": { + "ci-info": "^1.5.0" + }, + "dependencies": { + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "dev": true + } + } + }, + "is-core-module": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true + }, + "is-expression": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-4.0.0.tgz", + "integrity": "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "object-assign": "^4.1.1" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-file-esm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-file-esm/-/is-file-esm-1.0.0.tgz", + "integrity": "sha512-rZlaNKb4Mr8WlRu2A9XdeoKgnO5aA53XdPHgCKVyCrQ/rWi89RET1+bq37Ru46obaQXeiX4vmFIm1vks41hoSA==", + "dev": true, + "requires": { + "read-pkg-up": "^7.0.1" + } + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, + "is-whitespace": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-whitespace/-/is-whitespace-0.3.0.tgz", + "integrity": "sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg==", + "dev": true + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz", + "integrity": "sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==", + "dev": true, + "requires": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + } + }, + "istanbul-reports": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", + "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "javascript-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.1.0.tgz", + "integrity": "sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==", + "dev": true + }, + "jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", + "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", + "dev": true, + "requires": { + "@jest/core": "^27.5.1", + "import-local": "^3.0.2", + "jest-cli": "^27.5.1" + } + }, + "jest-changed-files": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", + "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "execa": "^5.0.0", + "throat": "^6.0.1" + }, + "dependencies": { + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "jest-circus": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", + "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", + "dev": true, + "requires": { + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3", + "throat": "^6.0.1" + }, + "dependencies": { + "@jest/console": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", + "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0" + } + }, + "@jest/test-result": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", + "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", + "dev": true, + "requires": { + "@jest/console": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-cli": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", + "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", + "dev": true, + "requires": { + "@jest/core": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "prompts": "^2.0.1", + "yargs": "^16.2.0" + }, + "dependencies": { + "@jest/console": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", + "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0" + } + }, + "@jest/test-result": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", + "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", + "dev": true, + "requires": { + "@jest/console": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-config": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", + "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", + "dev": true, + "requires": { + "@babel/core": "^7.8.0", + "@jest/test-sequencer": "^27.5.1", + "@jest/types": "^27.5.1", + "babel-jest": "^27.5.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.9", + "jest-circus": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-jasmine2": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-diff": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-docblock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", + "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", + "dev": true, + "requires": { + "detect-newline": "^3.0.0" + } + }, + "jest-each": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", + "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-environment-jsdom": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", + "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", + "dev": true, + "requires": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1", + "jsdom": "^16.6.0" + } + }, + "jest-environment-node": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", + "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", + "dev": true, + "requires": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + } + }, + "jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "dev": true + }, + "jest-haste-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", + "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.3.2", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^27.5.1", + "jest-serializer": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + } + }, + "jest-jasmine2": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", + "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", + "dev": true, + "requires": { + "@jest/environment": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "throat": "^6.0.1" + }, + "dependencies": { + "@jest/console": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", + "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0" + } + }, + "@jest/test-result": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", + "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", + "dev": true, + "requires": { + "@jest/console": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-leak-detector": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", + "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", + "dev": true, + "requires": { + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + } + }, + "jest-matcher-utils": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-message-util": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.1.tgz", + "integrity": "sha512-xoDOOT66fLfmTRiqkoLIU7v42mal/SqwDKvfmfiWAdJMSJiU+ozgluO7KbvoAgiwIrrGZsV7viETjc8GNrA/IQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^28.1.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^28.1.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "dependencies": { + "@jest/types": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.1.tgz", + "integrity": "sha512-vRXVqSg1VhDnB8bWcmvLzmg0Bt9CRKVgHPXqYwvWMX3TvAjeO+nRuK6+VdTKCtWOvYlmkF/HqNAL/z+N3B53Kw==", + "dev": true, + "requires": { + "@jest/schemas": "^28.0.2", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "17.0.10", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.10.tgz", + "integrity": "sha512-gmEaFwpj/7f/ROdtIlci1R1VYU1J4j95m8T+Tj3iBgiBFKg1foE/PSl93bBd5T9LDXNPo8UlNN6W0qwD8O5OaA==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "pretty-format": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.1.tgz", + "integrity": "sha512-wwJbVTGFHeucr5Jw2bQ9P+VYHyLdAqedFLEkdQUVaBF/eiidDwH5OpilINq4mEfhbCjLnirt6HTTDhv1HaTIQw==", + "dev": true, + "requires": { + "@jest/schemas": "^28.0.2", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-mock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", + "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*" + } + }, + "jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "dev": true, + "requires": {} + }, + "jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "dev": true + }, + "jest-resolve": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", + "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-resolve-dependencies": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", + "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-snapshot": "^27.5.1" + } + }, + "jest-runner": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", + "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", + "dev": true, + "requires": { + "@jest/console": "^27.5.1", + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-leak-detector": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "source-map-support": "^0.5.6", + "throat": "^6.0.1" + }, + "dependencies": { + "@jest/console": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", + "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0" + } + }, + "@jest/test-result": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", + "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", + "dev": true, + "requires": { + "@jest/console": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "emittery": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", + "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-runtime": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", + "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", + "dev": true, + "requires": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/globals": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "execa": "^5.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "dependencies": { + "@jest/console": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", + "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0" + } + }, + "@jest/test-result": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", + "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", + "dev": true, + "requires": { + "@jest/console": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + } + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "jest-serializer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", + "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", + "dev": true, + "requires": { + "@types/node": "*", + "graceful-fs": "^4.2.9" + } + }, + "jest-serializer-vue": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/jest-serializer-vue/-/jest-serializer-vue-2.0.2.tgz", + "integrity": "sha512-nK/YIFo6qe3i9Ge+hr3h4PpRehuPPGZFt8LDBdTHYldMb7ZWlkanZS8Ls7D8h6qmQP2lBQVDLP0DKn5bJ9QApQ==", + "dev": true, + "requires": { + "pretty": "2.0.0" + } + }, + "jest-snapshot": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", + "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", + "dev": true, + "requires": { + "@babel/core": "^7.7.2", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.0.0", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^27.5.1", + "semver": "^7.3.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + } + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-transform-stub": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jest-transform-stub/-/jest-transform-stub-2.0.0.tgz", + "integrity": "sha512-lspHaCRx/mBbnm3h4uMMS3R5aZzMwyNpNIJLXj4cEsV0mIUtS4IjYJLSoyjRCtnxb6RIGJ4NL2quZzfIeNhbkg==", + "dev": true + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-validate": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", + "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "leven": "^3.1.0", + "pretty-format": "^27.5.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-watch-typeahead": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz", + "integrity": "sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==", + "dev": true, + "requires": { + "ansi-escapes": "^4.3.1", + "chalk": "^4.0.0", + "jest-regex-util": "^28.0.0", + "jest-watcher": "^28.0.0", + "slash": "^4.0.0", + "string-length": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "dependencies": { + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-regex-util": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", + "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", + "dev": true + }, + "slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true + }, + "string-length": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz", + "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==", + "dev": true, + "requires": { + "char-regex": "^2.0.0", + "strip-ansi": "^7.0.1" + }, + "dependencies": { + "char-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.1.tgz", + "integrity": "sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==", + "dev": true + } + } + }, + "strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + } + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + } + } + }, + "jest-watcher": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.1.tgz", + "integrity": "sha512-RQIpeZ8EIJMxbQrXpJQYIIlubBnB9imEHsxxE41f54ZwcqWLysL/A0ZcdMirf+XsMn3xfphVQVV4EW0/p7i7Ug==", + "dev": true, + "requires": { + "@jest/test-result": "^28.1.1", + "@jest/types": "^28.1.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.10.2", + "jest-util": "^28.1.1", + "string-length": "^4.0.1" + }, + "dependencies": { + "@jest/types": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.1.tgz", + "integrity": "sha512-vRXVqSg1VhDnB8bWcmvLzmg0Bt9CRKVgHPXqYwvWMX3TvAjeO+nRuK6+VdTKCtWOvYlmkF/HqNAL/z+N3B53Kw==", + "dev": true, + "requires": { + "@jest/schemas": "^28.0.2", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "17.0.10", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.10.tgz", + "integrity": "sha512-gmEaFwpj/7f/ROdtIlci1R1VYU1J4j95m8T+Tj3iBgiBFKg1foE/PSl93bBd5T9LDXNPo8UlNN6W0qwD8O5OaA==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-util": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.1.tgz", + "integrity": "sha512-FktOu7ca1DZSyhPAxgxB6hfh2+9zMoJ7aEQA759Z6p45NuO8mWcqujH+UdHlCm/V6JTWwDztM2ITCzU1ijJAfw==", + "dev": true, + "requires": { + "@jest/types": "^28.1.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + } + } + }, + "jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "joi": { + "version": "17.6.0", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.6.0.tgz", + "integrity": "sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw==", + "dev": true, + "requires": { + "@hapi/hoek": "^9.0.0", + "@hapi/topo": "^5.0.0", + "@sideway/address": "^4.1.3", + "@sideway/formula": "^3.0.0", + "@sideway/pinpoint": "^2.0.0" + } + }, + "js-beautify": { + "version": "1.14.4", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.14.4.tgz", + "integrity": "sha512-+b4A9c3glceZEmxyIbxDOYB0ZJdReLvyU1077RqKsO4dZx9FUHjTOJn8VHwpg33QoucIykOiYbh7MfqBOghnrA==", + "dev": true, + "requires": { + "config-chain": "^1.1.13", + "editorconfig": "^0.15.3", + "glob": "^7.1.3", + "nopt": "^5.0.0" + } + }, + "js-message": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/js-message/-/js-message-1.0.7.tgz", + "integrity": "sha512-efJLHhLjIyKRewNS9EGZ4UpI8NguuL6fKkhRxVuMmrGV2xN/0APGdQYwLFky5w9naebSZ0OwAGp0G6/2Cg90rA==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "requires": { + "argparse": "^2.0.1" + } + }, + "jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "dev": true, + "requires": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dev": true, + "requires": { + "punycode": "^2.1.1" + } + }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true + }, + "whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dev": true, + "requires": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + } + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + } + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true + }, + "jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==" + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true + }, + "klona": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", + "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", + "dev": true + }, + "kubernetes-types": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/kubernetes-types/-/kubernetes-types-1.26.0.tgz", + "integrity": "sha512-jv0XaTIGW/p18jaiKRD85hLTYWx0yEj+cb6PDX3GdNa3dWoRxnD4Gv7+bE6C/ehcsp2skcdy34vT25jbPofDIQ==", + "dev": true + }, + "launch-editor": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.4.0.tgz", + "integrity": "sha512-mZ0BHeSn/ohL+Ib+b+JnxC59vcNz6v5IR9d0CuM8f0x8ni8oK3IIG6G0vMkpxc0gFsmvINkztGOHiWTaX4BmAg==", + "dev": true, + "requires": { + "picocolors": "^1.0.0", + "shell-quote": "^1.6.1" + } + }, + "launch-editor-middleware": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/launch-editor-middleware/-/launch-editor-middleware-2.4.0.tgz", + "integrity": "sha512-/M7AX/6xktZY60KE7j71XLrj9U6H5TBoP+mJzhYB3fcdAq8rcazit/K0qWiu1jvytUPXP4lJRd1VJFwvdMQ/uw==", + "dev": true, + "requires": { + "launch-editor": "^2.4.0" + } + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "lilconfig": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz", + "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==", + "dev": true + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true + }, + "loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + } + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "lodash.defaultsdeep": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz", + "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==", + "dev": true + }, + "lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", + "dev": true + }, + "lodash.mapvalues": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", + "integrity": "sha512-JPFqXFeZQ7BfS00H58kClY7SPVeHertPE0lNuCyZ26/XlN8TvakYD7b9bGyNmXbT/D3BbtPAAmq90gPWqLkxlQ==", + "dev": true + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "dev": true + }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "log-update": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-2.3.0.tgz", + "integrity": "sha512-vlP11XfFGyeNQlmEn9tJ66rEW1coA/79m5z6BCkudjbAGE83uhAcGYrBFwfs3AdLiLzGRusRPAbSPK9xZteCmg==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "cli-cursor": "^2.0.0", + "wrap-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "dev": true + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "wrap-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz", + "integrity": "sha512-iXR3tDXpbnTpzjKSylUJRkLuOrEC7hwEB221cgn6wtF8wpmz28puFXAEfPT5zrjM3wahygB//VuWEr1vTkDcNQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0" + } + } + } + }, + "long": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.0.tgz", + "integrity": "sha512-9RTUNjK60eJbx3uz+TEGF7fUr29ZDxR5QzXcyDpeSfeH28S9ycINflOgOlppit5U+4kNTe83KQnMEerw7GmE8w==" + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "requires": { + "tslib": "^2.0.3" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "luxon": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-2.5.2.tgz", + "integrity": "sha512-Yg7/RDp4nedqmLgyH0LwgGRvMEKVzKbUdkBYyCosbHgJ+kaOUx0qzSiSatVc3DFygnirTPYnMM2P5dg2uH1WvA==" + }, + "magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "requires": { + "sourcemap-codec": "^1.4.8" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "requires": { + "tmpl": "1.0.5" + } + }, + "mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true + }, + "memfs": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.7.tgz", + "integrity": "sha512-ygaiUSNalBX85388uskeCyhSAoOSgzBbtVCr9jA2RROssFL9Q19/ZXFqS+2Th2sr1ewNIWgFdLzLC3Yl1Zv+lw==", + "dev": true, + "requires": { + "fs-monkey": "^1.0.3" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true + }, + "merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "mini-css-extract-plugin": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz", + "integrity": "sha512-wd+SD57/K6DiV7jIR34P+s3uckTRuQvx0tKPcvjFlrEylk6P4mQ2KSWk1hblj1Kxaqok7LogKOieygXqBczNlg==", + "dev": true, + "requires": { + "schema-utils": "^4.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + } + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, + "minipass": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz", + "integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "mitt": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-2.1.0.tgz", + "integrity": "sha512-ILj2TpLiysu2wkBbWjAmww7TkZb65aiQO+DkVdUTBpBXq+MHYiETENkKFMtsJZX1Lf4pe4QOrTSjIfUwN5lRdg==" + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "requires": { + "minimist": "^1.2.6" + } + }, + "module-alias": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/module-alias/-/module-alias-2.2.2.tgz", + "integrity": "sha512-A/78XjoX2EmNvppVWEhM2oGk3x4lLxnkEA4jTbaK97QKSDjkIoOsKQlfylt/d3kKKi596Qy3NP5XrXJ6fZIC9Q==", + "dev": true + }, + "monaco-editor": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.33.0.tgz", + "integrity": "sha512-VcRWPSLIUEgQJQIE0pVT8FcGBIgFoxz7jtqctE+IiCxWugD0DwgyQBcZBhdSrdMC84eumoqMZsGl2GTreOzwqw==" + }, + "monaco-editor-vue3": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/monaco-editor-vue3/-/monaco-editor-vue3-0.1.10.tgz", + "integrity": "sha512-C1jhyx+KHQyW1AbjuA8DhIZSqkVquV7MnuWXG9jESd0e+CkzEFzuk1RvNqlN2eJ2fRkvF32yEPHYfvz9quOhHQ==", + "requires": { + "monaco-editor": "^0.33.0", + "vite-plugin-monaco-editor": "^1.1.0", + "vue": "^3.2.37" + } + }, + "monaco-marker-data-provider": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/monaco-marker-data-provider/-/monaco-marker-data-provider-1.1.1.tgz", + "integrity": "sha512-PGB7TJSZE5tmHzkxv/OEwK2RGNC2A7dcq4JRJnnj31CUAsfmw0Gl+1QTrH0W0deKhcQmQM0YVPaqgQ+0wCt8Mg==", + "requires": {} + }, + "monaco-worker-manager": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/monaco-worker-manager/-/monaco-worker-manager-2.0.1.tgz", + "integrity": "sha512-kdPL0yvg5qjhKPNVjJoym331PY/5JC11aPJXtCZNwWRvBr6jhkIamvYAyiY5P1AWFmNOy0aRDRoMdZfa71h8kg==", + "requires": {} + }, + "monaco-yaml": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/monaco-yaml/-/monaco-yaml-4.0.4.tgz", + "integrity": "sha512-qbM36fY1twpDUs4lhhxoXDQGUPVyYAFCPJi3E0JKgLioD8wzsD/pawgauFFXSzpMa09z8wbt/DTLXjXEehnVFA==", + "requires": { + "@types/json-schema": "^7.0.0", + "jsonc-parser": "^3.0.0", + "monaco-marker-data-provider": "^1.0.0", + "monaco-worker-manager": "^2.0.0", + "path-browserify": "^1.0.0", + "prettier": "^2.0.0", + "vscode-languageserver-textdocument": "^1.0.0", + "vscode-languageserver-types": "^3.0.0", + "vscode-uri": "^3.0.0", + "yaml": "^2.0.0" + }, + "dependencies": { + "yaml": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.2.tgz", + "integrity": "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==" + } + } + }, + "mrmime": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", + "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, + "requires": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + } + }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dev": true, + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true + }, + "normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "requires": { + "boolbase": "^1.0.0" + } + }, + "nwsapi": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.1.tgz", + "integrity": "sha512-JYOWTeFoS0Z93587vRJgASD5Ut11fYl5NyihP3KrYBvMe1FRRs6RN7m20SA/16GM4P6hTnZjT+UmDOt38UeXNg==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true + }, + "object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "open": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "dev": true, + "requires": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + } + }, + "opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true + }, + "openpgp": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/openpgp/-/openpgp-5.5.0.tgz", + "integrity": "sha512-SpwcJnxrK9Y0HRM6KxSFqkAEOSWEabCH/c8dII/+y2e5f6KvuDG5ZE7JXaPBaVJNE4VUZZeTphxXDoZD0KOHrw==", + "dev": true, + "requires": { + "asn1.js": "^5.0.0" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "requires": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dev": true, + "requires": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "requires": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "dev": true + }, + "parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dev": true, + "requires": { + "parse5": "^6.0.1" + }, + "dependencies": { + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + } + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true + }, + "pirates": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==" + }, + "portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "dev": true, + "requires": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "postcss": { + "version": "8.4.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", + "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "requires": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "postcss-calc": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", + "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-colormin": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", + "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", + "dev": true, + "requires": { + "browserslist": "^4.16.6", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-convert-values": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.2.tgz", + "integrity": "sha512-c6Hzc4GAv95B7suy4udszX9Zy4ETyMCgFPUDtWjdFTKH1SE9eFY/jEpHSwTH1QPuwxHpWslhckUQWbNRM4ho5g==", + "dev": true, + "requires": { + "browserslist": "^4.20.3", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-discard-comments": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", + "dev": true, + "requires": {} + }, + "postcss-discard-duplicates": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", + "dev": true, + "requires": {} + }, + "postcss-discard-empty": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + "dev": true, + "requires": {} + }, + "postcss-discard-overridden": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + "dev": true, + "requires": {} + }, + "postcss-import": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", + "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + } + }, + "postcss-js": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", + "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", + "dev": true, + "requires": { + "camelcase-css": "^2.0.1" + } + }, + "postcss-load-config": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", + "dev": true, + "requires": { + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" + } + }, + "postcss-loader": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", + "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", + "dev": true, + "requires": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.5", + "semver": "^7.3.5" + }, + "dependencies": { + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "postcss-merge-longhand": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.6.tgz", + "integrity": "sha512-6C/UGF/3T5OE2CEbOuX7iNO63dnvqhGZeUnKkDeifebY0XqkkvrctYSZurpNE902LDf2yKwwPFgotnfSoPhQiw==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.0" + } + }, + "postcss-merge-rules": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.2.tgz", + "integrity": "sha512-zKMUlnw+zYCWoPN6yhPjtcEdlJaMUZ0WyVcxTAmw3lkkN/NDMRkOkiuctQEoWAOvH7twaxUUdvBWl0d4+hifRQ==", + "dev": true, + "requires": { + "browserslist": "^4.16.6", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^3.1.0", + "postcss-selector-parser": "^6.0.5" + } + }, + "postcss-minify-font-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", + "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-minify-gradients": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", + "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "dev": true, + "requires": { + "colord": "^2.9.1", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-minify-params": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.3.tgz", + "integrity": "sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg==", + "dev": true, + "requires": { + "browserslist": "^4.16.6", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-minify-selectors": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", + "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.5" + } + }, + "postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true, + "requires": {} + }, + "postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "dev": true, + "requires": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.4" + } + }, + "postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "requires": { + "icss-utils": "^5.0.0" + } + }, + "postcss-nested": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz", + "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.6" + } + }, + "postcss-normalize-charset": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", + "dev": true, + "requires": {} + }, + "postcss-normalize-display-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", + "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-positions": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", + "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-repeat-style": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", + "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-string": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", + "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-timing-functions": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", + "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-unicode": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz", + "integrity": "sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==", + "dev": true, + "requires": { + "browserslist": "^4.16.6", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", + "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "dev": true, + "requires": { + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-whitespace": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", + "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-ordered-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", + "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", + "dev": true, + "requires": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-reduce-initial": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz", + "integrity": "sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==", + "dev": true, + "requires": { + "browserslist": "^4.16.6", + "caniuse-api": "^3.0.0" + } + }, + "postcss-reduce-transforms": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", + "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-svgo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", + "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0", + "svgo": "^2.7.0" + } + }, + "postcss-unique-selectors": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", + "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.5" + } + }, + "postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==" + }, + "pretty": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pretty/-/pretty-2.0.0.tgz", + "integrity": "sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w==", + "dev": true, + "requires": { + "condense-newlines": "^0.2.1", + "extend-shallow": "^2.0.1", + "js-beautify": "^1.6.12" + } + }, + "pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "dev": true, + "requires": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "progress-webpack-plugin": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/progress-webpack-plugin/-/progress-webpack-plugin-1.0.16.tgz", + "integrity": "sha512-sdiHuuKOzELcBANHfrupYo+r99iPRyOnw15qX+rNlVUqXGfjXdH4IgxriKwG1kNJwVswKQHMdj1hYZMcb9jFaA==", + "dev": true, + "requires": { + "chalk": "^2.1.0", + "figures": "^2.0.0", + "log-update": "^2.3.0" + } + }, + "promise-polyfill": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.2.3.tgz", + "integrity": "sha512-Og0+jCRQetV84U8wVjMNccfGCnMQ9mGs9Hv78QFe+pSDD3gWTpz0y+1QCuxy5d/vBFuZ3iwP2eycAkvqIMPmWg==" + }, + "prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, + "proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "dev": true + }, + "protobufjs": { + "version": "6.11.3", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.3.tgz", + "integrity": "sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==", + "requires": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + }, + "dependencies": { + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + } + } + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "dependencies": { + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + } + } + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", + "dev": true + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "pug-error": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-2.0.0.tgz", + "integrity": "sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ==", + "dev": true + }, + "pug-lexer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-5.0.1.tgz", + "integrity": "sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==", + "dev": true, + "requires": { + "character-parser": "^2.2.0", + "is-expression": "^4.0.0", + "pug-error": "^2.0.0" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true + } + } + }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "requires": { + "pify": "^2.3.0" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", + "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", + "dev": true, + "requires": { + "regenerate": "^1.4.2" + } + }, + "regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", + "dev": true + }, + "regenerator-transform": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", + "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + }, + "regexpu-core": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.1.0.tgz", + "integrity": "sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA==", + "dev": true, + "requires": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.0.1", + "regjsgen": "^0.6.0", + "regjsparser": "^0.8.2", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" + } + }, + "regjsgen": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", + "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==", + "dev": true + }, + "regjsparser": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", + "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true + } + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true + }, + "renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "dev": true, + "requires": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "resolve.exports": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", + "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", + "dev": true + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "rxjs": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz", + "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", + "requires": { + "tslib": "^2.1.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "requires": { + "xmlchars": "^2.2.0" + } + }, + "schema-utils": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", + "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "select": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", + "integrity": "sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==" + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true + }, + "selfsigned": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz", + "integrity": "sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==", + "dev": true, + "requires": { + "node-forge": "^1" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + }, + "semver-parser": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/semver-parser/-/semver-parser-4.0.1.tgz", + "integrity": "sha512-ZdnhLJSeLkc9fXEwqdvVXqrVJ8jq/vhGlFfsMhOE4oIiSZlvUC6Ar4NAbdj+H5DEkhFjyhucce7BO8VL/rpY9g==" + }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true + }, + "shell-quote": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", + "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", + "dev": true + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==", + "dev": true + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "sirv": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz", + "integrity": "sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==", + "dev": true, + "requires": { + "@polka/url": "^1.0.0-next.20", + "mrmime": "^1.0.0", + "totalist": "^1.0.0" + } + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } + }, + "slugify": { + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.5.tgz", + "integrity": "sha512-8mo9bslnBO3tr5PEVFzMPIWwWnipGS0xVbYf65zxDqfNwmzYn1LpiKNrR6DlClusuvo+hDHd1zKpmfAe83NQSQ==" + }, + "sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "requires": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", + "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", + "dev": true + }, + "spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dev": true, + "requires": { + "minipass": "^3.1.1" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "stack-utils": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", + "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", + "dev": true, + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + } + } + }, + "stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", + "dev": true + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "requires": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "dev": true + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "stylehacks": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", + "integrity": "sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==", + "dev": true, + "requires": { + "browserslist": "^4.16.6", + "postcss-selector-parser": "^6.0.4" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "supports-hyperlinks": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", + "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", + "dev": true, + "requires": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", + "dev": true + }, + "svg.draggable.js": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/svg.draggable.js/-/svg.draggable.js-2.2.2.tgz", + "integrity": "sha512-JzNHBc2fLQMzYCZ90KZHN2ohXL0BQJGQimK1kGk6AvSeibuKcIdDX9Kr0dT9+UJ5O8nYA0RB839Lhvk4CY4MZw==", + "requires": { + "svg.js": "^2.0.1" + } + }, + "svg.easing.js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/svg.easing.js/-/svg.easing.js-2.0.0.tgz", + "integrity": "sha512-//ctPdJMGy22YoYGV+3HEfHbm6/69LJUTAqI2/5qBvaNHZ9uUFVC82B0Pl299HzgH13rKrBgi4+XyXXyVWWthA==", + "requires": { + "svg.js": ">=2.3.x" + } + }, + "svg.filter.js": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/svg.filter.js/-/svg.filter.js-2.0.2.tgz", + "integrity": "sha512-xkGBwU+dKBzqg5PtilaTb0EYPqPfJ9Q6saVldX+5vCRy31P6TlRCP3U9NxH3HEufkKkpNgdTLBJnmhDHeTqAkw==", + "requires": { + "svg.js": "^2.2.5" + } + }, + "svg.js": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/svg.js/-/svg.js-2.7.1.tgz", + "integrity": "sha512-ycbxpizEQktk3FYvn/8BH+6/EuWXg7ZpQREJvgacqn46gIddG24tNNe4Son6omdXCnSOaApnpZw6MPCBA1dODA==" + }, + "svg.pathmorphing.js": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/svg.pathmorphing.js/-/svg.pathmorphing.js-0.1.3.tgz", + "integrity": "sha512-49HWI9X4XQR/JG1qXkSDV8xViuTLIWm/B/7YuQELV5KMOPtXjiwH4XPJvr/ghEDibmLQ9Oc22dpWpG0vUDDNww==", + "requires": { + "svg.js": "^2.4.0" + } + }, + "svg.resize.js": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/svg.resize.js/-/svg.resize.js-1.4.3.tgz", + "integrity": "sha512-9k5sXJuPKp+mVzXNvxz7U0uC9oVMQrrf7cFsETznzUDDm0x8+77dtZkWdMfRlmbkEEYvUn9btKuZ3n41oNA+uw==", + "requires": { + "svg.js": "^2.6.5", + "svg.select.js": "^2.1.2" + }, + "dependencies": { + "svg.select.js": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/svg.select.js/-/svg.select.js-2.1.2.tgz", + "integrity": "sha512-tH6ABEyJsAOVAhwcCjF8mw4crjXSI1aa7j2VQR8ZuJ37H2MBUbyeqYr5nEO7sSN3cy9AR9DUwNg0t/962HlDbQ==", + "requires": { + "svg.js": "^2.2.5" + } + } + } + }, + "svg.select.js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/svg.select.js/-/svg.select.js-3.0.1.tgz", + "integrity": "sha512-h5IS/hKkuVCbKSieR9uQCj9w+zLHoPh+ce19bBYyqF53g6mnPB8sAtIbe1s9dh2S2fCmYX2xel1Ln3PJBbK4kw==", + "requires": { + "svg.js": "^2.6.5" + } + }, + "svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "dev": true, + "requires": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "dependencies": { + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true + } + } + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "table": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", + "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "dev": true, + "requires": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + } + } + }, + "tailwindcss": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.1.4.tgz", + "integrity": "sha512-NrxbFV4tYsga/hpWbRyUfIaBrNMXDxx5BsHgBS4v5tlyjf+sDsgBg5m9OxjrXIqAS/uR9kicxLKP+bEHI7BSeQ==", + "dev": true, + "requires": { + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "color-name": "^1.1.4", + "detective": "^5.2.1", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "lilconfig": "^2.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.14", + "postcss-import": "^14.1.0", + "postcss-js": "^4.0.0", + "postcss-load-config": "^3.1.4", + "postcss-nested": "5.0.6", + "postcss-selector-parser": "^6.0.10", + "postcss-value-parser": "^4.2.0", + "quick-lru": "^5.1.1", + "resolve": "^1.22.0" + }, + "dependencies": { + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } + }, + "tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true + }, + "terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "dependencies": { + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + } + }, + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + } + } + }, + "terser": { + "version": "5.17.3", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.3.tgz", + "integrity": "sha512-AudpAZKmZHkG9jueayypz4duuCFJMMNGRMwaPvQKWfxKedh8Z2x3OCoDqIIi1xx5+iwx1u6Au8XQcc9Lke65Yg==", + "dev": true, + "requires": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + } + } + }, + "terser-webpack-plugin": { + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.8.tgz", + "integrity": "sha512-WiHL3ElchZMsK27P8uIUh4604IgJyAW47LVXGbEoB21DbQcZ+OuMpGjVYnEUaqcWM6dO8uS2qUbA7LSCWqvsbg==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "requires": { + "any-promise": "^1.0.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, + "thread-loader": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/thread-loader/-/thread-loader-3.0.4.tgz", + "integrity": "sha512-ByaL2TPb+m6yArpqQUZvP+5S1mZtXsEP7nWKKlAUTm7fCml8kB5s1uI3+eHRP2bk5mVYfRSBI7FFf+tWEyLZwA==", + "dev": true, + "requires": { + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^4.1.0", + "loader-utils": "^2.0.0", + "neo-async": "^2.6.2", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + } + } + }, + "throat": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", + "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", + "dev": true + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" + }, + "tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true + }, + "totalist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", + "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", + "dev": true + }, + "tough-cookie": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "dev": true, + "requires": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "dependencies": { + "universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true + } + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, + "ts-jest": { + "version": "27.1.5", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.1.5.tgz", + "integrity": "sha512-Xv6jBQPoBEvBq/5i2TeSG9tt/nqkbpcurrEG1b+2yfBrcJelOZF9Ml6dmyMh7bcW9JyFbRYpR5rxROSlBLTZHA==", + "dev": true, + "requires": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^27.0.0", + "json5": "2.x", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "7.x", + "yargs-parser": "20.x" + }, + "dependencies": { + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "ts-loader": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.3.1.tgz", + "integrity": "sha512-OkyShkcZTsTwyS3Kt7a4rsT/t2qvEVQuKCTg4LJmpj9fhFR7ukGdZwV6Qq3tRUkqcXtfGpPR7+hFKHCG/0d3Lw==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "tsconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", + "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "@types/strip-bom": "^3.0.0", + "@types/strip-json-comments": "0.0.30", + "strip-bom": "^3.0.0", + "strip-json-comments": "^2.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "optional": true, + "peer": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "optional": true, + "peer": true + } + } + }, + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "tslint": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", + "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^4.0.1", + "glob": "^7.1.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.3", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.13.0", + "tsutils": "^2.29.0" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + } + } + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "typescript": { + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", + "dev": true + }, + "unfetch": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz", + "integrity": "sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==" + }, + "unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", + "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", + "dev": true + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true + }, + "update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "v8-to-istanbul": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", + "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true + } + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true + }, + "vite-plugin-monaco-editor": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vite-plugin-monaco-editor/-/vite-plugin-monaco-editor-1.1.0.tgz", + "integrity": "sha512-IvtUqZotrRoVqwT0PBBDIZPNraya3BxN/bfcNfnxZ5rkJiGcNtO5eAOWWSgT7zullIAEqQwxMU83yL9J5k7gww==", + "requires": {} + }, + "vls": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/vls/-/vls-0.8.2.tgz", + "integrity": "sha512-esrJmf7yRY5rlG7d5Jmucp7P2ZeWHOi7p1aADwxbPiN69SgNUq1Tp24YJ0vUXiEU8mgOW0tf0dL4f6LlSu6K/g==", + "dev": true, + "requires": { + "eslint": "^7.32.0", + "eslint-plugin-vue": "^7.19.1", + "prettier": "^2.4.1", + "pug-lexer": "^5.0.1", + "tslint": "6.1.3", + "typescript": "^4.4.4" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + } + }, + "@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "dev": true, + "requires": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "eslint-plugin-vue": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-7.20.0.tgz", + "integrity": "sha512-oVNDqzBC9h3GO+NTgWeLMhhGigy6/bQaQbHS+0z7C4YEu/qK/yxHvca/2PTZtGNPsCrHwOTgKMrwu02A9iPBmw==", + "dev": true, + "requires": { + "eslint-utils": "^2.1.0", + "natural-compare": "^1.4.0", + "semver": "^6.3.0", + "vue-eslint-parser": "^7.10.0" + } + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + }, + "espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, + "vue-eslint-parser": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-7.11.0.tgz", + "integrity": "sha512-qh3VhDLeh773wjgNTl7ss0VejY9bMMa0GoDG2fQVyDzRFdiU3L7fw74tWZDHNQXdZqxO3EveQroa9ct39D2nqg==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "eslint-scope": "^5.1.1", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.2.1", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^6.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + }, + "espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + } + } + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "vscode-html-languageservice": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/vscode-html-languageservice/-/vscode-html-languageservice-5.0.4.tgz", + "integrity": "sha512-tvrySfpglu4B2rQgWGVO/IL+skvU7kBkQotRlxA7ocSyRXOZUd6GA13XHkxo8LPe07KWjeoBlN1aVGqdfTK4xA==", + "dev": true, + "requires": { + "@vscode/l10n": "^0.0.11", + "vscode-languageserver-textdocument": "^1.0.8", + "vscode-languageserver-types": "^3.17.2", + "vscode-uri": "^3.0.7" + } + }, + "vscode-jsonrpc": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.0.2.tgz", + "integrity": "sha512-RY7HwI/ydoC1Wwg4gJ3y6LpU9FJRZAUnTYMXthqhFXXu77ErDd/xkREpGuk4MyYkk4a+XDWAMqe0S3KkelYQEQ==", + "dev": true + }, + "vscode-languageserver-protocol": { + "version": "3.17.2", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.2.tgz", + "integrity": "sha512-8kYisQ3z/SQ2kyjlNeQxbkkTNmVFoQCqkmGrzLH6A9ecPlgTbp3wDTnUNqaUxYr4vlAcloxx8zwy7G5WdguYNg==", + "dev": true, + "requires": { + "vscode-jsonrpc": "8.0.2", + "vscode-languageserver-types": "3.17.2" + } + }, + "vscode-languageserver-textdocument": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.8.tgz", + "integrity": "sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==" + }, + "vscode-languageserver-types": { + "version": "3.17.2", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.2.tgz", + "integrity": "sha512-zHhCWatviizPIq9B7Vh9uvrH6x3sK8itC84HkamnBWoDFJtzBf7SWlpLCZUit72b3os45h6RWQNC9xHRDF8dRA==" + }, + "vscode-uri": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.7.tgz", + "integrity": "sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==" + }, + "vue": { + "version": "3.2.37", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.37.tgz", + "integrity": "sha512-bOKEZxrm8Eh+fveCqS1/NkG/n6aMidsI6hahas7pa0w/l7jkbssJVsRhVDs07IdDq7h9KHswZOgItnwJAgtVtQ==", + "requires": { + "@vue/compiler-dom": "3.2.37", + "@vue/compiler-sfc": "3.2.37", + "@vue/runtime-dom": "3.2.37", + "@vue/server-renderer": "3.2.37", + "@vue/shared": "3.2.37" + } + }, + "vue-cli-plugin-tailwind": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/vue-cli-plugin-tailwind/-/vue-cli-plugin-tailwind-3.0.0.tgz", + "integrity": "sha512-bUWjfwGtJCeBU7pL4lD86RC+HsJAmAlYqr8e65NGC3q/ZBzC9KQs1Iy/vTyfDTnB7ZJm3huB+1a/m+17fdMZ8A==", + "dev": true + }, + "vue-eslint-parser": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.0.3.tgz", + "integrity": "sha512-yL+ZDb+9T0ELG4VIFo/2anAOz8SvBdlqEnQnvJ3M7Scq56DvtjY0VY88bByRZB0D4J0u8olBcfrXTVONXsh4og==", + "dev": true, + "requires": { + "debug": "^4.3.4", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^7.3.6" + }, + "dependencies": { + "eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "vue-hot-reload-api": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz", + "integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==", + "dev": true + }, + "vue-loader": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-17.0.0.tgz", + "integrity": "sha512-OWSXjrzIvbF2LtOUmxT3HYgwwubbfFelN8PAP9R9dwpIkj48TVioHhWWSx7W7fk+iF5cgg3CBJRxwTdtLU4Ecg==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "hash-sum": "^2.0.0", + "loader-utils": "^2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "vue-observe-visibility": { + "version": "2.0.0-alpha.1", + "resolved": "https://registry.npmjs.org/vue-observe-visibility/-/vue-observe-visibility-2.0.0-alpha.1.tgz", + "integrity": "sha512-flFbp/gs9pZniXR6fans8smv1kDScJ8RS7rEpMjhVabiKeq7Qz3D9+eGsypncjfIyyU84saU88XZ0zjbD6Gq/g==", + "requires": {} + }, + "vue-resize": { + "version": "2.0.0-alpha.1", + "resolved": "https://registry.npmjs.org/vue-resize/-/vue-resize-2.0.0-alpha.1.tgz", + "integrity": "sha512-7+iqOueLU7uc9NrMfrzbG8hwMqchfVfSzpVlCMeJQe4pyibqyoifDNbKTZvwxZKDvGkB+PdFeKvnGZMoEb8esg==", + "requires": {} + }, + "vue-router": { + "version": "4.0.16", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.0.16.tgz", + "integrity": "sha512-JcO7cb8QJLBWE+DfxGUL3xUDOae/8nhM1KVdnudadTAORbuxIC/xAydC5Zr/VLHUDQi1ppuTF5/rjBGzgzrJNA==", + "requires": { + "@vue/devtools-api": "^6.0.0" + } + }, + "vue-style-loader": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz", + "integrity": "sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg==", + "dev": true, + "requires": { + "hash-sum": "^1.0.2", + "loader-utils": "^1.0.2" + }, + "dependencies": { + "hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==", + "dev": true + } + } + }, + "vue-template-es2015-compiler": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz", + "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==", + "dev": true + }, + "vue-virtual-scroller": { + "version": "2.0.0-beta.8", + "resolved": "https://registry.npmjs.org/vue-virtual-scroller/-/vue-virtual-scroller-2.0.0-beta.8.tgz", + "integrity": "sha512-b8/f5NQ5nIEBRTNi6GcPItE4s7kxNHw2AIHLtDp+2QvqdTjVN0FgONwX9cr53jWRgnu+HRLPaWDOR2JPI5MTfQ==", + "requires": { + "mitt": "^2.1.0", + "vue-observe-visibility": "^2.0.0-alpha.1", + "vue-resize": "^2.0.0-alpha.1" + } + }, + "vue-word-highlighter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vue-word-highlighter/-/vue-word-highlighter-1.0.4.tgz", + "integrity": "sha512-jtwnkEBnwMzmKTvpStbffbEpWkW4Fpb2ErdqDqAGOZlrjCgTJczBCpIQiGyBF2jNvYxvCvN5HqIldoNaMS0XYQ==", + "requires": { + "vue-demi": "^0.11.2" + }, + "dependencies": { + "vue-demi": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.11.4.tgz", + "integrity": "sha512-/3xFwzSykLW2HiiLie43a+FFgNOcokbBJ+fzvFXd0r2T8MYohqvphUyDQ8lbAwzQ3Dlcrb1c9ykifGkhSIAk6A==", + "requires": {} + } + } + }, + "vue3-apexcharts": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/vue3-apexcharts/-/vue3-apexcharts-1.4.1.tgz", + "integrity": "sha512-96qP8JDqB9vwU7bkG5nVU+E0UGQn7yYQVqUUCLQMYWDuQyu2vE77H/UFZ1yI+hwzlSTBKT9BqnNG8JsFegB3eg==", + "requires": {} + }, + "vue3-clipboard": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/vue3-clipboard/-/vue3-clipboard-1.0.0.tgz", + "integrity": "sha512-GUqKh1oO79xDpq0z+cCv/NDVTpcJGNDzeNgT3PmTdTp/WJh3gcTrDqIYKycKhzMFOtIFJ7hO/+usgyWtT+fNhA==", + "requires": { + "clipboard": "^2.0.6" + } + }, + "vue3-popper": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/vue3-popper/-/vue3-popper-1.5.0.tgz", + "integrity": "sha512-xaEnx90YBnlSg5G2yWqm2DHWHg+DB99UVRp4VsyTF0QLXyHrqSuE1Xo5+sG0AQq/lBcrGMlk5NU5xE2MDLKViw==", + "requires": { + "@popperjs/core": "^2.9.2", + "debounce": "^1.2.1" + } + }, + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "requires": { + "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + } + } + }, + "walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "requires": { + "makeerror": "1.0.12" + } + }, + "watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, + "webpack": { + "version": "5.82.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.82.1.tgz", + "integrity": "sha512-C6uiGQJ+Gt4RyHXXYt+v9f+SN1v83x68URwgxNQ98cvH8kxiuywWGP4XeNZ1paOzZ63aY3cTciCEQJNFUljlLw==", + "dev": true, + "requires": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.14.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.2", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + } + }, + "webpack-bundle-analyzer": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz", + "integrity": "sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ==", + "dev": true, + "requires": { + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "chalk": "^4.1.0", + "commander": "^7.2.0", + "gzip-size": "^6.0.0", + "lodash": "^4.17.20", + "opener": "^1.5.2", + "sirv": "^1.0.7", + "ws": "^7.3.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "webpack-chain": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/webpack-chain/-/webpack-chain-6.5.1.tgz", + "integrity": "sha512-7doO/SRtLu8q5WM0s7vPKPWX580qhi0/yBHkOxNkv50f6qB76Zy9o2wRTrrPULqYTvQlVHuvbA8v+G5ayuUDsA==", + "dev": true, + "requires": { + "deepmerge": "^1.5.2", + "javascript-stringify": "^2.0.1" + } + }, + "webpack-dev-middleware": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "dev": true, + "requires": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + } + } + }, + "webpack-dev-server": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.3.tgz", + "integrity": "sha512-3qp/eoboZG5/6QgiZ3llN8TUzkSpYg1Ko9khWX1h40MIEUNS2mDoIa8aXsPfskER+GbTvs/IJZ1QTBBhhuetSw==", + "dev": true, + "requires": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.1", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.0.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.4.2" + }, + "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + }, + "ws": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.0.tgz", + "integrity": "sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ==", + "dev": true, + "requires": {} + } + } + }, + "webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + } + }, + "webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true + }, + "webpack-virtual-modules": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.4.4.tgz", + "integrity": "sha512-h9atBP/bsZohWpHnr+2sic8Iecb60GxftXsWNLLLSqewgIsGzByd2gcIID4nXcG+3tNe4GQG3dLcff3kXupdRA==", + "dev": true + }, + "websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "requires": { + "iconv-lite": "0.4.24" + } + }, + "whatwg-fetch": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", + "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==" + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, + "word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "ws": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.8.tgz", + "integrity": "sha512-ri1Id1WinAX5Jqn9HejiGb8crfRio0Qgu8+MtL36rlTA6RLsMdWt1Az/19A2Qij6uSHUMphEFaTKa4WG+UNHNw==", + "dev": true, + "requires": {} + }, + "xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true + }, + "yorkie": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yorkie/-/yorkie-2.0.0.tgz", + "integrity": "sha512-jcKpkthap6x63MB4TxwCyuIGkV0oYP/YRyuQU5UO0Yz/E/ZAu+653/uov+phdmO54n6BcvFRyyt0RRrWdN2mpw==", + "dev": true, + "requires": { + "execa": "^0.8.0", + "is-ci": "^1.0.10", + "normalize-path": "^1.0.0", + "strip-indent": "^2.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz", + "integrity": "sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA==", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "normalize-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-1.0.0.tgz", + "integrity": "sha512-7WyT0w8jhpDStXRq5836AMmihQwq2nrUVQrgjvUo/p/NZf9uy/MeJ246lBJVmWuYXMlJuG9BNZHF0hWjfTbQUA==", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "dev": true + } + } + } + } +} diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 00000000..9aa25bef --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,73 @@ +{ + "name": "omni-web", + "version": "0.0.1", + "private": true, + "scripts": { + "serve": "vue-cli-service serve", + "build": "vue-cli-service build", + "test:unit": "vue-cli-service test:unit", + "lint": "vue-cli-service lint", + "test": "vue-cli-service test:unit" + }, + "dependencies": { + "@auth0/auth0-vue": "^1.0.2", + "@headlessui/vue": "^1.6.5", + "@heroicons/vue": "^2.0.0", + "@stardazed/streams-polyfill": "^2.4.0", + "apexcharts": "^3.35.3", + "buffer": "^6.0.3", + "click-outside-vue3": "^4.0.1", + "core-js": "^3.23.3", + "fetch-intercept": "^2.4.0", + "js-yaml": "^4.1.0", + "long": "^5.2.0", + "luxon": "^2.4.0", + "monaco-editor-vue3": "^0.1.10", + "monaco-yaml": "^4.0.4", + "pluralize": "^8.0.0", + "protobufjs": "^6.11.3", + "rxjs": "^7.5.5", + "semver-parser": "^4.0.1", + "slugify": "^1.6.5", + "uuid": "^8.3.2", + "vue": "^3.2.37", + "vue-router": "^4.0.16", + "vue-virtual-scroller": "^2.0.0-beta.3", + "vue-word-highlighter": "^1.0.4", + "vue3-apexcharts": "^1.4.1", + "vue3-clipboard": "^1.0.0", + "vue3-popper": "^1.5.0", + "whatwg-fetch": "^3.6.2" + }, + "devDependencies": { + "@rushstack/eslint-patch": "^1.1.4", + "@types/luxon": "^2.4.0", + "@types/pluralize": "^0.0.29", + "@types/uuid": "^9.0.0", + "@typescript-eslint/eslint-plugin": "^5.30.0", + "@typescript-eslint/parser": "^5.30.0", + "@volar-plugins/vetur": "latest", + "@vue/cli-plugin-babel": "^5.0.6", + "@vue/cli-plugin-eslint": "^5.0.6", + "@vue/cli-plugin-typescript": "^5.0.6", + "@vue/cli-plugin-unit-jest": "^5.0.6", + "@vue/cli-service": "^5.0.6", + "@vue/compiler-sfc": "^3.2.37", + "@vue/eslint-config-typescript": "^11.0.0", + "@vue/test-utils": "^2.0.0", + "autoprefixer": "^10.4.7", + "babel-eslint": "^10.1.0", + "eslint": "^8.18.0", + "eslint-plugin-vue": "^9.1.1", + "jest": "^27.5.1", + "kubernetes-types": "^1.26.0", + "lodash": "^4.17.21", + "openpgp": "^5.5.0", + "postcss": "^8.4.14", + "tailwindcss": "^3.1.4", + "ts-jest": "^27.1.5", + "ts-loader": "^9.3.1", + "typescript": "^4.7.4", + "vue-cli-plugin-tailwind": "^3.0.0" + } +} diff --git a/frontend/postcss.config.js b/frontend/postcss.config.js new file mode 100644 index 00000000..16149f13 --- /dev/null +++ b/frontend/postcss.config.js @@ -0,0 +1,11 @@ +// Copyright (c) 2024 Sidero Labs, Inc. +// +// Use of this software is governed by the Business Source License +// included in the LICENSE file. + +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {} + } +} diff --git a/frontend/public/favicon.ico b/frontend/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..347b06abbf9e03cb65aca4cecf62bdde8fff76aa GIT binary patch literal 15406 zcmeHO39uYR8Qvr$hzB`e-g|q#ytlhE8$=LAOh5qzDe*wX^5iN}L`4NG5ETguSb#wU zBOoGF5fBQBqZBzrK(3I4BM`2DB$9v-Adu_5-Raq6$M5Tzf3|1e?3DnD<y7tKnePAU zzyJQb|G)bs5@QnM5|bt+P!1%H+$NFuKq8SC81TRC$%(|psM~qxpuLz#Ea*ujY`_2o z7=As94jvDbyzv5<wbfNQ+nF!lXq$i^VB#KcY_8-i%@o~lNo%&Gt{o`3SA^e|`@O8~ zJOmnJq|PkSc0O>HNqZDu(_fyk)j1|k(spO1)3xnbm$uZ7kfD~g-97nj;%7_Mec0At zbf}s{f4}$kl<j^nS8^ZBmYh5It#Ke9<<Rej{5jjb2>Mva`rh8!J94(V3vi3F#mbCa zNj-<Q>nS(tPD0ztQTQeGLdJG}1Q_T^-2nKNeWh}aaLK%SFJyC2_l>k&-ji}Bhsqg| zKU=5_vMy_tXG4x}<Gq|Js`n6Ao}A^(Lq8s#KBLw<FjILctFo8iXYA^}tV^fYO#$!6 zv!%+}f+r<-{~B~3?H$}WJ;2{v@Y7ahKh{mmuA7XyWf{A2rr@#645=L`Q`UBm%3AJh z%GwLP2!7J?EX}_-vMY3O3}o1tv>c1Lsr*P9-z%WEo2i>@$vqDEFR@MV{d#9DaF53O zILLY{bo`I3UF!$lLiGE-saEY>#6kU?VzYI8U4J#&{zjO|gRe~lkHvtyJ5z8!B)EM8 z<s9laXDsK_gfsEew)zs<su`=6WZRUyw|%Bq-h=P*WbMkSkmp6nsOL}wKfP)@@Ozc^ zA@GeQ+7_AZCO%=I_cNe_dm8cT-`;qc3qHI;pPkF3opuY^n#^B;>aOHu8o+Na{OF%v z?<dgvFmyi*-F)KprcZiFyEe5iUxU{i{lMQGLfhppSE_zyG(;lNlk@trSr4AL+s7Nv z@kZY^z^1j&X{68zf7ryOm;>uj(!Y#rq|yA_8^?L%_f3`QI~rlz@$Vn>vXI~PX*f&4 zKi0Q5(v|Ow<sK>e%~+L_rC!Q*{Ly}<;Ae~KV8QFOq~C}9YXbTI)i^&|@z3SFx7BeK zaj`zOdg65hzcE+(kSSFUFe$X;Z>g_@c$WH^iC2I3dD3se*6vT*4t5C9r?23Y(2p8v z(dU@0t@y*{ZVB|ZN!GFmZb|I`m<PC~fbKN`?CSKO+R=pLJM4dv&)=!gKTCTv{-g<+ zs~X2vw+p<KSc~2lj*ack&syp%qmM7K&jQO5e)3q-;*UN@+M4l4e-0OT*zh+6o@J^q zyc2l6%69TZ-%e#cWcY>Ppl)Tx8qsSB+cNpekjMvF!aY|D{?`WdH&3&N`$>aOu!g-* z=k5N~Z}I<v-npR+ST_@i$3mM$pPusZXv-mdjQ^wGa9$%U^o;$S|8PFQ#vT&-8B3iZ zZS@jsysiFZ!2Dd=(Ekg4{?HlrJgkrFKgQ?XqAPPRW6mS^wX2%>qAd0?z<*B5P*Rot z!E%<ofd6%o3;p|CGyc%i!F4$GWx}NfodReEeo!r!Jq6q19_&@axyyY6VX$}JL+E1O z9IxwQ)}M@3Jz3y#*gFyqdN@n!(#807ig5Mkf$@-c1932Bce0)~C^Voyy~m5wKj6<3 zxSrf_A8|ozG3!vi0=<uAUF!$?xRP4y<EVQG%e}PF<yf+=3IFp2Zu*Rkdd=cKo^_B7 z`>*y-3gas@V2_#?;{mC|9`MJc63<_qCUA^72#3D>mUZYqZFe8mHG6{iAy{{vYSQ+! zPsaLnP)OJI?JAzXdxXHjPCrXNj0eDbGwWeHOA~o-+h+XfUj!fY!*~jP_!aBf2hK6# z$MHuDGE4AbC#MJ>=uFRFErab`AoXU6@i{5PMZ6(#7h%9xY-l}fNbh6f`0F*>c9iB* zs{8&a`8C_44}lMJYB|gOfyp~#yGOHc#6$T?dZ?0@_VmmeVxw?9xl!ul__GZ$%e_8- zr_$5&(mMs-UrUwtji85EqN3LZ#5Knoyf>r^F2nfn!P@Xu(MzV}d|w)x@rNGg2z=vw z&lJiZf_%e4KR0Ks%6H)(t_{A|)6WQfDWNxM4}CA&n)4sw`s(Y_h%rKX#mYy~?#qDo zbYUa~9?MWh`b~JorLfsbAm9B$gJm=R^zER(JiyuD$2KM={fWCf=Ju1^EBGz(u@7Tv z(&5jKG3#`i^XHyHol?hBht{#ow|Jf=1p59+&=03E4r#@o_6r>Zb6zblX?FU~Jc0Bf zYdL>x#B0T$u<#|f2C~=EMR(Um{C3~4(?1J-(k{<xgm1?mKIc=R{I+{#BYwN@tX-ai zK5WET-W><qjz8Br*!2?_!}YM86XIyJtLra%)0iWPgKN*9`%SeI=TIE}*4A+^%(<z5 zcJ&R3zqeM#w*o%%Bs=4G7=CX=o&;o@KC~~`_+pIVTK-_`w@DtWDbjyY1M?E_b1P(? z<NaaTv;QZ>Och3UOBJghX(z*$%HN-_?u*#+{q5*?*N%O6-kFKG?Go5T8T*n)n9FQM zV@u?x%`rBFy)mzS0b+jaCp(D?T1mp(tv3<&`#5YM*vF}jShqgk3TsQ`&)DTd!DGFw zP1tWONd)H%t$4L>^TuGE_=91~HH^b$t;V2R`MDqEeok~mUWmni(_XgDAbN*9<aN|K z=>x`hb+Rx__ZItfD}OJ}6JR$Xee~mHu5q!%x1dt%$F5u_`eBLwoZgI7xAJ3r&oyb| zyXE*c<J+npap%{#Z;>&;`)kc?s2lm2%LXmIZzpZ^V>nY%Uu-4ImbCTeDg&IyB0o#U zXK}Q;k)Lt9NfWmDOz&VV*#E~-A6>^-x?K#<_yaN9*(NXO>cO5KFN_6+a;Ng+?1nL@ zj)8?P;>VaAno#!3RKeN54?dk=jDz5-uEcL`+Hw&8#^;;~o1Ebk!EclB;@&{cPT4L` zr}9${(0j$8=S(TANeP|N<yFW5IgE?fb3O9U)SLrge>%2D{RrxhLLZvuGH~8_i|_+{ z6?2VeAd&o2XYw;ISveIn>iV!M*Nm1~YP<<pcaD=e2)uHp=o|ohyH4a`iTamelZfZz z$01WxUjU4b;ZQPHe0}3yz7zTNnI_Ifg*RwbQ+ek=kv3X-<NRER(mCotPVjaw=eaD( zC6pzkWjiC-hv<A*ln&x^oGV}+KO4g0oLkOz1-29U`vz(`_+Xt6BrWLS3FZTZM!lSa zadJ+A-ROKlU3RsQ`x?R}hum3^|51@i(?hP4IaiE>&MOH$JztO;k^ZvG6gNfuT_^IV z?D8SPPt!n-ZFCOU8=Eew!yDE%tp7NZx798pQ_zRmfLm(PL=I<Jf3du~2}fH8+=<|+ zbI*jw9Jthk=|q0+7Ytr5?Bke5n@#Hb2Wq*gE6jn18gp5~n?4DB(|JzPCLZ`awS7aZ znzgH+L>{2-H*EDH`z3VR%a3!1AeT)(w4;<&-COWkGEWUzR*39c9@}}W@g9YV!~UlW zJoi^Gi*7W13-@Ah)*-O|*^PQeV93Kf<7y{=Kk`%&xk}FS)3Wt59oi`J09OlrmXK*p zx;PSh9xZa|GXM0pn7cm#eeGj>TxSFP7W2kqG|WtI0&M0UlfL9F+1^fm<P(oEalz}} z`uHJFhk1wb3FkK2HwAur8_mDnAIOKX3;R!9(a&<d6jbhSO&Q?BE|#`-^3(4{asBfE z;&V*`ubatJU?BTt=-+su-$~hnTpj$@YM}vrti$<V7~5gp4Rer$LHm6|x3&B{M{yPi zU6z?bJr_A$p9`oFX~(#)>??SYvrpmEstnHdE{W>FJyvkI_6rY|(Am=oj2qiq$xr=) zX4F?>J_udt`UIgHjQe@!9T$P?q{KKM1zm;f2FBxZ!Ry0V2p^W<wQA~A|4vaW`8iK9 z7nhm1(+1ZUgf4v1HPS}j@ZpC`Teqcu_e+%xdRGXI{voxC)U$+4tENox<N9vpr>zQI zjN|n}m-1tt9VTsEmD&$EzccLz`VY^hakuGX!iOdJJ|kyXt>mAW^CofqG;vb}cQ=s@ zelyI`gZF08ohx(&rjwHU6X5G}b@Iadh{-2ite+ig`El<-=(dudegt}m?D>&%)o04Y z?;pZFhWdWEhH-t0>y6OvsKi+ycw8bn;ut^=H}>T>gm<2DcJ)kY*YaCVm`iUhKh9YU z8zC-rE^<xGt(^qBxr02}#uDx4qTikQe(cw9uE0BwRgn+xBcO4JvBr$WJ|v6-v<yY( zhay8e`P10<3vHIr)lGs+9#{*HlzqN#$2{OZ4sHJWSqC2V#`6j2=fw#9lKQKeOPa=e zjD`=Pj<Bctun=n}KjRLQKIX%-%##T|{TO7pIRb+_mhEzvyekA<ED=1)1^ZhuIk+z& z^!>Z0PS{82YB&+xrzK1~`KM+^csD8Bzk(0;Hqo;r`Xuyg6=k42EHUN_8t?IlOnrq7 zCDZPF9JLDP{-e$?u=aij{R;gm<iAbmbRs`tz)PRukxw%}nJPK^qn~v>u@5*uGyScm zmG@?%e-BDugZ`HNJy|q<p)bR_a8U%d;oQ5O{xwg#ey4%7Fu%?j?I#g879F0UoB1Ke zjZ1n0pOndaLl~F8oAPLV*wwjlbDnoE<?cq%&tdFqBj<>n$gg8QyY3@k?{{-vv2W4G zn}9fwcflO;3wY8W-lXsFH0qLZBXk4VV{;J9&x2NII~dP}JnJ@jb|OD>RP^m46LhxT zTwhFj^c}oQ2EO%u9mWj%?0Gm7-Y;A)ux_Lg8@AdnF^45%#S-iAsB!N^{xt44W3M*f zq(vDcavL9nht5wM!2PRW3`SB#=i|KFf!K3CV>rn2OY?r3fv#VfYXgm!L}%1T+A1T) zk3OBqPYkRBk^Le3&5F@;z@Uv75Hil?Siuf1lz5-_`Qvg82Bv=H8YcSkb)cT_wY-5w zxK8Eg9uV|a8TzR4o>L>e=(jgMX{$s1^O<N%>#u+EuHT))izUZDZcXe|e)<RGnr|>^ zVhrv={kYb$bl=MS0Bp?k#nq(c&W@whx%@bbx10kpkBwLxaeBjDpEw@f)p^?>jyN4- z9qx%R7SvOiGcoCPBR}UK^zx*P0eRqz@I;P{Npox7x$lIJdd%Rl3Gri7JMBh(%7xth z5i+k>!iE;53$=((-WvIlGdc)#!<;SN7xVvEn$hf5ex0j|o_B9z9;zAr?&@*=XsN## z`l-Tp=3soA<}<pLpK(9v&%;mW(#Z?H?&|L3Y!2OPRR*xH{yp~<^#84Mc<uL}ah$j} z2L09eIp8%fJ{KK_*?C>x4E#To<%W0tnqhXWe@)0gpWvF%jP9FNzh&~jS<<!VLw^N3 bxSw$iY#C=#>h`zN{h9VX{6ED1iU$4-3+k4^ literal 0 HcmV?d00001 diff --git a/frontend/public/index.html b/frontend/public/index.html new file mode 100644 index 00000000..888a50de --- /dev/null +++ b/frontend/public/index.html @@ -0,0 +1,17 @@ +<!DOCTYPE html> +<html lang=""> + <head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <meta name="viewport" content="width=device-width,initial-scale=1.0"> + <link rel="icon" href="<%= BASE_URL %>favicon.ico"> + <title>Omni + + + +
+ + + diff --git a/frontend/src/App.vue b/frontend/src/App.vue new file mode 100644 index 00000000..7868046e --- /dev/null +++ b/frontend/src/App.vue @@ -0,0 +1,46 @@ + + + + + + diff --git a/frontend/src/AppUnavailable.vue b/frontend/src/AppUnavailable.vue new file mode 100644 index 00000000..0ea77ed7 --- /dev/null +++ b/frontend/src/AppUnavailable.vue @@ -0,0 +1,42 @@ + + + + + + diff --git a/frontend/src/api/common/common.pb.ts b/frontend/src/api/common/common.pb.ts new file mode 100644 index 00000000..6fb72153 --- /dev/null +++ b/frontend/src/api/common/common.pb.ts @@ -0,0 +1,75 @@ +/* eslint-disable */ +// @ts-nocheck +/* +* This file is a generated Typescript file for GRPC Gateway, DO NOT MODIFY +*/ + +import * as GoogleProtobufAny from "../google/protobuf/any.pb" +import * as GoogleRpcStatus from "../google/rpc/status.pb" + +export enum Code { + FATAL = 0, + LOCKED = 1, + CANCELED = 2, +} + +export enum ContainerDriver { + CONTAINERD = 0, + CRI = 1, +} + +export type Error = { + code?: Code + message?: string + details?: GoogleProtobufAny.Any[] +} + +export type Metadata = { + hostname?: string + error?: string + status?: GoogleRpcStatus.Status +} + +export type Data = { + metadata?: Metadata + bytes?: Uint8Array +} + +export type DataResponse = { + messages?: Data[] +} + +export type Empty = { + metadata?: Metadata +} + +export type EmptyResponse = { + messages?: Empty[] +} + +export type URL = { + full_path?: string +} + +export type PEMEncodedCertificateAndKey = { + crt?: Uint8Array + key?: Uint8Array +} + +export type PEMEncodedKey = { + key?: Uint8Array +} + +export type NetIP = { + ip?: Uint8Array +} + +export type NetIPPort = { + ip?: Uint8Array + port?: number +} + +export type NetIPPrefix = { + ip?: Uint8Array + prefix_length?: number +} \ No newline at end of file diff --git a/frontend/src/api/common/common.proto b/frontend/src/api/common/common.proto new file mode 100644 index 00000000..97bb7fbb --- /dev/null +++ b/frontend/src/api/common/common.proto @@ -0,0 +1,116 @@ +syntax = "proto3"; + +package common; + +option go_package = "github.com/siderolabs/talos/pkg/machinery/api/common"; + +import "google/protobuf/any.proto"; +import "google/protobuf/descriptor.proto"; +import "google/rpc/status.proto"; + +// An alternative to using options could be extracting versions from comments. +// Unfortunately, they are not available: https://github.com/golang/protobuf/issues/1134 +// Also, while option numbers can be the same, +// names should be different: https://github.com/protocolbuffers/protobuf/issues/4861 + +extend google.protobuf.MessageOptions { + // Indicates the Talos version when this deprecated message will be removed from API. + string remove_deprecated_message = 93117; +} + +extend google.protobuf.FieldOptions { + // Indicates the Talos version when this deprecated filed will be removed from API. + string remove_deprecated_field = 93117; +} + +extend google.protobuf.EnumOptions { + // Indicates the Talos version when this deprecated enum will be removed from API. + string remove_deprecated_enum = 93117; +} + +extend google.protobuf.EnumValueOptions { + // Indicates the Talos version when this deprecated enum value will be removed from API. + string remove_deprecated_enum_value = 93117; +} + +extend google.protobuf.MethodOptions { + // Indicates the Talos version when this deprecated method will be removed from API. + string remove_deprecated_method = 93117; +} + +extend google.protobuf.ServiceOptions { + // Indicates the Talos version when this deprecated service will be removed from API. + string remove_deprecated_service = 93117; +} + +enum Code { + FATAL = 0; + LOCKED = 1; + CANCELED = 2; +} + +message Error { + Code code = 1; + string message = 2; + repeated google.protobuf.Any details = 3; +} + +// Common metadata message nested in all reply message types +message Metadata { + // hostname of the server response comes from (injected by proxy) + string hostname = 1; + // error is set if request failed to the upstream (rest of response is + // undefined) + string error = 2; + // error as gRPC Status + google.rpc.Status status = 3; +} + +message Data { + Metadata metadata = 1; + bytes bytes = 2; +} + +message DataResponse { + repeated Data messages = 1; +} + +message Empty { + Metadata metadata = 1; +} + +message EmptyResponse { + repeated Empty messages = 1; +} + +enum ContainerDriver { + CONTAINERD = 0; + CRI = 1; +} + +message URL { + string full_path = 1; +} + +message PEMEncodedCertificateAndKey { + bytes crt = 1; + bytes key = 2; +} + +message PEMEncodedKey { + bytes key = 1; +} + +message NetIP { + bytes ip = 1; +} + +message NetIPPort { + bytes ip = 1; + int32 port = 2; +} + +message NetIPPrefix { + bytes ip = 1; + int32 prefix_length = 2; +} diff --git a/frontend/src/api/common/omni.pb.ts b/frontend/src/api/common/omni.pb.ts new file mode 100644 index 00000000..2f2c0dc7 --- /dev/null +++ b/frontend/src/api/common/omni.pb.ts @@ -0,0 +1,15 @@ +/* eslint-disable */ +// @ts-nocheck +/* +* This file is a generated Typescript file for GRPC Gateway, DO NOT MODIFY +*/ + +export enum Runtime { + Kubernetes = 0, + Talos = 1, + Omni = 2, +} + +export type Context = { + name?: string +} \ No newline at end of file diff --git a/frontend/src/api/fetch.pb.ts b/frontend/src/api/fetch.pb.ts new file mode 100644 index 00000000..0fdd5cfb --- /dev/null +++ b/frontend/src/api/fetch.pb.ts @@ -0,0 +1,387 @@ +/* eslint-disable */ +// @ts-nocheck +/* +* This file is a generated Typescript file for GRPC Gateway, DO NOT MODIFY +*/ + +/** + * base64 encoder and decoder + * Copied and adapted from https://github.com/protobufjs/protobuf.js/blob/master/lib/base64/index.js + */ +// Base64 encoding table +const b64 = new Array(64); + +// Base64 decoding table +const s64 = new Array(123); + +// 65..90, 97..122, 48..57, 43, 47 +for (let i = 0; i < 64;) + s64[b64[i] = i < 26 ? i + 65 : i < 52 ? i + 71 : i < 62 ? i - 4 : i - 59 | 43] = i++; + +export function b64Encode(buffer: Uint8Array, start: number, end: number): string { + let parts: string[] = null; + const chunk = []; + let i = 0, // output index + j = 0, // goto index + t; // temporary + while (start < end) { + const b = buffer[start++]; + switch (j) { + case 0: + chunk[i++] = b64[b >> 2]; + t = (b & 3) << 4; + j = 1; + break; + case 1: + chunk[i++] = b64[t | b >> 4]; + t = (b & 15) << 2; + j = 2; + break; + case 2: + chunk[i++] = b64[t | b >> 6]; + chunk[i++] = b64[b & 63]; + j = 0; + break; + } + if (i > 8191) { + (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk)); + i = 0; + } + } + if (j) { + chunk[i++] = b64[t]; + chunk[i++] = 61; + if (j === 1) + chunk[i++] = 61; + } + if (parts) { + if (i) + parts.push(String.fromCharCode.apply(String, chunk.slice(0, i))); + return parts.join(""); + } + return String.fromCharCode.apply(String, chunk.slice(0, i)); +} + +const invalidEncoding = "invalid encoding"; + +export function b64Decode(s: string): Uint8Array { + const buffer = []; + let offset = 0; + let j = 0, // goto index + t; // temporary + for (let i = 0; i < s.length;) { + let c = s.charCodeAt(i++); + if (c === 61 && j > 1) + break; + if ((c = s64[c]) === undefined) + throw Error(invalidEncoding); + switch (j) { + case 0: + t = c; + j = 1; + break; + case 1: + buffer[offset++] = t << 2 | (c & 48) >> 4; + t = c; + j = 2; + break; + case 2: + buffer[offset++] = (t & 15) << 4 | (c & 60) >> 2; + t = c; + j = 3; + break; + case 3: + buffer[offset++] = (t & 3) << 6 | c; + j = 0; + break; + } + } + if (j === 1) + throw Error(invalidEncoding); + return new Uint8Array(buffer); +} + +export interface fetchOption { + (req: RequestOptions): void +} + +let commonFetchOptions: fetchOption[]; + +type Writeable = { -readonly [P in keyof T]: T[P] }; + +export type RequestOptions = Writeable & { + controller?: AbortController, + timeoutID?: number +}; + +export const setCommonFetchOptions = (...options: fetchOption[]) => { + commonFetchOptions = options; +} + +export function replacer(key: any, value: any): any { + if(value && value.constructor === Uint8Array) { + return b64Encode(value, 0, value.length); + } + + return value; +} + +const createRequest = (method: string, path: string, body?: T, ...options: fetchOption[]): RequestOptions => { + const request: RequestOptions = { + url: path, + method: method, + }; + + if (body) { + request.body = JSON.stringify(body, replacer); + } + + for (const opt of (commonFetchOptions ?? [])) { + opt(request); + } + + for (const opt of options) { + opt(request); + } + + return request; +} + +export const fetchReq = async (method: string, path: string, body?: T, ...options: fetchOption[]): Promise => { + const req = createRequest(method, path, body, ...options); + + try { + const response = await fetch(req.url, req); + + if (!response.ok) { + await getError(response); + } + + return (await response.json()) as O; + } finally { + if (req.timeoutID) { + clearTimeout(req.timeoutID); + } + } +} + +// NotifyStreamEntityArrival is a callback that will be called on streaming entity arrival +export type NotifyStreamEntityArrival = (resp: T) => void + +const getError = async (result: Response) => { + let resp: any; + + try { + resp = await result.json(); + } catch (e) { + throw new Error(e.message); + } + + throw resp; +} + +/** + * fetchStreamingRequest is able to handle grpc-gateway server side streaming call + * it takes NotifyStreamEntityArrival that lets users respond to entity arrival during the call + * all entities will be returned as an array after the call finishes. + **/ +export async function fetchStreamingRequest(method: string, path: string, body?: T, callback: NotifyStreamEntityArrival, ...options: fetchOption[]): Promise { + const req = createRequest(method, path, body, ...options); + const result = await fetch(req.url, req); + + // needs to use the .ok to check the status of HTTP status code + // http other than 200 will not throw an error, instead the .ok will become false. + // see https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch# + if (!result.ok) { + await getError(result); + } + + if (!result.body) { + throw new Error("response does not have a body") + } + + try { + await result.body + .pipeThrough(new TextDecoderStream()) + .pipeThrough(getNewLineDelimitedJSONDecodingStream()) + .pipeTo(getNotifyEntityArrivalSink(callback)); + } finally { + if (req.timeoutID) { + clearTimeout(req.timeoutID); + } + } +} + +/** + * JSONStringStreamController represents the transform controller that's able to transform the incoming + * new line delimited json content stream into entities and able to push the entity to the down stream + */ +interface JSONStringStreamController extends TransformStreamDefaultController { + buf?: string + pos?: number + enqueue: (s: T) => void +} + +/** + * getNewLineDelimitedJSONDecodingStream returns a TransformStream that's able to handle new line delimited json stream content into parsed entities + */ +function getNewLineDelimitedJSONDecodingStream(): TransformStream { + return new TransformStream({ + start(controller: JSONStringStreamController) { + controller.buf = '' + controller.pos = 0 + }, + + transform(chunk: string, controller: JSONStringStreamController) { + if (controller.buf === undefined) { + controller.buf = '' + } + if (controller.pos === undefined) { + controller.pos = 0 + } + controller.buf += chunk + while (controller.pos < controller.buf.length) { + if (controller.buf[controller.pos] === '\n') { + const line = controller.buf.substring(0, controller.pos) + const response = JSON.parse(line) + controller.enqueue(response.result ?? response) + controller.buf = controller.buf.substring(controller.pos + 1) + controller.pos = 0 + } else { + ++controller.pos + } + } + } + }) + +} + +/** + * getNotifyEntityArrivalSink takes the NotifyStreamEntityArrival callback and return + * a sink that will call the callback on entity arrival + * @param notifyCallback + */ +function getNotifyEntityArrivalSink(notifyCallback: NotifyStreamEntityArrival) { + return new WritableStream({ + write(entity: T) { + notifyCallback(entity) + } + }) +} + +type Primitive = string | boolean | number; +type RequestPayload = Record; +type FlattenedRequestPayload = Record>; + +/** + * Checks if given value is a plain object + * Logic copied and adapted from below source: + * https://github.com/char0n/ramda-adjunct/blob/master/src/isPlainObj.js + * @param {unknown} value + * @return {boolean} + */ +function isPlainObject(value: unknown): boolean { + const isObject = + Object.prototype.toString.call(value).slice(8, -1) === "Object"; + const isObjLike = value !== null && isObject; + + if (!isObjLike || !isObject) { + return false; + } + + const proto = Object.getPrototypeOf(value); + + const hasObjectConstructor = + typeof proto === "object" && + proto.constructor === Object.prototype.constructor; + + return hasObjectConstructor; +} + +/** + * Checks if given value is of a primitive type + * @param {unknown} value + * @return {boolean} + */ +function isPrimitive(value: unknown): boolean { + return ["string", "number", "boolean"].some(t => typeof value === t); +} + +/** + * Checks if given primitive is zero-value + * @param {Primitive} value + * @return {boolean} + */ +function isZeroValuePrimitive(value: Primitive): boolean { + return value === false || value === 0 || value === ""; +} + +/** + * Flattens a deeply nested request payload and returns an object + * with only primitive values and non-empty array of primitive values + * as per https://github.com/googleapis/googleapis/blob/master/google/api/http.proto + * @param {RequestPayload} requestPayload + * @param {String} path + * @return {FlattenedRequestPayload>} + */ +function flattenRequestPayload( + requestPayload: T, + path: string = "" +): FlattenedRequestPayload { + return Object.keys(requestPayload).reduce( + (acc: T, key: string): T => { + const value = requestPayload[key]; + const newPath = path ? [path, key].join(".") : key; + + const isNonEmptyPrimitiveArray = + Array.isArray(value) && + value.every(v => isPrimitive(v)) && + value.length > 0; + + const isNonZeroValuePrimitive = + isPrimitive(value) && !isZeroValuePrimitive(value as Primitive); + + let objectToMerge = {}; + + if (isPlainObject(value)) { + objectToMerge = flattenRequestPayload(value as RequestPayload, newPath); + } else if (isNonZeroValuePrimitive || isNonEmptyPrimitiveArray) { + objectToMerge = { [newPath]: value }; + } + + return { ...acc, ...objectToMerge }; + }, + {} as T + ) as FlattenedRequestPayload; +} + +/** + * Renders a deeply nested request payload into a string of URL search + * parameters by first flattening the request payload and then removing keys + * which are already present in the URL path. + * @param {RequestPayload} requestPayload + * @param {string[]} urlPathParams + * @return {string} + */ +export function renderURLSearchParams( + requestPayload: T, + urlPathParams: string[] = [] +): string { + const flattenedRequestPayload = flattenRequestPayload(requestPayload); + + const urlSearchParams = Object.keys(flattenedRequestPayload).reduce( + (acc: string[][], key: string): string[][] => { + // key should not be present in the url path as a parameter + const value = flattenedRequestPayload[key]; + if (urlPathParams.find(f => f === key)) { + return acc; + } + return Array.isArray(value) + ? [...acc, ...value.map(m => [key, m.toString()])] + : (acc = [...acc, [key, value.toString()]]); + }, + [] as string[][] + ); + + return new URLSearchParams(urlSearchParams).toString(); +} \ No newline at end of file diff --git a/frontend/src/api/google/protobuf/any.pb.ts b/frontend/src/api/google/protobuf/any.pb.ts new file mode 100644 index 00000000..dfad82ca --- /dev/null +++ b/frontend/src/api/google/protobuf/any.pb.ts @@ -0,0 +1,9 @@ +/* eslint-disable */ +// @ts-nocheck +/* +* This file is a generated Typescript file for GRPC Gateway, DO NOT MODIFY +*/ +export type Any = { + type_url?: string + value?: Uint8Array +} \ No newline at end of file diff --git a/frontend/src/api/google/protobuf/any.proto b/frontend/src/api/google/protobuf/any.proto new file mode 100644 index 00000000..eff44e50 --- /dev/null +++ b/frontend/src/api/google/protobuf/any.proto @@ -0,0 +1,162 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +syntax = "proto3"; + +package google.protobuf; + +option go_package = "google.golang.org/protobuf/types/known/anypb"; +option java_package = "com.google.protobuf"; +option java_outer_classname = "AnyProto"; +option java_multiple_files = true; +option objc_class_prefix = "GPB"; +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; + +// `Any` contains an arbitrary serialized protocol buffer message along with a +// URL that describes the type of the serialized message. +// +// Protobuf library provides support to pack/unpack Any values in the form +// of utility functions or additional generated methods of the Any type. +// +// Example 1: Pack and unpack a message in C++. +// +// Foo foo = ...; +// Any any; +// any.PackFrom(foo); +// ... +// if (any.UnpackTo(&foo)) { +// ... +// } +// +// Example 2: Pack and unpack a message in Java. +// +// Foo foo = ...; +// Any any = Any.pack(foo); +// ... +// if (any.is(Foo.class)) { +// foo = any.unpack(Foo.class); +// } +// // or ... +// if (any.isSameTypeAs(Foo.getDefaultInstance())) { +// foo = any.unpack(Foo.getDefaultInstance()); +// } +// +// Example 3: Pack and unpack a message in Python. +// +// foo = Foo(...) +// any = Any() +// any.Pack(foo) +// ... +// if any.Is(Foo.DESCRIPTOR): +// any.Unpack(foo) +// ... +// +// Example 4: Pack and unpack a message in Go +// +// foo := &pb.Foo{...} +// any, err := anypb.New(foo) +// if err != nil { +// ... +// } +// ... +// foo := &pb.Foo{} +// if err := any.UnmarshalTo(foo); err != nil { +// ... +// } +// +// The pack methods provided by protobuf library will by default use +// 'type.googleapis.com/full.type.name' as the type URL and the unpack +// methods only use the fully qualified type name after the last '/' +// in the type URL, for example "foo.bar.com/x/y.z" will yield type +// name "y.z". +// +// JSON +// ==== +// The JSON representation of an `Any` value uses the regular +// representation of the deserialized, embedded message, with an +// additional field `@type` which contains the type URL. Example: +// +// package google.profile; +// message Person { +// string first_name = 1; +// string last_name = 2; +// } +// +// { +// "@type": "type.googleapis.com/google.profile.Person", +// "firstName": , +// "lastName": +// } +// +// If the embedded message type is well-known and has a custom JSON +// representation, that representation will be embedded adding a field +// `value` which holds the custom JSON in addition to the `@type` +// field. Example (for message [google.protobuf.Duration][]): +// +// { +// "@type": "type.googleapis.com/google.protobuf.Duration", +// "value": "1.212s" +// } +// +message Any { + // A URL/resource name that uniquely identifies the type of the serialized + // protocol buffer message. This string must contain at least + // one "/" character. The last segment of the URL's path must represent + // the fully qualified name of the type (as in + // `path/google.protobuf.Duration`). The name should be in a canonical form + // (e.g., leading "." is not accepted). + // + // In practice, teams usually precompile into the binary all types that they + // expect it to use in the context of Any. However, for URLs which use the + // scheme `http`, `https`, or no scheme, one can optionally set up a type + // server that maps type URLs to message definitions as follows: + // + // * If no scheme is provided, `https` is assumed. + // * An HTTP GET on the URL must yield a [google.protobuf.Type][] + // value in binary format, or produce an error. + // * Applications are allowed to cache lookup results based on the + // URL, or have them precompiled into a binary to avoid any + // lookup. Therefore, binary compatibility needs to be preserved + // on changes to types. (Use versioned type names to manage + // breaking changes.) + // + // Note: this functionality is not currently available in the official + // protobuf release, and it is not used for type URLs beginning with + // type.googleapis.com. As of May 2023, there are no widely used type server + // implementations and no plans to implement one. + // + // Schemes other than `http`, `https` (or the empty scheme) might be + // used with implementation specific semantics. + // + string type_url = 1; + + // Must be a valid serialized protocol buffer of the above specified type. + bytes value = 2; +} diff --git a/frontend/src/api/google/protobuf/duration.pb.ts b/frontend/src/api/google/protobuf/duration.pb.ts new file mode 100644 index 00000000..25688aa0 --- /dev/null +++ b/frontend/src/api/google/protobuf/duration.pb.ts @@ -0,0 +1,6 @@ +/* eslint-disable */ +// @ts-nocheck +/* +* This file is a generated Typescript file for GRPC Gateway, DO NOT MODIFY +*/ +export type Duration = string \ No newline at end of file diff --git a/frontend/src/api/google/protobuf/duration.proto b/frontend/src/api/google/protobuf/duration.proto new file mode 100644 index 00000000..41f40c22 --- /dev/null +++ b/frontend/src/api/google/protobuf/duration.proto @@ -0,0 +1,115 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +syntax = "proto3"; + +package google.protobuf; + +option cc_enable_arenas = true; +option go_package = "google.golang.org/protobuf/types/known/durationpb"; +option java_package = "com.google.protobuf"; +option java_outer_classname = "DurationProto"; +option java_multiple_files = true; +option objc_class_prefix = "GPB"; +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; + +// A Duration represents a signed, fixed-length span of time represented +// as a count of seconds and fractions of seconds at nanosecond +// resolution. It is independent of any calendar and concepts like "day" +// or "month". It is related to Timestamp in that the difference between +// two Timestamp values is a Duration and it can be added or subtracted +// from a Timestamp. Range is approximately +-10,000 years. +// +// # Examples +// +// Example 1: Compute Duration from two Timestamps in pseudo code. +// +// Timestamp start = ...; +// Timestamp end = ...; +// Duration duration = ...; +// +// duration.seconds = end.seconds - start.seconds; +// duration.nanos = end.nanos - start.nanos; +// +// if (duration.seconds < 0 && duration.nanos > 0) { +// duration.seconds += 1; +// duration.nanos -= 1000000000; +// } else if (duration.seconds > 0 && duration.nanos < 0) { +// duration.seconds -= 1; +// duration.nanos += 1000000000; +// } +// +// Example 2: Compute Timestamp from Timestamp + Duration in pseudo code. +// +// Timestamp start = ...; +// Duration duration = ...; +// Timestamp end = ...; +// +// end.seconds = start.seconds + duration.seconds; +// end.nanos = start.nanos + duration.nanos; +// +// if (end.nanos < 0) { +// end.seconds -= 1; +// end.nanos += 1000000000; +// } else if (end.nanos >= 1000000000) { +// end.seconds += 1; +// end.nanos -= 1000000000; +// } +// +// Example 3: Compute Duration from datetime.timedelta in Python. +// +// td = datetime.timedelta(days=3, minutes=10) +// duration = Duration() +// duration.FromTimedelta(td) +// +// # JSON Mapping +// +// In JSON format, the Duration type is encoded as a string rather than an +// object, where the string ends in the suffix "s" (indicating seconds) and +// is preceded by the number of seconds, with nanoseconds expressed as +// fractional seconds. For example, 3 seconds with 0 nanoseconds should be +// encoded in JSON format as "3s", while 3 seconds and 1 nanosecond should +// be expressed in JSON format as "3.000000001s", and 3 seconds and 1 +// microsecond should be expressed in JSON format as "3.000001s". +// +message Duration { + // Signed seconds of the span of time. Must be from -315,576,000,000 + // to +315,576,000,000 inclusive. Note: these bounds are computed from: + // 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years + int64 seconds = 1; + + // Signed fractions of a second at nanosecond resolution of the span + // of time. Durations less than one second are represented with a 0 + // `seconds` field and a positive or negative `nanos` field. For durations + // of one second or more, a non-zero value for the `nanos` field must be + // of the same sign as the `seconds` field. Must be from -999,999,999 + // to +999,999,999 inclusive. + int32 nanos = 2; +} diff --git a/frontend/src/api/google/protobuf/empty.pb.ts b/frontend/src/api/google/protobuf/empty.pb.ts new file mode 100644 index 00000000..d48bd3c9 --- /dev/null +++ b/frontend/src/api/google/protobuf/empty.pb.ts @@ -0,0 +1,7 @@ +/* eslint-disable */ +// @ts-nocheck +/* +* This file is a generated Typescript file for GRPC Gateway, DO NOT MODIFY +*/ +export type Empty = { +} \ No newline at end of file diff --git a/frontend/src/api/google/protobuf/empty.proto b/frontend/src/api/google/protobuf/empty.proto new file mode 100644 index 00000000..b87c89dc --- /dev/null +++ b/frontend/src/api/google/protobuf/empty.proto @@ -0,0 +1,51 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +syntax = "proto3"; + +package google.protobuf; + +option go_package = "google.golang.org/protobuf/types/known/emptypb"; +option java_package = "com.google.protobuf"; +option java_outer_classname = "EmptyProto"; +option java_multiple_files = true; +option objc_class_prefix = "GPB"; +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; +option cc_enable_arenas = true; + +// A generic empty message that you can re-use to avoid defining duplicated +// empty messages in your APIs. A typical example is to use it as the request +// or the response type of an API method. For instance: +// +// service Foo { +// rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty); +// } +// +message Empty {} diff --git a/frontend/src/api/google/protobuf/timestamp.pb.ts b/frontend/src/api/google/protobuf/timestamp.pb.ts new file mode 100644 index 00000000..166d9dbc --- /dev/null +++ b/frontend/src/api/google/protobuf/timestamp.pb.ts @@ -0,0 +1,6 @@ +/* eslint-disable */ +// @ts-nocheck +/* +* This file is a generated Typescript file for GRPC Gateway, DO NOT MODIFY +*/ +export type Timestamp = string \ No newline at end of file diff --git a/frontend/src/api/google/protobuf/timestamp.proto b/frontend/src/api/google/protobuf/timestamp.proto new file mode 100644 index 00000000..fd0bc07d --- /dev/null +++ b/frontend/src/api/google/protobuf/timestamp.proto @@ -0,0 +1,144 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +syntax = "proto3"; + +package google.protobuf; + +option cc_enable_arenas = true; +option go_package = "google.golang.org/protobuf/types/known/timestamppb"; +option java_package = "com.google.protobuf"; +option java_outer_classname = "TimestampProto"; +option java_multiple_files = true; +option objc_class_prefix = "GPB"; +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; + +// A Timestamp represents a point in time independent of any time zone or local +// calendar, encoded as a count of seconds and fractions of seconds at +// nanosecond resolution. The count is relative to an epoch at UTC midnight on +// January 1, 1970, in the proleptic Gregorian calendar which extends the +// Gregorian calendar backwards to year one. +// +// All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap +// second table is needed for interpretation, using a [24-hour linear +// smear](https://developers.google.com/time/smear). +// +// The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By +// restricting to that range, we ensure that we can convert to and from [RFC +// 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings. +// +// # Examples +// +// Example 1: Compute Timestamp from POSIX `time()`. +// +// Timestamp timestamp; +// timestamp.set_seconds(time(NULL)); +// timestamp.set_nanos(0); +// +// Example 2: Compute Timestamp from POSIX `gettimeofday()`. +// +// struct timeval tv; +// gettimeofday(&tv, NULL); +// +// Timestamp timestamp; +// timestamp.set_seconds(tv.tv_sec); +// timestamp.set_nanos(tv.tv_usec * 1000); +// +// Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`. +// +// FILETIME ft; +// GetSystemTimeAsFileTime(&ft); +// UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime; +// +// // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z +// // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z. +// Timestamp timestamp; +// timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL)); +// timestamp.set_nanos((INT32) ((ticks % 10000000) * 100)); +// +// Example 4: Compute Timestamp from Java `System.currentTimeMillis()`. +// +// long millis = System.currentTimeMillis(); +// +// Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000) +// .setNanos((int) ((millis % 1000) * 1000000)).build(); +// +// Example 5: Compute Timestamp from Java `Instant.now()`. +// +// Instant now = Instant.now(); +// +// Timestamp timestamp = +// Timestamp.newBuilder().setSeconds(now.getEpochSecond()) +// .setNanos(now.getNano()).build(); +// +// Example 6: Compute Timestamp from current time in Python. +// +// timestamp = Timestamp() +// timestamp.GetCurrentTime() +// +// # JSON Mapping +// +// In JSON format, the Timestamp type is encoded as a string in the +// [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the +// format is "{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z" +// where {year} is always expressed using four digits while {month}, {day}, +// {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional +// seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution), +// are optional. The "Z" suffix indicates the timezone ("UTC"); the timezone +// is required. A proto3 JSON serializer should always use UTC (as indicated by +// "Z") when printing the Timestamp type and a proto3 JSON parser should be +// able to accept both UTC and other timezones (as indicated by an offset). +// +// For example, "2017-01-15T01:30:15.01Z" encodes 15.01 seconds past +// 01:30 UTC on January 15, 2017. +// +// In JavaScript, one can convert a Date object to this format using the +// standard +// [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString) +// method. In Python, a standard `datetime.datetime` object can be converted +// to this format using +// [`strftime`](https://docs.python.org/2/library/time.html#time.strftime) with +// the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one can use +// the Joda Time's [`ISODateTimeFormat.dateTime()`]( +// http://joda-time.sourceforge.net/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime() +// ) to obtain a formatter capable of generating timestamps in this format. +// +message Timestamp { + // Represents seconds of UTC time since Unix epoch + // 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to + // 9999-12-31T23:59:59Z inclusive. + int64 seconds = 1; + + // Non-negative fractions of a second at nanosecond resolution. Negative + // second values with fractions must still have non-negative nanos values + // that count forward in time. Must be from 0 to 999,999,999 + // inclusive. + int32 nanos = 2; +} diff --git a/frontend/src/api/google/rpc/code.pb.ts b/frontend/src/api/google/rpc/code.pb.ts new file mode 100644 index 00000000..6511676a --- /dev/null +++ b/frontend/src/api/google/rpc/code.pb.ts @@ -0,0 +1,25 @@ +/* eslint-disable */ +// @ts-nocheck +/* +* This file is a generated Typescript file for GRPC Gateway, DO NOT MODIFY +*/ + +export enum Code { + OK = 0, + CANCELLED = 1, + UNKNOWN = 2, + INVALID_ARGUMENT = 3, + DEADLINE_EXCEEDED = 4, + NOT_FOUND = 5, + ALREADY_EXISTS = 6, + PERMISSION_DENIED = 7, + UNAUTHENTICATED = 16, + RESOURCE_EXHAUSTED = 8, + FAILED_PRECONDITION = 9, + ABORTED = 10, + OUT_OF_RANGE = 11, + UNIMPLEMENTED = 12, + INTERNAL = 13, + UNAVAILABLE = 14, + DATA_LOSS = 15, +} \ No newline at end of file diff --git a/frontend/src/api/google/rpc/code.proto b/frontend/src/api/google/rpc/code.proto new file mode 100644 index 00000000..7c810af4 --- /dev/null +++ b/frontend/src/api/google/rpc/code.proto @@ -0,0 +1,186 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.rpc; + +option go_package = "google.golang.org/genproto/googleapis/rpc/code;code"; +option java_multiple_files = true; +option java_outer_classname = "CodeProto"; +option java_package = "com.google.rpc"; +option objc_class_prefix = "RPC"; + +// The canonical error codes for gRPC APIs. +// +// +// Sometimes multiple error codes may apply. Services should return +// the most specific error code that applies. For example, prefer +// `OUT_OF_RANGE` over `FAILED_PRECONDITION` if both codes apply. +// Similarly prefer `NOT_FOUND` or `ALREADY_EXISTS` over `FAILED_PRECONDITION`. +enum Code { + // Not an error; returned on success. + // + // HTTP Mapping: 200 OK + OK = 0; + + // The operation was cancelled, typically by the caller. + // + // HTTP Mapping: 499 Client Closed Request + CANCELLED = 1; + + // Unknown error. For example, this error may be returned when + // a `Status` value received from another address space belongs to + // an error space that is not known in this address space. Also + // errors raised by APIs that do not return enough error information + // may be converted to this error. + // + // HTTP Mapping: 500 Internal Server Error + UNKNOWN = 2; + + // The client specified an invalid argument. Note that this differs + // from `FAILED_PRECONDITION`. `INVALID_ARGUMENT` indicates arguments + // that are problematic regardless of the state of the system + // (e.g., a malformed file name). + // + // HTTP Mapping: 400 Bad Request + INVALID_ARGUMENT = 3; + + // The deadline expired before the operation could complete. For operations + // that change the state of the system, this error may be returned + // even if the operation has completed successfully. For example, a + // successful response from a server could have been delayed long + // enough for the deadline to expire. + // + // HTTP Mapping: 504 Gateway Timeout + DEADLINE_EXCEEDED = 4; + + // Some requested entity (e.g., file or directory) was not found. + // + // Note to server developers: if a request is denied for an entire class + // of users, such as gradual feature rollout or undocumented allowlist, + // `NOT_FOUND` may be used. If a request is denied for some users within + // a class of users, such as user-based access control, `PERMISSION_DENIED` + // must be used. + // + // HTTP Mapping: 404 Not Found + NOT_FOUND = 5; + + // The entity that a client attempted to create (e.g., file or directory) + // already exists. + // + // HTTP Mapping: 409 Conflict + ALREADY_EXISTS = 6; + + // The caller does not have permission to execute the specified + // operation. `PERMISSION_DENIED` must not be used for rejections + // caused by exhausting some resource (use `RESOURCE_EXHAUSTED` + // instead for those errors). `PERMISSION_DENIED` must not be + // used if the caller can not be identified (use `UNAUTHENTICATED` + // instead for those errors). This error code does not imply the + // request is valid or the requested entity exists or satisfies + // other pre-conditions. + // + // HTTP Mapping: 403 Forbidden + PERMISSION_DENIED = 7; + + // The request does not have valid authentication credentials for the + // operation. + // + // HTTP Mapping: 401 Unauthorized + UNAUTHENTICATED = 16; + + // Some resource has been exhausted, perhaps a per-user quota, or + // perhaps the entire file system is out of space. + // + // HTTP Mapping: 429 Too Many Requests + RESOURCE_EXHAUSTED = 8; + + // The operation was rejected because the system is not in a state + // required for the operation's execution. For example, the directory + // to be deleted is non-empty, an rmdir operation is applied to + // a non-directory, etc. + // + // Service implementors can use the following guidelines to decide + // between `FAILED_PRECONDITION`, `ABORTED`, and `UNAVAILABLE`: + // (a) Use `UNAVAILABLE` if the client can retry just the failing call. + // (b) Use `ABORTED` if the client should retry at a higher level. For + // example, when a client-specified test-and-set fails, indicating the + // client should restart a read-modify-write sequence. + // (c) Use `FAILED_PRECONDITION` if the client should not retry until + // the system state has been explicitly fixed. For example, if an "rmdir" + // fails because the directory is non-empty, `FAILED_PRECONDITION` + // should be returned since the client should not retry unless + // the files are deleted from the directory. + // + // HTTP Mapping: 400 Bad Request + FAILED_PRECONDITION = 9; + + // The operation was aborted, typically due to a concurrency issue such as + // a sequencer check failure or transaction abort. + // + // See the guidelines above for deciding between `FAILED_PRECONDITION`, + // `ABORTED`, and `UNAVAILABLE`. + // + // HTTP Mapping: 409 Conflict + ABORTED = 10; + + // The operation was attempted past the valid range. E.g., seeking or + // reading past end-of-file. + // + // Unlike `INVALID_ARGUMENT`, this error indicates a problem that may + // be fixed if the system state changes. For example, a 32-bit file + // system will generate `INVALID_ARGUMENT` if asked to read at an + // offset that is not in the range [0,2^32-1], but it will generate + // `OUT_OF_RANGE` if asked to read from an offset past the current + // file size. + // + // There is a fair bit of overlap between `FAILED_PRECONDITION` and + // `OUT_OF_RANGE`. We recommend using `OUT_OF_RANGE` (the more specific + // error) when it applies so that callers who are iterating through + // a space can easily look for an `OUT_OF_RANGE` error to detect when + // they are done. + // + // HTTP Mapping: 400 Bad Request + OUT_OF_RANGE = 11; + + // The operation is not implemented or is not supported/enabled in this + // service. + // + // HTTP Mapping: 501 Not Implemented + UNIMPLEMENTED = 12; + + // Internal errors. This means that some invariants expected by the + // underlying system have been broken. This error code is reserved + // for serious errors. + // + // HTTP Mapping: 500 Internal Server Error + INTERNAL = 13; + + // The service is currently unavailable. This is most likely a + // transient condition, which can be corrected by retrying with + // a backoff. Note that it is not always safe to retry + // non-idempotent operations. + // + // See the guidelines above for deciding between `FAILED_PRECONDITION`, + // `ABORTED`, and `UNAVAILABLE`. + // + // HTTP Mapping: 503 Service Unavailable + UNAVAILABLE = 14; + + // Unrecoverable data loss or corruption. + // + // HTTP Mapping: 500 Internal Server Error + DATA_LOSS = 15; +} diff --git a/frontend/src/api/google/rpc/status.pb.ts b/frontend/src/api/google/rpc/status.pb.ts new file mode 100644 index 00000000..41a0fb74 --- /dev/null +++ b/frontend/src/api/google/rpc/status.pb.ts @@ -0,0 +1,12 @@ +/* eslint-disable */ +// @ts-nocheck +/* +* This file is a generated Typescript file for GRPC Gateway, DO NOT MODIFY +*/ + +import * as GoogleProtobufAny from "../protobuf/any.pb" +export type Status = { + code?: number + message?: string + details?: GoogleProtobufAny.Any[] +} \ No newline at end of file diff --git a/frontend/src/api/google/rpc/status.proto b/frontend/src/api/google/rpc/status.proto new file mode 100644 index 00000000..923e1693 --- /dev/null +++ b/frontend/src/api/google/rpc/status.proto @@ -0,0 +1,49 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.rpc; + +import "google/protobuf/any.proto"; + +option cc_enable_arenas = true; +option go_package = "google.golang.org/genproto/googleapis/rpc/status;status"; +option java_multiple_files = true; +option java_outer_classname = "StatusProto"; +option java_package = "com.google.rpc"; +option objc_class_prefix = "RPC"; + +// The `Status` type defines a logical error model that is suitable for +// different programming environments, including REST APIs and RPC APIs. It is +// used by [gRPC](https://github.com/grpc). Each `Status` message contains +// three pieces of data: error code, error message, and error details. +// +// You can find out more about this error model and how to work with it in the +// [API Design Guide](https://cloud.google.com/apis/design/errors). +message Status { + // The status code, which should be an enum value of + // [google.rpc.Code][google.rpc.Code]. + int32 code = 1; + + // A developer-facing error message, which should be in English. Any + // user-facing error message should be localized and sent in the + // [google.rpc.Status.details][google.rpc.Status.details] field, or localized + // by the client. + string message = 2; + + // A list of messages that carry the error details. There is a common set of + // message types for APIs to use. + repeated google.protobuf.Any details = 3; +} diff --git a/frontend/src/api/grpc.ts b/frontend/src/api/grpc.ts new file mode 100644 index 00000000..01a9c4b6 --- /dev/null +++ b/frontend/src/api/grpc.ts @@ -0,0 +1,251 @@ +// Copyright (c) 2024 Sidero Labs, Inc. +// +// Use of this software is governed by the Business Source License +// included in the LICENSE file. + +import { + ResourceService as WrappedResourceService, + GetRequest, + ListRequest, + CreateRequest, + UpdateRequest, + DeleteRequest, + CreateResponse, + UpdateResponse, + DeleteResponse, + WatchRequest, + WatchResponse, +} from '@/api/omni/resources/resources.pb'; +import { Metadata } from '@/api/v1alpha1/resource.pb'; +import { Metadata as TalosMetadata } from "@/api/common/common.pb"; +import { ref, Ref } from 'vue'; +import { Code } from '@/api/google/rpc/code.pb'; +import { fetchOption, NotifyStreamEntityArrival, setCommonFetchOptions } from '@/api/fetch.pb'; +import { withAbortController, withPathPrefix } from '@/api/options'; + +export const initState = () => { + setCommonFetchOptions( + withPathPrefix("/api") + ); +} + +export type RequestContext = { + cluster: string, + nodes?: string[], +} + +export interface StreamingRequest { + (req: T, callback: NotifyStreamEntityArrival, ...options: fetchOption[]): Promise +} + +export const subscribe = (method: StreamingRequest, params: T, handler: NotifyStreamEntityArrival, options?: fetchOption[], onStart?: () => void, onError?: (e: Error) => void, onFinish?: () => void) => { + return new Stream(method, params, handler, options, onStart, onError, onFinish); +} + +const delay = (value: number): Promise => { + return new Promise((resolve: (value: void | PromiseLike) => void) => { + setTimeout(resolve, value) + }); +} + +export class Stream { + private stopped: boolean = false; + private controller?: AbortController; + + public err: Ref = ref(null); + + constructor(method: StreamingRequest, params: T, handler: NotifyStreamEntityArrival, options?: fetchOption[], onStart?: () => void, onError?: (e: Error) => void, onFinish?: () => void) { + const opts = options || []; + let currentDelay = 0; + let retryCount = 0; + + const run = async () => { + if (this.stopped) { + return; + } + + try { + this.err.value = null; + this.controller = new AbortController(); + + const withAbort = opts.concat([withAbortController(this.controller)]); + + if (onStart) + onStart(); + + const callback = (resp: R) => { + if (!resp) { + return; + } + + // reset backoff delay if anything got received from the stream + retryCount = 0; + + const err = resp as { metadata?: TalosMetadata, error?: { code: Code, message?: string } } + + if (err.metadata?.error || err.error) { + if (err.error?.code !== Code.CANCELLED && err.error?.code !== Code.INTERNAL) { + this.stopped = true; + } + + const e = new Error(err.metadata?.error ?? err.error?.message); + + if (onError) { + onError(e); + } else { + console.error("stream error", e) + } + + return + } + + handler(resp); + } + + await method(params, callback, ...withAbort); + } catch (e) { + if (this.stopped) { + return; + } + + if (onError) { + onError(e.error ?? e); + } + + console.error("watch failed", e); + throw e.error ? e.error : new Error(e.toString()); + } + } + + (async () => { + while (!this.stopped) { + try { + if (currentDelay > 0) { + await delay(currentDelay); + } + + await run(); + + // break the loop if run ended without any errors + break; + } catch (e) { + if (e.code === Code.INVALID_ARGUMENT || e.code === Code.PERMISSION_DENIED) { + return; + } + + // max delay 10 seconds + currentDelay = Math.min(((Math.pow(2, retryCount) - 1) / 2) * 1000, 10000); + // half delay jitter + currentDelay = currentDelay / 2 + Math.random() * currentDelay / 2 + + retryCount++; + } + } + + if (onFinish) { + onFinish(); + } + })(); + } + + public shutdown() { + this.stopped = true; + this.controller?.abort(); + } +} + +export type Resource = { + metadata: Metadata & { name?: string }, + spec: T, + status?: S +} + +export type ResourceTyped = Resource & { + spec: T, +} + +// define a wrapper for grpc resource service. +export class ResourceService { + static async Get(request: GetRequest, ...options: fetchOption[]): Promise { + const res = await WrappedResourceService.Get(request, ...options); + + checkError(res); + + return JSON.parse(res.body || "{}"); + } + + static async List(request: ListRequest, ...options: fetchOption[]): Promise { + const res = await WrappedResourceService.List(request, ...options); + + checkError(res); + + const results:T[] = []; + + for (const raw of res.items || []) { + results.push(JSON.parse(raw)); + } + + return results; + } + + static async Create(resource: ResourceTyped, ...options: fetchOption[]): Promise { + const request: CreateRequest = { + resource: { + metadata: resource.metadata, + spec: JSON.stringify(resource.spec), + } + } + + const res = await WrappedResourceService.Create(request, ...options); + + checkError(res); + + return res; + } + + static async Update(resource: ResourceTyped, currentVersion?: string | number, ...options: fetchOption[]): Promise { + resource.metadata.version = (resource.metadata.version || 0)?.toString(); + + const request: UpdateRequest = { + resource: { + metadata: resource.metadata, + spec: JSON.stringify(resource.spec), + }, + currentVersion: currentVersion?.toString() || resource.metadata.version, + } + + const res = checkError(await WrappedResourceService.Update(request, ...options)); + + return res; + } + + static async Delete(request: DeleteRequest, ...options: fetchOption[]): Promise { + return checkError(await WrappedResourceService.Delete(request, ...options)); + } + + static async Teardown(request: DeleteRequest, ...options: fetchOption[]): Promise { + return checkError(await WrappedResourceService.Teardown(request, ...options)); + } + + static async Watch(request: WatchRequest, callback: NotifyStreamEntityArrival, options?: fetchOption[], onStart?: () => void, onError?: (e: Error) => void): Promise> { + return subscribe(WrappedResourceService.Watch, request, callback, options, onStart, onError); + } +} + +export class RequestError extends Error { + public code: number = Code.UNKNOWN; + + constructor(response: any) { + super(response["message"] || response["code"]) + + this.code = response["code"]; + } +} + +export const checkError = (response: {code?: Code} & T): T => { + if(response.code != null) { + throw new RequestError(response); + } + + return response; +} diff --git a/frontend/src/api/omni/auth/auth.pb.ts b/frontend/src/api/omni/auth/auth.pb.ts new file mode 100644 index 00000000..19f796a2 --- /dev/null +++ b/frontend/src/api/omni/auth/auth.pb.ts @@ -0,0 +1,48 @@ +/* eslint-disable */ +// @ts-nocheck +/* +* This file is a generated Typescript file for GRPC Gateway, DO NOT MODIFY +*/ + +import * as fm from "../../fetch.pb" +import * as GoogleProtobufEmpty from "../../google/protobuf/empty.pb" +export type PublicKey = { + pgp_data?: Uint8Array + webauthn_data?: Uint8Array +} + +export type Identity = { + email?: string +} + +export type RegisterPublicKeyRequest = { + public_key?: PublicKey + identity?: Identity + role?: string + skip_user_role?: boolean +} + +export type RegisterPublicKeyResponse = { + login_url?: string + public_key_id?: string +} + +export type AwaitPublicKeyConfirmationRequest = { + public_key_id?: string +} + +export type ConfirmPublicKeyRequest = { + public_key_id?: string +} + +export class AuthService { + static RegisterPublicKey(req: RegisterPublicKeyRequest, ...options: fm.fetchOption[]): Promise { + return fm.fetchReq("POST", `/auth.AuthService/RegisterPublicKey`, req, ...options) + } + static AwaitPublicKeyConfirmation(req: AwaitPublicKeyConfirmationRequest, ...options: fm.fetchOption[]): Promise { + return fm.fetchReq("POST", `/auth.AuthService/AwaitPublicKeyConfirmation`, req, ...options) + } + static ConfirmPublicKey(req: ConfirmPublicKeyRequest, ...options: fm.fetchOption[]): Promise { + return fm.fetchReq("POST", `/auth.AuthService/ConfirmPublicKey`, req, ...options) + } +} \ No newline at end of file diff --git a/frontend/src/api/omni/auth/auth.proto b/frontend/src/api/omni/auth/auth.proto new file mode 100644 index 00000000..35735d29 --- /dev/null +++ b/frontend/src/api/omni/auth/auth.proto @@ -0,0 +1,45 @@ +syntax = "proto3"; +package auth; + +option go_package = "github.com/siderolabs/go-api-signature/api/auth"; + +import "google/protobuf/empty.proto"; + +message PublicKey { + bytes pgp_data = 1; + bytes webauthn_data = 2; +} + +message Identity { + string email = 1; +} + +message RegisterPublicKeyRequest { + PublicKey public_key = 1; + Identity identity = 2; + reserved 3; + reserved 4; + // The role of the public key. When skip_user_role is true, this field is ignored. + string role = 5; + // If true, the role field will be used to determine the role of the public key. + bool skip_user_role = 6; +} + +message RegisterPublicKeyResponse { + string login_url = 1; + string public_key_id = 2; +} + +message AwaitPublicKeyConfirmationRequest { + string public_key_id = 1; +} + +message ConfirmPublicKeyRequest { + string public_key_id = 1; +} + +service AuthService { + rpc RegisterPublicKey(RegisterPublicKeyRequest) returns (RegisterPublicKeyResponse); + rpc AwaitPublicKeyConfirmation(AwaitPublicKeyConfirmationRequest) returns (google.protobuf.Empty); + rpc ConfirmPublicKey(ConfirmPublicKeyRequest) returns (google.protobuf.Empty); +} diff --git a/frontend/src/api/omni/config/context.pb.ts b/frontend/src/api/omni/config/context.pb.ts new file mode 100644 index 00000000..3f587cce --- /dev/null +++ b/frontend/src/api/omni/config/context.pb.ts @@ -0,0 +1,25 @@ +/* eslint-disable */ +// @ts-nocheck +/* +* This file is a generated Typescript file for GRPC Gateway, DO NOT MODIFY +*/ + +import * as fm from "../../fetch.pb" +export type Context = { + name?: string + cluster?: string +} + +export type ListContextsRequest = { +} + +export type ListContextsResponse = { + current?: string + contexts?: Context[] +} + +export class ContextService { + static List(req: ListContextsRequest, ...options: fm.fetchOption[]): Promise { + return fm.fetchReq("POST", `/config.ContextService/List`, req, ...options) + } +} \ No newline at end of file diff --git a/frontend/src/api/omni/management/management.pb.ts b/frontend/src/api/omni/management/management.pb.ts new file mode 100644 index 00000000..899e6933 --- /dev/null +++ b/frontend/src/api/omni/management/management.pb.ts @@ -0,0 +1,160 @@ +/* eslint-disable */ +// @ts-nocheck +/* +* This file is a generated Typescript file for GRPC Gateway, DO NOT MODIFY +*/ + +import * as CommonCommon from "../../common/common.pb" +import * as fm from "../../fetch.pb" +import * as GoogleProtobufDuration from "../../google/protobuf/duration.pb" +import * as GoogleProtobufEmpty from "../../google/protobuf/empty.pb" +import * as GoogleProtobufTimestamp from "../../google/protobuf/timestamp.pb" + +export enum KubernetesSyncManifestResponseResponseType { + UNKNOWN = 0, + MANIFEST = 1, + ROLLOUT = 2, +} + +export type KubeconfigResponse = { + kubeconfig?: Uint8Array +} + +export type TalosconfigResponse = { + talosconfig?: Uint8Array +} + +export type OmniconfigResponse = { + omniconfig?: Uint8Array +} + +export type MachineLogsRequest = { + machine_id?: string + follow?: boolean + tail_lines?: number +} + +export type ValidateConfigRequest = { + config?: string +} + +export type TalosconfigRequest = { + admin?: boolean +} + +export type CreateServiceAccountRequest = { + armored_pgp_public_key?: string + use_user_role?: boolean + role?: string +} + +export type CreateServiceAccountResponse = { + public_key_id?: string +} + +export type RenewServiceAccountRequest = { + name?: string + armored_pgp_public_key?: string +} + +export type RenewServiceAccountResponse = { + public_key_id?: string +} + +export type DestroyServiceAccountRequest = { + name?: string +} + +export type ListServiceAccountsResponseServiceAccountPgpPublicKey = { + id?: string + armored?: string + expiration?: GoogleProtobufTimestamp.Timestamp +} + +export type ListServiceAccountsResponseServiceAccount = { + name?: string + pgp_public_keys?: ListServiceAccountsResponseServiceAccountPgpPublicKey[] + role?: string +} + +export type ListServiceAccountsResponse = { + service_accounts?: ListServiceAccountsResponseServiceAccount[] +} + +export type KubeconfigRequest = { + service_account?: boolean + service_account_ttl?: GoogleProtobufDuration.Duration + service_account_user?: string + service_account_groups?: string[] +} + +export type KubernetesUpgradePreChecksRequest = { + new_version?: string +} + +export type KubernetesUpgradePreChecksResponse = { + ok?: boolean + reason?: string +} + +export type KubernetesSyncManifestRequest = { + dry_run?: boolean +} + +export type KubernetesSyncManifestResponse = { + response_type?: KubernetesSyncManifestResponseResponseType + path?: string + object?: Uint8Array + diff?: string + skipped?: boolean +} + +export type CreateSchematicRequest = { + extensions?: string[] + extra_kernel_args?: string[] + meta_values?: {[key: number]: string} +} + +export type CreateSchematicResponse = { + schematic_id?: string + pxe_url?: string +} + +export class ManagementService { + static Kubeconfig(req: KubeconfigRequest, ...options: fm.fetchOption[]): Promise { + return fm.fetchReq("POST", `/management.ManagementService/Kubeconfig`, req, ...options) + } + static Talosconfig(req: TalosconfigRequest, ...options: fm.fetchOption[]): Promise { + return fm.fetchReq("POST", `/management.ManagementService/Talosconfig`, req, ...options) + } + static Omniconfig(req: GoogleProtobufEmpty.Empty, ...options: fm.fetchOption[]): Promise { + return fm.fetchReq("POST", `/management.ManagementService/Omniconfig`, req, ...options) + } + static MachineLogs(req: MachineLogsRequest, entityNotifier?: fm.NotifyStreamEntityArrival, ...options: fm.fetchOption[]): Promise { + return fm.fetchStreamingRequest("POST", `/management.ManagementService/MachineLogs`, req, entityNotifier, ...options) + } + static ValidateConfig(req: ValidateConfigRequest, ...options: fm.fetchOption[]): Promise { + return fm.fetchReq("POST", `/management.ManagementService/ValidateConfig`, req, ...options) + } + static CreateServiceAccount(req: CreateServiceAccountRequest, ...options: fm.fetchOption[]): Promise { + return fm.fetchReq("POST", `/management.ManagementService/CreateServiceAccount`, req, ...options) + } + static RenewServiceAccount(req: RenewServiceAccountRequest, ...options: fm.fetchOption[]): Promise { + return fm.fetchReq("POST", `/management.ManagementService/RenewServiceAccount`, req, ...options) + } + static ListServiceAccounts(req: GoogleProtobufEmpty.Empty, ...options: fm.fetchOption[]): Promise { + return fm.fetchReq("POST", `/management.ManagementService/ListServiceAccounts`, req, ...options) + } + static DestroyServiceAccount(req: DestroyServiceAccountRequest, ...options: fm.fetchOption[]): Promise { + return fm.fetchReq("POST", `/management.ManagementService/DestroyServiceAccount`, req, ...options) + } + static KubernetesUpgradePreChecks(req: KubernetesUpgradePreChecksRequest, ...options: fm.fetchOption[]): Promise { + return fm.fetchReq("POST", `/management.ManagementService/KubernetesUpgradePreChecks`, req, ...options) + } + static KubernetesSyncManifests(req: KubernetesSyncManifestRequest, entityNotifier?: fm.NotifyStreamEntityArrival, ...options: fm.fetchOption[]): Promise { + return fm.fetchStreamingRequest("POST", `/management.ManagementService/KubernetesSyncManifests`, req, entityNotifier, ...options) + } + static CreateSchematic(req: CreateSchematicRequest, ...options: fm.fetchOption[]): Promise { + return fm.fetchReq("POST", `/management.ManagementService/CreateSchematic`, req, ...options) + } +} \ No newline at end of file diff --git a/frontend/src/api/omni/oidc/oidc.pb.ts b/frontend/src/api/omni/oidc/oidc.pb.ts new file mode 100644 index 00000000..1bb9bb2d --- /dev/null +++ b/frontend/src/api/omni/oidc/oidc.pb.ts @@ -0,0 +1,20 @@ +/* eslint-disable */ +// @ts-nocheck +/* +* This file is a generated Typescript file for GRPC Gateway, DO NOT MODIFY +*/ + +import * as fm from "../../fetch.pb" +export type AuthenticateRequest = { + auth_request_id?: string +} + +export type AuthenticateResponse = { + redirect_url?: string +} + +export class OIDCService { + static Authenticate(req: AuthenticateRequest, ...options: fm.fetchOption[]): Promise { + return fm.fetchReq("POST", `/oidc.OIDCService/Authenticate`, req, ...options) + } +} \ No newline at end of file diff --git a/frontend/src/api/omni/resources/resources.pb.ts b/frontend/src/api/omni/resources/resources.pb.ts new file mode 100644 index 00000000..8787c585 --- /dev/null +++ b/frontend/src/api/omni/resources/resources.pb.ts @@ -0,0 +1,119 @@ +/* eslint-disable */ +// @ts-nocheck +/* +* This file is a generated Typescript file for GRPC Gateway, DO NOT MODIFY +*/ + +import * as fm from "../../fetch.pb" +import * as CosiResourceResource from "../../v1alpha1/resource.pb" + +export enum EventType { + UNKNOWN = 0, + CREATED = 1, + UPDATED = 2, + DESTROYED = 3, + BOOTSTRAPPED = 4, +} + +export type Resource = { + metadata?: CosiResourceResource.Metadata + spec?: string +} + +export type GetRequest = { + namespace?: string + type?: string + id?: string +} + +export type GetResponse = { + body?: string +} + +export type ListRequest = { + namespace?: string + type?: string + offset?: number + limit?: number + sort_by_field?: string + sort_descending?: boolean + search_for?: string[] +} + +export type ListResponse = { + items?: string[] + total?: number +} + +export type Event = { + resource?: string + old?: string + event_type?: EventType +} + +export type WatchRequest = { + namespace?: string + type?: string + id?: string + tail_events?: number + offset?: number + limit?: number + sort_by_field?: string + sort_descending?: boolean + search_for?: string[] +} + +export type WatchResponse = { + event?: Event + total?: number + sort_field_data?: string + sort_descending?: boolean +} + +export type CreateRequest = { + resource?: Resource +} + +export type CreateResponse = { +} + +export type UpdateRequest = { + currentVersion?: string + resource?: Resource +} + +export type UpdateResponse = { +} + +export type DeleteRequest = { + namespace?: string + type?: string + id?: string +} + +export type DeleteResponse = { +} + +export class ResourceService { + static Get(req: GetRequest, ...options: fm.fetchOption[]): Promise { + return fm.fetchReq("POST", `/omni.resources.ResourceService/Get`, req, ...options) + } + static List(req: ListRequest, ...options: fm.fetchOption[]): Promise { + return fm.fetchReq("POST", `/omni.resources.ResourceService/List`, req, ...options) + } + static Create(req: CreateRequest, ...options: fm.fetchOption[]): Promise { + return fm.fetchReq("POST", `/omni.resources.ResourceService/Create`, req, ...options) + } + static Update(req: UpdateRequest, ...options: fm.fetchOption[]): Promise { + return fm.fetchReq("POST", `/omni.resources.ResourceService/Update`, req, ...options) + } + static Delete(req: DeleteRequest, ...options: fm.fetchOption[]): Promise { + return fm.fetchReq("POST", `/omni.resources.ResourceService/Delete`, req, ...options) + } + static Teardown(req: DeleteRequest, ...options: fm.fetchOption[]): Promise { + return fm.fetchReq("POST", `/omni.resources.ResourceService/Teardown`, req, ...options) + } + static Watch(req: WatchRequest, entityNotifier?: fm.NotifyStreamEntityArrival, ...options: fm.fetchOption[]): Promise { + return fm.fetchStreamingRequest("POST", `/omni.resources.ResourceService/Watch`, req, entityNotifier, ...options) + } +} \ No newline at end of file diff --git a/frontend/src/api/omni/specs/auth.pb.ts b/frontend/src/api/omni/specs/auth.pb.ts new file mode 100644 index 00000000..4dd1cd08 --- /dev/null +++ b/frontend/src/api/omni/specs/auth.pb.ts @@ -0,0 +1,134 @@ +/* eslint-disable */ +// @ts-nocheck +/* +* This file is a generated Typescript file for GRPC Gateway, DO NOT MODIFY +*/ + +import * as GoogleProtobufTimestamp from "../../google/protobuf/timestamp.pb" +export type AuthConfigSpecAuth0 = { + enabled?: boolean + domain?: string + client_id?: string +} + +export type AuthConfigSpecWebauthn = { + enabled?: boolean + required?: boolean +} + +export type AuthConfigSpecSAML = { + enabled?: boolean + url?: string + metadata?: string + label_rules?: {[key: string]: string} +} + +export type AuthConfigSpec = { + auth0?: AuthConfigSpecAuth0 + webauthn?: AuthConfigSpecWebauthn + suspended?: boolean + saml?: AuthConfigSpecSAML +} + +export type SAMLAssertionSpec = { + data?: Uint8Array + email?: string + used?: boolean +} + +export type UserSpec = { + scopes?: string[] + role?: string +} + +export type IdentitySpec = { + user_id?: string +} + +export type Identity = { + email?: string +} + +export type PublicKeySpec = { + public_key?: Uint8Array + scopes?: string[] + expiration?: GoogleProtobufTimestamp.Timestamp + confirmed?: boolean + identity?: Identity + role?: string +} + +export type AccessPolicyUserGroupUser = { + name?: string + match?: string + label_selectors?: string[] +} + +export type AccessPolicyUserGroup = { + users?: AccessPolicyUserGroupUser[] +} + +export type AccessPolicyClusterGroupCluster = { + name?: string + match?: string +} + +export type AccessPolicyClusterGroup = { + clusters?: AccessPolicyClusterGroupCluster[] +} + +export type AccessPolicyRuleKubernetesImpersonate = { + groups?: string[] +} + +export type AccessPolicyRuleKubernetes = { + impersonate?: AccessPolicyRuleKubernetesImpersonate +} + +export type AccessPolicyRule = { + users?: string[] + clusters?: string[] + kubernetes?: AccessPolicyRuleKubernetes + role?: string +} + +export type AccessPolicyTestExpectedKubernetesImpersonate = { + groups?: string[] +} + +export type AccessPolicyTestExpectedKubernetes = { + impersonate?: AccessPolicyTestExpectedKubernetesImpersonate +} + +export type AccessPolicyTestExpected = { + kubernetes?: AccessPolicyTestExpectedKubernetes + role?: string +} + +export type AccessPolicyTestUser = { + name?: string + labels?: {[key: string]: string} +} + +export type AccessPolicyTestCluster = { + name?: string +} + +export type AccessPolicyTest = { + name?: string + user?: AccessPolicyTestUser + cluster?: AccessPolicyTestCluster + expected?: AccessPolicyTestExpected +} + +export type AccessPolicySpec = { + user_groups?: {[key: string]: AccessPolicyUserGroup} + cluster_groups?: {[key: string]: AccessPolicyClusterGroup} + rules?: AccessPolicyRule[] + tests?: AccessPolicyTest[] +} + +export type SAMLLabelRuleSpec = { + match_labels?: string[] + assign_role_on_registration?: string +} \ No newline at end of file diff --git a/frontend/src/api/omni/specs/ephemeral.pb.ts b/frontend/src/api/omni/specs/ephemeral.pb.ts new file mode 100644 index 00000000..70f85462 --- /dev/null +++ b/frontend/src/api/omni/specs/ephemeral.pb.ts @@ -0,0 +1,13 @@ +/* eslint-disable */ +// @ts-nocheck +/* +* This file is a generated Typescript file for GRPC Gateway, DO NOT MODIFY +*/ + +import * as SpecsOmni from "./omni.pb" +import * as SpecsSiderolink from "./siderolink.pb" +export type MachineStatusLinkSpec = { + message_status?: SpecsOmni.MachineStatusSpec + siderolink_counter?: SpecsSiderolink.SiderolinkCounterSpec + machine_created_at?: string +} \ No newline at end of file diff --git a/frontend/src/api/omni/specs/omni.pb.ts b/frontend/src/api/omni/specs/omni.pb.ts new file mode 100644 index 00000000..b887cee8 --- /dev/null +++ b/frontend/src/api/omni/specs/omni.pb.ts @@ -0,0 +1,622 @@ +/* eslint-disable */ +// @ts-nocheck +/* +* This file is a generated Typescript file for GRPC Gateway, DO NOT MODIFY +*/ + +import * as GoogleProtobufDuration from "../../google/protobuf/duration.pb" +import * as GoogleProtobufTimestamp from "../../google/protobuf/timestamp.pb" +import * as MachineMachine from "../../talos/machine/machine.pb" + +type Absent = { [k in Exclude]?: undefined }; +type OneOf = + | { [k in keyof T]?: undefined } + | ( + keyof T extends infer K ? + (K extends string & keyof T ? { [k in K]: T[K] } & Absent + : never) + : never); + +export enum ConfigApplyStatus { + UNKNOWN = 0, + PENDING = 1, + APPLIED = 2, + FAILED = 3, +} + +export enum MachineSetPhase { + Unknown = 0, + ScalingUp = 1, + ScalingDown = 2, + Running = 3, + Destroying = 4, + Failed = 5, + Reconfiguring = 6, +} + +export enum ConditionType { + UnknownCondition = 0, + Etcd = 1, + WireguardConnection = 2, +} + +export enum MachineStatusSpecRole { + NONE = 0, + CONTROL_PLANE = 1, + WORKER = 2, +} + +export enum EtcdBackupStatusSpecStatus { + Unknown = 0, + Ok = 1, + Error = 2, + Running = 3, +} + +export enum ClusterMachineStatusSpecStage { + UNKNOWN = 0, + BOOTING = 1, + INSTALLING = 2, + UPGRADING = 6, + CONFIGURING = 3, + RUNNING = 4, + REBOOTING = 7, + SHUTTING_DOWN = 8, + BEFORE_DESTROY = 9, + DESTROYING = 5, +} + +export enum ClusterStatusSpecPhase { + UNKNOWN = 0, + SCALING_UP = 1, + SCALING_DOWN = 2, + RUNNING = 3, + DESTROYING = 4, +} + +export enum MachineSetSpecUpdateStrategy { + Unset = 0, + Rolling = 1, +} + +export enum MachineSetSpecMachineClassAllocationType { + Static = 0, + Unlimited = 1, +} + +export enum TalosUpgradeStatusSpecPhase { + Unknown = 0, + Upgrading = 1, + Done = 2, + Failed = 3, + Reverting = 4, +} + +export enum ControlPlaneStatusSpecConditionStatus { + Unknown = 0, + Ready = 1, + NotReady = 2, +} + +export enum ControlPlaneStatusSpecConditionSeverity { + Info = 0, + Warning = 1, + Error = 2, +} + +export enum KubernetesUpgradeStatusSpecPhase { + Unknown = 0, + Upgrading = 1, + Done = 2, + Failed = 3, + Reverting = 4, +} + +export enum SchematicConfigurationSpecTarget { + Unknown = 0, + ClusterMachine = 1, + MachineSet = 2, + Cluster = 3, +} + +export type MachineSpec = { + management_address?: string + connected?: boolean +} + +export type MachineStatusSpecHardwareStatusProcessor = { + core_count?: number + thread_count?: number + frequency?: number + description?: string + manufacturer?: string +} + +export type MachineStatusSpecHardwareStatusMemoryModule = { + size_mb?: number + description?: string +} + +export type MachineStatusSpecHardwareStatusBlockDevice = { + size?: string + model?: string + linux_name?: string + name?: string + serial?: string + uuid?: string + wwid?: string + type?: string + bus_path?: string + system_disk?: boolean +} + +export type MachineStatusSpecHardwareStatus = { + processors?: MachineStatusSpecHardwareStatusProcessor[] + memory_modules?: MachineStatusSpecHardwareStatusMemoryModule[] + blockdevices?: MachineStatusSpecHardwareStatusBlockDevice[] + arch?: string +} + +export type MachineStatusSpecNetworkStatusNetworkLinkStatus = { + linux_name?: string + hardware_address?: string + speed_mbps?: number + link_up?: boolean + description?: string +} + +export type MachineStatusSpecNetworkStatus = { + hostname?: string + domainname?: string + addresses?: string[] + default_gateways?: string[] + network_links?: MachineStatusSpecNetworkStatusNetworkLinkStatus[] +} + +export type MachineStatusSpecPlatformMetadata = { + platform?: string + hostname?: string + region?: string + zone?: string + instance_type?: string + instance_id?: string + provider_id?: string + spot?: boolean +} + +export type MachineStatusSpecSchematic = { + id?: string + invalid?: boolean +} + +export type MachineStatusSpec = { + talos_version?: string + hardware?: MachineStatusSpecHardwareStatus + network?: MachineStatusSpecNetworkStatus + last_error?: string + management_address?: string + connected?: boolean + maintenance?: boolean + cluster?: string + role?: MachineStatusSpecRole + platform_metadata?: MachineStatusSpecPlatformMetadata + image_labels?: {[key: string]: string} + schematic?: MachineStatusSpecSchematic +} + +export type TalosConfigSpec = { + ca?: string + crt?: string + key?: string +} + +export type ClusterSpecFeatures = { + enable_workload_proxy?: boolean + disk_encryption?: boolean +} + +export type ClusterSpec = { + install_image?: string + kubernetes_version?: string + talos_version?: string + features?: ClusterSpecFeatures + backup_configuration?: EtcdBackupConf +} + +export type EtcdBackupConf = { + interval?: GoogleProtobufDuration.Duration + enabled?: boolean +} + +export type EtcdBackupEncryptionSpec = { + encryption_key?: Uint8Array +} + +export type EtcdBackupHeader = { + version?: string +} + +export type EtcdBackupSpec = { + created_at?: GoogleProtobufTimestamp.Timestamp + snapshot?: string + size?: string +} + +export type BackupDataSpec = { + interval?: GoogleProtobufDuration.Duration + cluster_uuid?: string + encryption_key?: Uint8Array + aes_cbc_encryption_secret?: string + secretbox_encryption_secret?: string +} + +export type EtcdBackupS3ConfSpec = { + bucket?: string + region?: string + endpoint?: string + access_key_id?: string + secret_access_key?: string + session_token?: string +} + +export type EtcdBackupStatusSpec = { + status?: EtcdBackupStatusSpecStatus + error?: string + last_backup_time?: GoogleProtobufTimestamp.Timestamp + last_backup_attempt?: GoogleProtobufTimestamp.Timestamp +} + +export type EtcdManualBackupSpec = { + backup_at?: GoogleProtobufTimestamp.Timestamp +} + +export type EtcdBackupStoreStatusSpec = { + configuration_name?: string + configuration_error?: string +} + +export type EtcdBackupOverallStatusSpec = { + configuration_name?: string + configuration_error?: string + last_backup_status?: EtcdBackupStatusSpec +} + +export type ClusterMachineSpec = { + kubernetes_version?: string +} + +export type ClusterMachineConfigPatchesSpec = { + patches?: string[] +} + +export type ClusterMachineTalosVersionSpec = { + talos_version?: string + schematic_id?: string +} + +export type ClusterMachineConfigSpec = { + data?: Uint8Array + cluster_machine_version?: string + generation_error?: string +} + +export type RedactedClusterMachineConfigSpec = { + data?: string +} + +export type ClusterMachineIdentitySpec = { + node_identity?: string + etcd_member_id?: string + nodename?: string + node_ips?: string[] +} + +export type ClusterMachineTemplateSpec = { + install_image?: string + kubernetes_version?: string + install_disk?: string + patch?: string +} + +export type ClusterMachineStatusSpec = { + ready?: boolean + stage?: ClusterMachineStatusSpecStage + apid_available?: boolean + config_up_to_date?: boolean + last_config_error?: string + management_address?: string + config_apply_status?: ConfigApplyStatus +} + +export type Machines = { + total?: number + healthy?: number + connected?: number + requested?: number +} + +export type ClusterStatusSpec = { + available?: boolean + machines?: Machines + phase?: ClusterStatusSpecPhase + ready?: boolean + kubernetesAPIReady?: boolean + controlplaneReady?: boolean + has_connected_control_planes?: boolean +} + +export type ClusterUUID = { + uuid?: string +} + +export type ClusterConfigVersionSpec = { + version?: string +} + +export type ClusterMachineConfigStatusSpec = { + cluster_machine_config_version?: string + cluster_machine_version?: string + cluster_machine_config_sha256?: string + last_config_error?: string + talos_version?: string + schematic_id?: string +} + +export type ClusterBootstrapStatusSpec = { + bootstrapped?: boolean +} + +export type ClusterSecretsSpec = { + data?: Uint8Array +} + +export type LoadBalancerConfigSpec = { + bind_port?: string + siderolink_endpoint?: string + endpoints?: string[] +} + +export type LoadBalancerStatusSpec = { + healthy?: boolean + stopped?: boolean +} + +export type KubernetesVersionSpec = { + version?: string +} + +export type TalosVersionSpec = { + version?: string + compatible_kubernetes_versions?: string[] +} + +export type InstallationMediaSpec = { + name?: string + architecture?: string + profile?: string + contentType?: string + src_file_prefix?: string + dest_file_prefix?: string + extension?: string + no_secure_boot?: boolean +} + +export type ConfigPatchSpec = { + data?: string +} + +export type MachineSetSpecMachineClass = { + name?: string + machine_count?: number + allocation_type?: MachineSetSpecMachineClassAllocationType +} + +export type MachineSetSpecBootstrapSpec = { + cluster_uuid?: string + snapshot?: string +} + +export type MachineSetSpecRollingUpdateStrategyConfig = { + max_parallelism?: number +} + +export type MachineSetSpecUpdateStrategyConfig = { + rolling?: MachineSetSpecRollingUpdateStrategyConfig +} + +export type MachineSetSpec = { + update_strategy?: MachineSetSpecUpdateStrategy + machine_class?: MachineSetSpecMachineClass + bootstrap_spec?: MachineSetSpecBootstrapSpec + delete_strategy?: MachineSetSpecUpdateStrategy + update_strategy_config?: MachineSetSpecUpdateStrategyConfig + delete_strategy_config?: MachineSetSpecUpdateStrategyConfig +} + +export type TalosUpgradeStatusSpec = { + phase?: TalosUpgradeStatusSpecPhase + error?: string + step?: string + status?: string + last_upgrade_version?: string + current_upgrade_version?: string + upgrade_versions?: string[] +} + +export type MachineSetStatusSpec = { + phase?: MachineSetPhase + ready?: boolean + error?: string + machines?: Machines + config_hash?: string + machine_class?: MachineSetSpecMachineClass +} + +export type MachineSetNodeSpec = { +} + +export type MachineLabelsSpec = { +} + +export type MachineStatusSnapshotSpec = { + machine_status?: MachineMachine.MachineStatusEvent +} + +export type ControlPlaneStatusSpecCondition = { + type?: ConditionType + reason?: string + status?: ControlPlaneStatusSpecConditionStatus + severity?: ControlPlaneStatusSpecConditionSeverity +} + +export type ControlPlaneStatusSpec = { + conditions?: ControlPlaneStatusSpecCondition[] +} + +export type ClusterEndpointSpec = { + management_addresses?: string[] +} + +export type KubernetesStatusSpecNodeStatus = { + nodename?: string + kubelet_version?: string + ready?: boolean +} + +export type KubernetesStatusSpecStaticPodStatus = { + app?: string + version?: string + ready?: boolean +} + +export type KubernetesStatusSpecNodeStaticPods = { + nodename?: string + static_pods?: KubernetesStatusSpecStaticPodStatus[] +} + +export type KubernetesStatusSpec = { + nodes?: KubernetesStatusSpecNodeStatus[] + static_pods?: KubernetesStatusSpecNodeStaticPods[] +} + +export type KubernetesUpgradeStatusSpec = { + phase?: KubernetesUpgradeStatusSpecPhase + error?: string + step?: string + status?: string + last_upgrade_version?: string + current_upgrade_version?: string + upgrade_versions?: string[] +} + +export type KubernetesUpgradeManifestStatusSpec = { + out_of_sync?: number + last_fatal_error?: string +} + +export type DestroyStatusSpec = { + phase?: string +} + + +type BaseOngoingTaskSpec = { + title?: string +} + +export type OngoingTaskSpec = BaseOngoingTaskSpec + & OneOf<{ talos_upgrade: TalosUpgradeStatusSpec; kubernetes_upgrade: KubernetesUpgradeStatusSpec; destroy: DestroyStatusSpec }> + +export type ClusterMachineEncryptionKeySpec = { + data?: Uint8Array +} + +export type ExposedServiceSpec = { + port?: number + label?: string + icon_base64?: string +} + +export type FeaturesConfigSpec = { + enable_workload_proxying?: boolean + etcd_backup_settings?: EtcdBackupSettings +} + +export type EtcdBackupSettings = { + tick_interval?: GoogleProtobufDuration.Duration + min_interval?: GoogleProtobufDuration.Duration + max_interval?: GoogleProtobufDuration.Duration +} + +export type MachineClassSpec = { + match_labels?: string[] +} + +export type MachineConfigGenOptionsSpec = { + install_disk?: string +} + +export type EtcdAuditResultSpec = { + etcd_member_ids?: string[] +} + +export type KubeconfigSpec = { + data?: Uint8Array +} + +export type KubernetesUsageSpecQuantity = { + requests?: number + limits?: number + capacity?: number +} + +export type KubernetesUsageSpecPod = { + count?: number + capacity?: number +} + +export type KubernetesUsageSpec = { + cpu?: KubernetesUsageSpecQuantity + mem?: KubernetesUsageSpecQuantity + storage?: KubernetesUsageSpecQuantity + pods?: KubernetesUsageSpecPod +} + +export type ImagePullRequestSpecNodeImageList = { + node?: string + images?: string[] +} + +export type ImagePullRequestSpec = { + node_image_list?: ImagePullRequestSpecNodeImageList[] +} + +export type ImagePullStatusSpec = { + last_processed_node?: string + last_processed_image?: string + last_processed_error?: string + processed_count?: number + total_count?: number + request_version?: string +} + +export type SchematicSpec = { + extensions?: string[] +} + +export type TalosExtensionsSpecInfo = { + name?: string + author?: string + version?: string + description?: string + ref?: string + digest?: string +} + +export type TalosExtensionsSpec = { + items?: TalosExtensionsSpecInfo[] +} + +export type SchematicConfigurationSpec = { + schematic_id?: string + target?: SchematicConfigurationSpecTarget +} \ No newline at end of file diff --git a/frontend/src/api/omni/specs/siderolink.pb.ts b/frontend/src/api/omni/specs/siderolink.pb.ts new file mode 100644 index 00000000..59b96f1d --- /dev/null +++ b/frontend/src/api/omni/specs/siderolink.pb.ts @@ -0,0 +1,36 @@ +/* eslint-disable */ +// @ts-nocheck +/* +* This file is a generated Typescript file for GRPC Gateway, DO NOT MODIFY +*/ + +import * as GoogleProtobufTimestamp from "../../google/protobuf/timestamp.pb" +export type SiderolinkConfigSpec = { + private_key?: string + public_key?: string + wireguard_endpoint?: string + subnet?: string + server_address?: string + join_token?: string + advertised_endpoint?: string +} + +export type SiderolinkSpec = { + node_subnet?: string + node_public_key?: string + last_endpoint?: string + connected?: boolean +} + +export type SiderolinkCounterSpec = { + bytes_received?: string + bytes_sent?: string + last_alive?: GoogleProtobufTimestamp.Timestamp +} + +export type ConnectionParamsSpec = { + args?: string + api_endpoint?: string + wireguard_endpoint?: string + join_token?: string +} \ No newline at end of file diff --git a/frontend/src/api/omni/specs/system.pb.ts b/frontend/src/api/omni/specs/system.pb.ts new file mode 100644 index 00000000..2188a5c7 --- /dev/null +++ b/frontend/src/api/omni/specs/system.pb.ts @@ -0,0 +1,17 @@ +/* eslint-disable */ +// @ts-nocheck +/* +* This file is a generated Typescript file for GRPC Gateway, DO NOT MODIFY +*/ +export type DBVersionSpec = { + version?: string +} + +export type SysVersionSpec = { + backend_version?: string + instance_name?: string + backend_api_version?: number +} + +export type CertRefreshTickSpec = { +} \ No newline at end of file diff --git a/frontend/src/api/omni/specs/virtual.pb.ts b/frontend/src/api/omni/specs/virtual.pb.ts new file mode 100644 index 00000000..4206b0d3 --- /dev/null +++ b/frontend/src/api/omni/specs/virtual.pb.ts @@ -0,0 +1,35 @@ +/* eslint-disable */ +// @ts-nocheck +/* +* This file is a generated Typescript file for GRPC Gateway, DO NOT MODIFY +*/ +export type CurrentUserSpec = { + identity?: string + role?: string +} + +export type PermissionsSpec = { + can_read_clusters?: boolean + can_create_clusters?: boolean + can_manage_users?: boolean + can_read_machines?: boolean + can_remove_machines?: boolean + can_read_machine_logs?: boolean + can_read_machine_config_patches?: boolean + can_manage_machine_config_patches?: boolean + can_manage_backup_store?: boolean +} + +export type ClusterPermissionsSpec = { + can_add_machines?: boolean + can_remove_machines?: boolean + can_reboot_machines?: boolean + can_update_kubernetes?: boolean + can_download_kubeconfig?: boolean + can_sync_kubernetes_manifests?: boolean + can_update_talos?: boolean + can_download_talosconfig?: boolean + can_read_config_patches?: boolean + can_manage_config_patches?: boolean + can_manage_cluster_features?: boolean +} \ No newline at end of file diff --git a/frontend/src/api/options.ts b/frontend/src/api/options.ts new file mode 100644 index 00000000..926eadad --- /dev/null +++ b/frontend/src/api/options.ts @@ -0,0 +1,97 @@ +// Copyright (c) 2024 Sidero Labs, Inc. +// +// Use of this software is governed by the Business Source License +// included in the LICENSE file. + +import { clusterName } from "@/context"; +import { Runtime } from "./common/omni.pb"; +import { RequestOptions } from "./fetch.pb"; +import { WatchContext } from "./watch"; + +export type GRPCMetadata = Record; + +const runtimeMap: Record = { + [Runtime.Kubernetes]: "Kubernetes", + [Runtime.Talos]: "Talos", + [Runtime.Omni]: "Omni", +}; + +export const withAbortController = (controller: AbortController) => { + return (req: RequestOptions) => { + req.controller = controller; + req.signal = controller.signal; + } +} + +export const withPathPrefix = (prefix: string) => { + return (req: RequestOptions) => { + if (!req.url.startsWith(prefix)) { + req.url = `${prefix}${req.url}`; + } + }; +} + +export const withRuntime = (runtime: Runtime) => { + return (req: RequestOptions) => { + addMetadata(req, {runtime: runtimeMap[runtime]}); + }; +} + +export const withMetadata = (metadata: GRPCMetadata) => { + return (req: RequestOptions) => { + addMetadata(req, metadata); + }; +} + +export const withSelectors = (selectors: string[]) => { + return withMetadata({ + selectors, + }) +} + +export const withContext = (context: WatchContext) => { + return (req: RequestOptions) => { + const md: GRPCMetadata = {}; + + if (context.cluster) { + md.cluster = context.cluster; + } else { + const currentContext = clusterName(); + if (currentContext) { + md.cluster = md.cluster || currentContext; + } + } + + if (context.nodes) { + md.nodes = context.nodes; + } + + addMetadata(req, md); + } +} + +export const withTimeout = (timeout: number) => { + return (req: RequestOptions) => { + if (!req.controller) { + const controller = new AbortController(); + req.signal = controller.signal; + req.controller = controller; + } + + setTimeout(() => { + req.controller?.abort(); + }, timeout); + } +} + +const addMetadata = (req: RequestInit, headers: GRPCMetadata) => { + if (!req.headers) { + req.headers = new Headers(); + } + + const h = req.headers as Headers; + + for (const id in headers) { + h.append(`Grpc-Metadata-${id}`, headers[id].toString()); + } +}; \ No newline at end of file diff --git a/frontend/src/api/resources.ts b/frontend/src/api/resources.ts new file mode 100644 index 00000000..cd796d67 --- /dev/null +++ b/frontend/src/api/resources.ts @@ -0,0 +1,207 @@ +// This Runtime Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +// THIS FILE WAS AUTOMATICALLY GENERATED, PLEASE DO NOT EDIT. + +export const RoleNone = "None"; +export const RoleReader = "Reader"; +export const RoleOperator = "Operator"; +export const RoleAdmin = "Admin"; +export const RedirectQueryParam = "redirect"; +export const AuthFlowQueryParam = "flow"; +export const CLIAuthFlow = "cli"; +export const WorkloadProxyAuthFlow = "workload-proxy"; +export const SignatureHeaderKey = "x-sidero-signature"; +export const TimestampHeaderKey = "x-sidero-timestamp"; +export const PayloadHeaderKey = "x-sidero-payload"; +export const authHeader = "authorization"; +export const authBearerHeaderPrefix = "Bearer "; +export const SignatureVersionV1 = "siderov1"; +export const samlSessionHeader = "saml-session"; +export const DefaultKubernetesVersion = "1.29.1"; +export const ServiceLabelAnnotationKey = "omni-kube-service-exposer.sidero.dev/label"; +export const ServicePortAnnotationKey = "omni-kube-service-exposer.sidero.dev/port"; +export const ServiceIconAnnotationKey = "omni-kube-service-exposer.sidero.dev/icon"; +export const installDiskMinSize = 5e+09; +export const workloadProxyHostPrefix = "p"; +export const workloadProxyPublicKeyIdCookie = "publicKeyId"; +export const workloadProxyPublicKeyIdSignatureBase64Cookie = "publicKeyIdSignatureBase64"; +export const authPublicKeyIDQueryParam = "public-key-id"; +export const DefaultNamespace = "default"; +export const EphemeralNamespace = "ephemeral"; +export const MetricsNamespace = "metrics"; +export const VirtualNamespace = "virtual"; +export const ExternalNamespace = "external"; +export const AccessPolicyType = "AccessPolicies.omni.sidero.dev"; +export const AuthConfigID = "auth-config"; +export const AuthConfigType = "AuthConfigs.omni.sidero.dev"; +export const IdentityType = "Identities.omni.sidero.dev"; +export const SAMLLabelPrefix = "saml.omni.sidero.dev/"; +export const LabelIdentityUserID = "user-id"; +export const LabelIdentityTypeServiceAccount = "type-service-account"; +export const PublicKeyType = "PublicKeys.omni.sidero.dev"; +export const SAMLLabelRuleType = "SAMLLabelRules.omni.sidero.dev"; +export const UserType = "Users.omni.sidero.dev"; +export const KubernetesResourceType = "KubernetesResources.omni.sidero.dev"; +export const MachineLocked = "omni.sidero.dev/locked"; +export const ResourceManagedByClusterTemplates = "omni.sidero.dev/managed-by-cluster-templates"; +export const ConfigPatchName = "name"; +export const ConfigPatchDescription = "description"; +export const EtcdBackupS3ConfID = "etcd-backup-s3-conf"; +export const EtcdBackupS3ConfType = "EtcdBackupS3Configs.omni.sidero.dev"; +export const BackupDataType = "BackupDatas.omni.sidero.dev"; +export const ClusterType = "Clusters.omni.sidero.dev"; +export const ClusterBootstrapStatusType = "ClusterBootstrapStatuses.omni.sidero.dev"; +export const ClusterConfigVersionType = "ClusterConfigVersions.omni.sidero.dev"; +export const ClusterDestroyStatusType = "ClusterDestroyStatuses.omni.sidero.dev"; +export const ClusterEndpointType = "ClusterEndpoints.omni.sidero.dev"; +export const ClusterMachineType = "ClusterMachines.omni.sidero.dev"; +export const ClusterMachineConfigType = "ClusterMachineConfigs.omni.sidero.dev"; +export const ClusterMachineConfigPatchesType = "ClusterMachineConfigPatches.omni.sidero.dev"; +export const ClusterMachineConfigStatusType = "ClusterMachineConfigStatuses.omni.sidero.dev"; +export const ClusterMachineEncryptionKeyType = "ClusterMachineEncryptionKeys.omni.sidero.dev"; +export const ClusterMachineIdentityType = "ClusterMachineIdentities.omni.sidero.dev"; +export const ClusterMachineTalosVersionType = "ClusterMachineTalosVersions.omni.sidero.dev"; +export const ClusterMachineStatusType = "ClusterMachineStatuses.omni.sidero.dev"; +export const ClusterMachineTemplateType = "ClusterMachineTemplates.omni.sidero.dev"; +export const ClusterStatusType = "ClusterStatuses.omni.sidero.dev"; +export const ClusterUUIDType = "ClusterUUIDs.omni.sidero.dev"; +export const ConfigPatchType = "ConfigPatches.omni.sidero.dev"; +export const ControlPlaneStatusType = "ControlPlaneStatuses.omni.sidero.dev"; +export const EtcdBackupType = "EtcdBackups.omni.sidero.dev"; +export const EtcdBackupStoreStatusID = "etcdbackup-store-status"; +export const EtcdBackupStoreStatusType = "EtcdBackupStoreStatuses.omni.sidero.dev"; +export const EtcdBackupEncryptionType = "EtcdBackupEncryptions.omni.sidero.dev"; +export const EtcdBackupOverallStatusID = "etcdbackup-overall-status"; +export const EtcdBackupOverallStatusType = "EtcdBackupOverallStatuses.omni.sidero.dev"; +export const EtcdBackupStatusType = "EtcdBackupStatuses.omni.sidero.dev"; +export const EtcdManualBackupType = "EtcdManualBackups.omni.sidero.dev"; +export const ExposedServiceType = "ExposedServices.omni.sidero.dev"; +export const FeaturesConfigID = "features-config"; +export const FeaturesConfigType = "FeaturesConfigs.omni.sidero.dev"; +export const ImagePullRequestType = "ImagePullRequests.omni.sidero.dev"; +export const ImagePullStatusType = "ImagePullStatuses.omni.sidero.dev"; +export const InstallationMediaType = "InstallationMedias.omni.sidero.dev"; +export const KubernetesStatusType = "KubernetesStatuses.omni.sidero.dev"; +export const KubernetesUpgradeManifestStatusType = "KubernetesUpgradeManifestStatuses.omni.sidero.dev"; +export const KubernetesUpgradeStatusType = "KubernetesUpgradeStatuses.omni.sidero.dev"; +export const KubernetesVersionType = "KubernetesVersions.omni.sidero.dev"; +export const SystemLabelPrefix = "omni.sidero.dev/"; +export const LabelControlPlaneRole = "omni.sidero.dev/role-controlplane"; +export const LabelWorkerRole = "omni.sidero.dev/role-worker"; +export const LabelCluster = "omni.sidero.dev/cluster"; +export const LabelClusterUUID = "omni.sidero.dev/cluster-uuid"; +export const LabelHostname = "omni.sidero.dev/hostname"; +export const LabelMachineSet = "omni.sidero.dev/machine-set"; +export const LabelClusterMachine = "omni.sidero.dev/cluster-machine"; +export const LabelMachine = "omni.sidero.dev/machine"; +export const LabelSystemPatch = "omni.sidero.dev/system-patch"; +export const LabelExposedServiceAlias = "omni.sidero.dev/exposed-service-alias"; +export const MachineStatusLabelConnected = "omni.sidero.dev/connected"; +export const MachineStatusLabelDisconnected = "omni.sidero.dev/disconnected"; +export const MachineStatusLabelInvalidState = "omni.sidero.dev/invalid-state"; +export const MachineStatusLabelReportingEvents = "omni.sidero.dev/reporting-events"; +export const MachineStatusLabelAvailable = "omni.sidero.dev/available"; +export const MachineStatusLabelArch = "omni.sidero.dev/arch"; +export const MachineStatusLabelCPU = "omni.sidero.dev/cpu"; +export const MachineStatusLabelCores = "omni.sidero.dev/cores"; +export const MachineStatusLabelMem = "omni.sidero.dev/mem"; +export const MachineStatusLabelStorage = "omni.sidero.dev/storage"; +export const MachineStatusLabelNet = "omni.sidero.dev/net"; +export const MachineStatusLabelPlatform = "omni.sidero.dev/platform"; +export const MachineStatusLabelRegion = "omni.sidero.dev/region"; +export const MachineStatusLabelZone = "omni.sidero.dev/zone"; +export const MachineStatusLabelInstance = "omni.sidero.dev/instance"; +export const ClusterMachineStatusLabelNodeName = "omni.sidero.dev/node-name"; +export const MachineType = "Machines.omni.sidero.dev"; +export const MachineClassType = "MachineClasses.omni.sidero.dev"; +export const MachineConfigGenOptionsType = "MachineConfigGenOptions.omni.sidero.dev"; +export const MachineLabelsType = "MachineLabels.omni.sidero.dev"; +export const ControlPlanesIDSuffix = "control-planes"; +export const DefaultWorkersIDSuffix = "workers"; +export const MachineSetType = "MachineSets.omni.sidero.dev"; +export const MachineSetDestroyStatusType = "MachineSetDestroyStatuses.omni.sidero.dev"; +export const MachineSetNodeType = "MachineSetNodes.omni.sidero.dev"; +export const MachineSetStatusType = "MachineSetStatuses.omni.sidero.dev"; +export const MachineStatusType = "MachineStatuses.omni.sidero.dev"; +export const MachineStatusLinkType = "MachineStatusLinks.omni.sidero.dev"; +export const MachineStatusSnapshotType = "MachineStatusSnapshots.omni.sidero.dev"; +export const OngoingTaskType = "OngoingTasks.omni.sidero.dev"; +export const RedactedClusterMachineConfigType = "RedactedClusterMachineConfigs.omni.sidero.dev"; +export const SchematicType = "Schematics.omni.sidero.dev"; +export const SchematicConfigurationType = "SchematicConfigurations.omni.sidero.dev"; +export const ClusterSecretsType = "ClusterSecrets.omni.sidero.dev"; +export const TalosExtensionsType = "TalosExtensions.omni.sidero.dev"; +export const TalosUpgradeStatusType = "TalosUpgradeStatuses.omni.sidero.dev"; +export const TalosVersionType = "TalosVersions.omni.sidero.dev"; +export const ConfigType = "Configs.omni.sidero.dev"; +export const ConfigID = "siderolink-config"; +export const ConnectionParamsType = "ConnectionParams.omni.sidero.dev"; +export const SiderolinkResourceType = "Links.omni.sidero.dev"; +export const SiderolinkCounterNamespace = "metrics"; +export const SysVersionType = "SysVersions.system.sidero.dev"; +export const SysVersionID = "current"; +export const ClusterPermissionsType = "ClusterPermissions.omni.sidero.dev"; +export const CurrentUserID = "current"; +export const CurrentUserType = "CurrentUsers.omni.sidero.dev"; +export const KubernetesUsageType = "KubernetesUsages.omni.sidero.dev"; +export const PermissionsID = "permissions"; +export const PermissionsType = "Permissions.omni.sidero.dev"; +export const SecureBoot = "secureboot"; +export const DefaultTalosVersion = "1.6.4"; +export const PatchWeightInstallDisk = 0; +export const PatchBaseWeightCluster = 200; +export const PatchBaseWeightMachineSet = 400; +export const PatchBaseWeightClusterMachine = 400; +export const TalosServiceType = "Services.v1alpha1.talos.dev"; +export const TalosCPUType = "CPUStats.perf.talos.dev"; +export const TalosMemoryType = "MemoryStats.perf.talos.dev"; +export const TalosNodenameType = "Nodenames.kubernetes.talos.dev"; +export const TalosMemberType = "Members.cluster.talos.dev"; +export const TalosNodeAddressType = "NodeAddresses.net.talos.dev"; +export const TalosMountStatusType = "MountStatuses.runtime.talos.dev"; +export const TalosNodenameID = "nodename"; +export const TalosAddressRoutedNoK8s = "routed-no-k8s"; +export const TalosCPUID = "latest"; +export const TalosMemoryID = "latest"; +export const TalosPerfNamespace = "perf"; +export const TalosClusterNamespace = "cluster"; +export const TalosRuntimeNamespace = "runtime"; +export const TalosK8sNamespace = "k8s"; +export const TalosNetworkNamespace = "network"; +export const MetalNetworkPlatformConfig = 10; +export const LabelsMeta = 12; +export const NamespaceType = "Namespaces.meta.cosi.dev"; +export const ResourceDefinitionType = "ResourceDefinitions.meta.cosi.dev"; +export const MetaNamespace = "meta"; + +export const kubernetes = { + service: "services.v1", + pod: "pods.v1", + node: "nodes.v1", + cluster: `clusters`, + machine: `machines`, + sideroServers: "servers", + crd: "customresourcedefinitions.v1.apiextensions.k8s.io", +}; + +export const talos = { + // resources + service: "Services.v1alpha1.talos.dev", + cpu: "CPUStats.perf.talos.dev", + mem: "MemoryStats.perf.talos.dev", + nodename: "Nodenames.kubernetes.talos.dev", + member: "Members.cluster.talos.dev", + nodeaddress: "NodeAddresses.net.talos.dev", + + // well known resource IDs + defaultNodeNameID: "nodename", + + // namespaces + perfNamespace: "perf", + clusterNamespace: "cluster", + runtimeNamespace: "runtime", + k8sNamespace: "k8s", + networkNamespace: "network", +}; diff --git a/frontend/src/api/talos/machine/machine.pb.ts b/frontend/src/api/talos/machine/machine.pb.ts new file mode 100644 index 00000000..caf6b2b9 --- /dev/null +++ b/frontend/src/api/talos/machine/machine.pb.ts @@ -0,0 +1,1029 @@ +/* eslint-disable */ +// @ts-nocheck +/* +* This file is a generated Typescript file for GRPC Gateway, DO NOT MODIFY +*/ + +import * as CommonCommon from "../../common/common.pb" +import * as fm from "../../fetch.pb" +import * as GoogleProtobufAny from "../../google/protobuf/any.pb" +import * as GoogleProtobufDuration from "../../google/protobuf/duration.pb" +import * as GoogleProtobufEmpty from "../../google/protobuf/empty.pb" +import * as GoogleProtobufTimestamp from "../../google/protobuf/timestamp.pb" + +export enum ApplyConfigurationRequestMode { + REBOOT = 0, + AUTO = 1, + NO_REBOOT = 2, + STAGED = 3, + TRY = 4, +} + +export enum RebootRequestMode { + DEFAULT = 0, + POWERCYCLE = 1, +} + +export enum SequenceEventAction { + NOOP = 0, + START = 1, + STOP = 2, +} + +export enum PhaseEventAction { + START = 0, + STOP = 1, +} + +export enum TaskEventAction { + START = 0, + STOP = 1, +} + +export enum ServiceStateEventAction { + INITIALIZED = 0, + PREPARING = 1, + WAITING = 2, + RUNNING = 3, + STOPPING = 4, + FINISHED = 5, + FAILED = 6, + SKIPPED = 7, +} + +export enum MachineStatusEventMachineStage { + UNKNOWN = 0, + BOOTING = 1, + INSTALLING = 2, + MAINTENANCE = 3, + RUNNING = 4, + REBOOTING = 5, + SHUTTING_DOWN = 6, + RESETTING = 7, + UPGRADING = 8, +} + +export enum ListRequestType { + REGULAR = 0, + DIRECTORY = 1, + SYMLINK = 2, +} + +export enum MachineConfigMachineType { + TYPE_UNKNOWN = 0, + TYPE_INIT = 1, + TYPE_CONTROL_PLANE = 2, + TYPE_WORKER = 3, +} + +export type ApplyConfigurationRequest = { + data?: Uint8Array + on_reboot?: boolean + immediate?: boolean + mode?: ApplyConfigurationRequestMode + dry_run?: boolean + try_mode_timeout?: GoogleProtobufDuration.Duration +} + +export type ApplyConfiguration = { + metadata?: CommonCommon.Metadata + warnings?: string[] + mode?: ApplyConfigurationRequestMode + mode_details?: string +} + +export type ApplyConfigurationResponse = { + messages?: ApplyConfiguration[] +} + +export type RebootRequest = { + mode?: RebootRequestMode +} + +export type Reboot = { + metadata?: CommonCommon.Metadata + actor_id?: string +} + +export type RebootResponse = { + messages?: Reboot[] +} + +export type BootstrapRequest = { + recover_etcd?: boolean + recover_skip_hash_check?: boolean +} + +export type Bootstrap = { + metadata?: CommonCommon.Metadata +} + +export type BootstrapResponse = { + messages?: Bootstrap[] +} + +export type SequenceEvent = { + sequence?: string + action?: SequenceEventAction + error?: CommonCommon.Error +} + +export type PhaseEvent = { + phase?: string + action?: PhaseEventAction +} + +export type TaskEvent = { + task?: string + action?: TaskEventAction +} + +export type ServiceStateEvent = { + service?: string + action?: ServiceStateEventAction + message?: string + health?: ServiceHealth +} + +export type RestartEvent = { + cmd?: string +} + +export type ConfigLoadErrorEvent = { + error?: string +} + +export type ConfigValidationErrorEvent = { + error?: string +} + +export type AddressEvent = { + hostname?: string + addresses?: string[] +} + +export type MachineStatusEventMachineStatusUnmetCondition = { + name?: string + reason?: string +} + +export type MachineStatusEventMachineStatus = { + ready?: boolean + unmet_conditions?: MachineStatusEventMachineStatusUnmetCondition[] +} + +export type MachineStatusEvent = { + stage?: MachineStatusEventMachineStage + status?: MachineStatusEventMachineStatus +} + +export type EventsRequest = { + tail_events?: number + tail_id?: string + tail_seconds?: number + with_actor_id?: string +} + +export type Event = { + metadata?: CommonCommon.Metadata + data?: GoogleProtobufAny.Any + id?: string + actor_id?: string +} + +export type ResetPartitionSpec = { + label?: string + wipe?: boolean +} + +export type ResetRequest = { + graceful?: boolean + reboot?: boolean + system_partitions_to_wipe?: ResetPartitionSpec[] +} + +export type Reset = { + metadata?: CommonCommon.Metadata + actor_id?: string +} + +export type ResetResponse = { + messages?: Reset[] +} + +export type Shutdown = { + metadata?: CommonCommon.Metadata + actor_id?: string +} + +export type ShutdownRequest = { + force?: boolean +} + +export type ShutdownResponse = { + messages?: Shutdown[] +} + +export type UpgradeRequest = { + image?: string + preserve?: boolean + stage?: boolean + force?: boolean +} + +export type Upgrade = { + metadata?: CommonCommon.Metadata + ack?: string + actor_id?: string +} + +export type UpgradeResponse = { + messages?: Upgrade[] +} + +export type ServiceList = { + metadata?: CommonCommon.Metadata + services?: ServiceInfo[] +} + +export type ServiceListResponse = { + messages?: ServiceList[] +} + +export type ServiceInfo = { + id?: string + state?: string + events?: ServiceEvents + health?: ServiceHealth +} + +export type ServiceEvents = { + events?: ServiceEvent[] +} + +export type ServiceEvent = { + msg?: string + state?: string + ts?: GoogleProtobufTimestamp.Timestamp +} + +export type ServiceHealth = { + unknown?: boolean + healthy?: boolean + last_message?: string + last_change?: GoogleProtobufTimestamp.Timestamp +} + +export type ServiceStartRequest = { + id?: string +} + +export type ServiceStart = { + metadata?: CommonCommon.Metadata + resp?: string +} + +export type ServiceStartResponse = { + messages?: ServiceStart[] +} + +export type ServiceStopRequest = { + id?: string +} + +export type ServiceStop = { + metadata?: CommonCommon.Metadata + resp?: string +} + +export type ServiceStopResponse = { + messages?: ServiceStop[] +} + +export type ServiceRestartRequest = { + id?: string +} + +export type ServiceRestart = { + metadata?: CommonCommon.Metadata + resp?: string +} + +export type ServiceRestartResponse = { + messages?: ServiceRestart[] +} + +export type CopyRequest = { + root_path?: string +} + +export type ListRequest = { + root?: string + recurse?: boolean + recursion_depth?: number + types?: ListRequestType[] +} + +export type DiskUsageRequest = { + recursion_depth?: number + all?: boolean + threshold?: string + paths?: string[] +} + +export type FileInfo = { + metadata?: CommonCommon.Metadata + name?: string + size?: string + mode?: number + modified?: string + is_dir?: boolean + error?: string + link?: string + relative_name?: string + uid?: number + gid?: number +} + +export type DiskUsageInfo = { + metadata?: CommonCommon.Metadata + name?: string + size?: string + error?: string + relative_name?: string +} + +export type Mounts = { + metadata?: CommonCommon.Metadata + stats?: MountStat[] +} + +export type MountsResponse = { + messages?: Mounts[] +} + +export type MountStat = { + filesystem?: string + size?: string + available?: string + mounted_on?: string +} + +export type Version = { + metadata?: CommonCommon.Metadata + version?: VersionInfo + platform?: PlatformInfo + features?: FeaturesInfo +} + +export type VersionResponse = { + messages?: Version[] +} + +export type VersionInfo = { + tag?: string + sha?: string + built?: string + go_version?: string + os?: string + arch?: string +} + +export type PlatformInfo = { + name?: string + mode?: string +} + +export type FeaturesInfo = { + rbac?: boolean +} + +export type LogsRequest = { + namespace?: string + id?: string + driver?: CommonCommon.ContainerDriver + follow?: boolean + tail_lines?: number +} + +export type ReadRequest = { + path?: string +} + +export type RollbackRequest = { +} + +export type Rollback = { + metadata?: CommonCommon.Metadata +} + +export type RollbackResponse = { + messages?: Rollback[] +} + +export type ContainersRequest = { + namespace?: string + driver?: CommonCommon.ContainerDriver +} + +export type ContainerInfo = { + namespace?: string + id?: string + image?: string + pid?: number + status?: string + pod_id?: string + name?: string +} + +export type Container = { + metadata?: CommonCommon.Metadata + containers?: ContainerInfo[] +} + +export type ContainersResponse = { + messages?: Container[] +} + +export type DmesgRequest = { + follow?: boolean + tail?: boolean +} + +export type ProcessesResponse = { + messages?: Process[] +} + +export type Process = { + metadata?: CommonCommon.Metadata + processes?: ProcessInfo[] +} + +export type ProcessInfo = { + pid?: number + ppid?: number + state?: string + threads?: number + cpu_time?: number + virtual_memory?: string + resident_memory?: string + command?: string + executable?: string + args?: string +} + +export type RestartRequest = { + namespace?: string + id?: string + driver?: CommonCommon.ContainerDriver +} + +export type Restart = { + metadata?: CommonCommon.Metadata +} + +export type RestartResponse = { + messages?: Restart[] +} + +export type StatsRequest = { + namespace?: string + driver?: CommonCommon.ContainerDriver +} + +export type Stats = { + metadata?: CommonCommon.Metadata + stats?: Stat[] +} + +export type StatsResponse = { + messages?: Stats[] +} + +export type Stat = { + namespace?: string + id?: string + memory_usage?: string + cpu_usage?: string + pod_id?: string + name?: string +} + +export type Memory = { + metadata?: CommonCommon.Metadata + meminfo?: MemInfo +} + +export type MemoryResponse = { + messages?: Memory[] +} + +export type MemInfo = { + memtotal?: string + memfree?: string + memavailable?: string + buffers?: string + cached?: string + swapcached?: string + active?: string + inactive?: string + activeanon?: string + inactiveanon?: string + activefile?: string + inactivefile?: string + unevictable?: string + mlocked?: string + swaptotal?: string + swapfree?: string + dirty?: string + writeback?: string + anonpages?: string + mapped?: string + shmem?: string + slab?: string + sreclaimable?: string + sunreclaim?: string + kernelstack?: string + pagetables?: string + nfsunstable?: string + bounce?: string + writebacktmp?: string + commitlimit?: string + committedas?: string + vmalloctotal?: string + vmallocused?: string + vmallocchunk?: string + hardwarecorrupted?: string + anonhugepages?: string + shmemhugepages?: string + shmempmdmapped?: string + cmatotal?: string + cmafree?: string + hugepagestotal?: string + hugepagesfree?: string + hugepagesrsvd?: string + hugepagessurp?: string + hugepagesize?: string + directmap4k?: string + directmap2m?: string + directmap1g?: string +} + +export type HostnameResponse = { + messages?: Hostname[] +} + +export type Hostname = { + metadata?: CommonCommon.Metadata + hostname?: string +} + +export type LoadAvgResponse = { + messages?: LoadAvg[] +} + +export type LoadAvg = { + metadata?: CommonCommon.Metadata + load1?: number + load5?: number + load15?: number +} + +export type SystemStatResponse = { + messages?: SystemStat[] +} + +export type SystemStat = { + metadata?: CommonCommon.Metadata + boot_time?: string + cpu_total?: CPUStat + cpu?: CPUStat[] + irq_total?: string + irq?: string[] + context_switches?: string + process_created?: string + process_running?: string + process_blocked?: string + soft_irq_total?: string + soft_irq?: SoftIRQStat +} + +export type CPUStat = { + user?: number + nice?: number + system?: number + idle?: number + iowait?: number + irq?: number + soft_irq?: number + steal?: number + guest?: number + guest_nice?: number +} + +export type SoftIRQStat = { + hi?: string + timer?: string + net_tx?: string + net_rx?: string + block?: string + block_io_poll?: string + tasklet?: string + sched?: string + hrtimer?: string + rcu?: string +} + +export type CPUInfoResponse = { + messages?: CPUsInfo[] +} + +export type CPUsInfo = { + metadata?: CommonCommon.Metadata + cpu_info?: CPUInfo[] +} + +export type CPUInfo = { + processor?: number + vendor_id?: string + cpu_family?: string + model?: string + model_name?: string + stepping?: string + microcode?: string + cpu_mhz?: number + cache_size?: string + physical_id?: string + siblings?: number + core_id?: string + cpu_cores?: number + apic_id?: string + initial_apic_id?: string + fpu?: string + fpu_exception?: string + cpu_id_level?: number + wp?: string + flags?: string[] + bugs?: string[] + bogo_mips?: number + cl_flush_size?: number + cache_alignment?: number + address_sizes?: string + power_management?: string +} + +export type NetworkDeviceStatsResponse = { + messages?: NetworkDeviceStats[] +} + +export type NetworkDeviceStats = { + metadata?: CommonCommon.Metadata + total?: NetDev + devices?: NetDev[] +} + +export type NetDev = { + name?: string + rx_bytes?: string + rx_packets?: string + rx_errors?: string + rx_dropped?: string + rx_fifo?: string + rx_frame?: string + rx_compressed?: string + rx_multicast?: string + tx_bytes?: string + tx_packets?: string + tx_errors?: string + tx_dropped?: string + tx_fifo?: string + tx_collisions?: string + tx_carrier?: string + tx_compressed?: string +} + +export type DiskStatsResponse = { + messages?: DiskStats[] +} + +export type DiskStats = { + metadata?: CommonCommon.Metadata + total?: DiskStat + devices?: DiskStat[] +} + +export type DiskStat = { + name?: string + read_completed?: string + read_merged?: string + read_sectors?: string + read_time_ms?: string + write_completed?: string + write_merged?: string + write_sectors?: string + write_time_ms?: string + io_in_progress?: string + io_time_ms?: string + io_time_weighted_ms?: string + discard_completed?: string + discard_merged?: string + discard_sectors?: string + discard_time_ms?: string +} + +export type EtcdLeaveClusterRequest = { +} + +export type EtcdLeaveCluster = { + metadata?: CommonCommon.Metadata +} + +export type EtcdLeaveClusterResponse = { + messages?: EtcdLeaveCluster[] +} + +export type EtcdRemoveMemberRequest = { + member?: string +} + +export type EtcdRemoveMember = { + metadata?: CommonCommon.Metadata +} + +export type EtcdRemoveMemberResponse = { + messages?: EtcdRemoveMember[] +} + +export type EtcdForfeitLeadershipRequest = { +} + +export type EtcdForfeitLeadership = { + metadata?: CommonCommon.Metadata + member?: string +} + +export type EtcdForfeitLeadershipResponse = { + messages?: EtcdForfeitLeadership[] +} + +export type EtcdMemberListRequest = { + query_local?: boolean +} + +export type EtcdMember = { + id?: string + hostname?: string + peer_urls?: string[] + client_urls?: string[] + is_learner?: boolean +} + +export type EtcdMembers = { + metadata?: CommonCommon.Metadata + legacy_members?: string[] + members?: EtcdMember[] +} + +export type EtcdMemberListResponse = { + messages?: EtcdMembers[] +} + +export type EtcdSnapshotRequest = { +} + +export type EtcdRecover = { + metadata?: CommonCommon.Metadata +} + +export type EtcdRecoverResponse = { + messages?: EtcdRecover[] +} + +export type RouteConfig = { + network?: string + gateway?: string + metric?: number +} + +export type DHCPOptionsConfig = { + route_metric?: number +} + +export type NetworkDeviceConfig = { + interface?: string + cidr?: string + mtu?: number + dhcp?: boolean + ignore?: boolean + dhcp_options?: DHCPOptionsConfig + routes?: RouteConfig[] +} + +export type NetworkConfig = { + hostname?: string + interfaces?: NetworkDeviceConfig[] +} + +export type InstallConfig = { + install_disk?: string + install_image?: string +} + +export type MachineConfig = { + type?: MachineConfigMachineType + install_config?: InstallConfig + network_config?: NetworkConfig + kubernetes_version?: string +} + +export type ControlPlaneConfig = { + endpoint?: string +} + +export type CNIConfig = { + name?: string + urls?: string[] +} + +export type ClusterNetworkConfig = { + dns_domain?: string + cni_config?: CNIConfig +} + +export type ClusterConfig = { + name?: string + control_plane?: ControlPlaneConfig + cluster_network?: ClusterNetworkConfig + allow_scheduling_on_control_planes?: boolean +} + +export type GenerateConfigurationRequest = { + config_version?: string + cluster_config?: ClusterConfig + machine_config?: MachineConfig + override_time?: GoogleProtobufTimestamp.Timestamp +} + +export type GenerateConfiguration = { + metadata?: CommonCommon.Metadata + data?: Uint8Array[] + talosconfig?: Uint8Array +} + +export type GenerateConfigurationResponse = { + messages?: GenerateConfiguration[] +} + +export type GenerateClientConfigurationRequest = { + roles?: string[] + crt_ttl?: GoogleProtobufDuration.Duration +} + +export type GenerateClientConfiguration = { + metadata?: CommonCommon.Metadata + ca?: Uint8Array + crt?: Uint8Array + key?: Uint8Array + talosconfig?: Uint8Array +} + +export type GenerateClientConfigurationResponse = { + messages?: GenerateClientConfiguration[] +} + +export type PacketCaptureRequest = { + interface?: string + promiscuous?: boolean + snap_len?: number + bpf_filter?: BPFInstruction[] +} + +export type BPFInstruction = { + op?: number + jt?: number + jf?: number + k?: number +} + +export class MachineService { + static ApplyConfiguration(req: ApplyConfigurationRequest, ...options: fm.fetchOption[]): Promise { + return fm.fetchReq("POST", `/machine.MachineService/ApplyConfiguration`, req, ...options) + } + static Bootstrap(req: BootstrapRequest, ...options: fm.fetchOption[]): Promise { + return fm.fetchReq("POST", `/machine.MachineService/Bootstrap`, req, ...options) + } + static Containers(req: ContainersRequest, ...options: fm.fetchOption[]): Promise { + return fm.fetchReq("POST", `/machine.MachineService/Containers`, req, ...options) + } + static Copy(req: CopyRequest, entityNotifier?: fm.NotifyStreamEntityArrival, ...options: fm.fetchOption[]): Promise { + return fm.fetchStreamingRequest("POST", `/machine.MachineService/Copy`, req, entityNotifier, ...options) + } + static CPUInfo(req: GoogleProtobufEmpty.Empty, ...options: fm.fetchOption[]): Promise { + return fm.fetchReq("POST", `/machine.MachineService/CPUInfo`, req, ...options) + } + static DiskStats(req: GoogleProtobufEmpty.Empty, ...options: fm.fetchOption[]): Promise { + return fm.fetchReq("POST", `/machine.MachineService/DiskStats`, req, ...options) + } + static Dmesg(req: DmesgRequest, entityNotifier?: fm.NotifyStreamEntityArrival, ...options: fm.fetchOption[]): Promise { + return fm.fetchStreamingRequest("POST", `/machine.MachineService/Dmesg`, req, entityNotifier, ...options) + } + static Events(req: EventsRequest, entityNotifier?: fm.NotifyStreamEntityArrival, ...options: fm.fetchOption[]): Promise { + return fm.fetchStreamingRequest("POST", `/machine.MachineService/Events`, req, entityNotifier, ...options) + } + static EtcdMemberList(req: EtcdMemberListRequest, ...options: fm.fetchOption[]): Promise { + return fm.fetchReq("POST", `/machine.MachineService/EtcdMemberList`, req, ...options) + } + static EtcdRemoveMember(req: EtcdRemoveMemberRequest, ...options: fm.fetchOption[]): Promise { + return fm.fetchReq("POST", `/machine.MachineService/EtcdRemoveMember`, req, ...options) + } + static EtcdLeaveCluster(req: EtcdLeaveClusterRequest, ...options: fm.fetchOption[]): Promise { + return fm.fetchReq("POST", `/machine.MachineService/EtcdLeaveCluster`, req, ...options) + } + static EtcdForfeitLeadership(req: EtcdForfeitLeadershipRequest, ...options: fm.fetchOption[]): Promise { + return fm.fetchReq("POST", `/machine.MachineService/EtcdForfeitLeadership`, req, ...options) + } + static EtcdSnapshot(req: EtcdSnapshotRequest, entityNotifier?: fm.NotifyStreamEntityArrival, ...options: fm.fetchOption[]): Promise { + return fm.fetchStreamingRequest("POST", `/machine.MachineService/EtcdSnapshot`, req, entityNotifier, ...options) + } + static GenerateConfiguration(req: GenerateConfigurationRequest, ...options: fm.fetchOption[]): Promise { + return fm.fetchReq("POST", `/machine.MachineService/GenerateConfiguration`, req, ...options) + } + static Hostname(req: GoogleProtobufEmpty.Empty, ...options: fm.fetchOption[]): Promise { + return fm.fetchReq("POST", `/machine.MachineService/Hostname`, req, ...options) + } + static Kubeconfig(req: GoogleProtobufEmpty.Empty, entityNotifier?: fm.NotifyStreamEntityArrival, ...options: fm.fetchOption[]): Promise { + return fm.fetchStreamingRequest("POST", `/machine.MachineService/Kubeconfig`, req, entityNotifier, ...options) + } + static List(req: ListRequest, entityNotifier?: fm.NotifyStreamEntityArrival, ...options: fm.fetchOption[]): Promise { + return fm.fetchStreamingRequest("POST", `/machine.MachineService/List`, req, entityNotifier, ...options) + } + static DiskUsage(req: DiskUsageRequest, entityNotifier?: fm.NotifyStreamEntityArrival, ...options: fm.fetchOption[]): Promise { + return fm.fetchStreamingRequest("POST", `/machine.MachineService/DiskUsage`, req, entityNotifier, ...options) + } + static LoadAvg(req: GoogleProtobufEmpty.Empty, ...options: fm.fetchOption[]): Promise { + return fm.fetchReq("POST", `/machine.MachineService/LoadAvg`, req, ...options) + } + static Logs(req: LogsRequest, entityNotifier?: fm.NotifyStreamEntityArrival, ...options: fm.fetchOption[]): Promise { + return fm.fetchStreamingRequest("POST", `/machine.MachineService/Logs`, req, entityNotifier, ...options) + } + static Memory(req: GoogleProtobufEmpty.Empty, ...options: fm.fetchOption[]): Promise { + return fm.fetchReq("POST", `/machine.MachineService/Memory`, req, ...options) + } + static Mounts(req: GoogleProtobufEmpty.Empty, ...options: fm.fetchOption[]): Promise { + return fm.fetchReq("POST", `/machine.MachineService/Mounts`, req, ...options) + } + static NetworkDeviceStats(req: GoogleProtobufEmpty.Empty, ...options: fm.fetchOption[]): Promise { + return fm.fetchReq("POST", `/machine.MachineService/NetworkDeviceStats`, req, ...options) + } + static Processes(req: GoogleProtobufEmpty.Empty, ...options: fm.fetchOption[]): Promise { + return fm.fetchReq("POST", `/machine.MachineService/Processes`, req, ...options) + } + static Read(req: ReadRequest, entityNotifier?: fm.NotifyStreamEntityArrival, ...options: fm.fetchOption[]): Promise { + return fm.fetchStreamingRequest("POST", `/machine.MachineService/Read`, req, entityNotifier, ...options) + } + static Reboot(req: RebootRequest, ...options: fm.fetchOption[]): Promise { + return fm.fetchReq("POST", `/machine.MachineService/Reboot`, req, ...options) + } + static Restart(req: RestartRequest, ...options: fm.fetchOption[]): Promise { + return fm.fetchReq("POST", `/machine.MachineService/Restart`, req, ...options) + } + static Rollback(req: RollbackRequest, ...options: fm.fetchOption[]): Promise { + return fm.fetchReq("POST", `/machine.MachineService/Rollback`, req, ...options) + } + static Reset(req: ResetRequest, ...options: fm.fetchOption[]): Promise { + return fm.fetchReq("POST", `/machine.MachineService/Reset`, req, ...options) + } + static ServiceList(req: GoogleProtobufEmpty.Empty, ...options: fm.fetchOption[]): Promise { + return fm.fetchReq("POST", `/machine.MachineService/ServiceList`, req, ...options) + } + static ServiceRestart(req: ServiceRestartRequest, ...options: fm.fetchOption[]): Promise { + return fm.fetchReq("POST", `/machine.MachineService/ServiceRestart`, req, ...options) + } + static ServiceStart(req: ServiceStartRequest, ...options: fm.fetchOption[]): Promise { + return fm.fetchReq("POST", `/machine.MachineService/ServiceStart`, req, ...options) + } + static ServiceStop(req: ServiceStopRequest, ...options: fm.fetchOption[]): Promise { + return fm.fetchReq("POST", `/machine.MachineService/ServiceStop`, req, ...options) + } + static Shutdown(req: ShutdownRequest, ...options: fm.fetchOption[]): Promise { + return fm.fetchReq("POST", `/machine.MachineService/Shutdown`, req, ...options) + } + static Stats(req: StatsRequest, ...options: fm.fetchOption[]): Promise { + return fm.fetchReq("POST", `/machine.MachineService/Stats`, req, ...options) + } + static SystemStat(req: GoogleProtobufEmpty.Empty, ...options: fm.fetchOption[]): Promise { + return fm.fetchReq("POST", `/machine.MachineService/SystemStat`, req, ...options) + } + static Upgrade(req: UpgradeRequest, ...options: fm.fetchOption[]): Promise { + return fm.fetchReq("POST", `/machine.MachineService/Upgrade`, req, ...options) + } + static Version(req: GoogleProtobufEmpty.Empty, ...options: fm.fetchOption[]): Promise { + return fm.fetchReq("POST", `/machine.MachineService/Version`, req, ...options) + } + static GenerateClientConfiguration(req: GenerateClientConfigurationRequest, ...options: fm.fetchOption[]): Promise { + return fm.fetchReq("POST", `/machine.MachineService/GenerateClientConfiguration`, req, ...options) + } + static PacketCapture(req: PacketCaptureRequest, entityNotifier?: fm.NotifyStreamEntityArrival, ...options: fm.fetchOption[]): Promise { + return fm.fetchStreamingRequest("POST", `/machine.MachineService/PacketCapture`, req, entityNotifier, ...options) + } +} \ No newline at end of file diff --git a/frontend/src/api/talos/machine/machine.proto b/frontend/src/api/talos/machine/machine.proto new file mode 100644 index 00000000..f2d6cdff --- /dev/null +++ b/frontend/src/api/talos/machine/machine.proto @@ -0,0 +1,1097 @@ +syntax = "proto3"; + +package machine; + +option go_package = "github.com/siderolabs/talos/pkg/machinery/api/machine"; + +import "common/common.proto"; +import "google/protobuf/any.proto"; +import "google/protobuf/duration.proto"; +import "google/protobuf/empty.proto"; +import "google/protobuf/timestamp.proto"; + +// The machine service definition. +service MachineService { + rpc ApplyConfiguration(ApplyConfigurationRequest) returns (ApplyConfigurationResponse); + // Bootstrap method makes control plane node enter etcd bootstrap mode. + // + // Node aborts etcd join sequence and creates single-node etcd cluster. + // + // If recover_etcd argument is specified, etcd is recovered from a snapshot + // uploaded with EtcdRecover. + rpc Bootstrap(BootstrapRequest) returns (BootstrapResponse); + rpc Containers(ContainersRequest) returns (ContainersResponse); + rpc Copy(CopyRequest) returns (stream common.Data); + rpc CPUInfo(google.protobuf.Empty) returns (CPUInfoResponse); + rpc DiskStats(google.protobuf.Empty) returns (DiskStatsResponse); + rpc Dmesg(DmesgRequest) returns (stream common.Data); + rpc Events(EventsRequest) returns (stream Event); + rpc EtcdMemberList(EtcdMemberListRequest) returns (EtcdMemberListResponse); + rpc EtcdRemoveMember(EtcdRemoveMemberRequest) returns (EtcdRemoveMemberResponse); + rpc EtcdLeaveCluster(EtcdLeaveClusterRequest) returns (EtcdLeaveClusterResponse); + rpc EtcdForfeitLeadership(EtcdForfeitLeadershipRequest) returns (EtcdForfeitLeadershipResponse); + // EtcdRecover method uploads etcd data snapshot created with EtcdSnapshot + // to the node. + // + // Snapshot can be later used to recover the cluster via Bootstrap method. + rpc EtcdRecover(stream common.Data) returns (EtcdRecoverResponse); + // EtcdSnapshot method creates etcd data snapshot (backup) from the local etcd instance + // and streams it back to the client. + // + // This method is available only on control plane nodes (which run etcd). + rpc EtcdSnapshot(EtcdSnapshotRequest) returns (stream common.Data); + rpc GenerateConfiguration(GenerateConfigurationRequest) returns (GenerateConfigurationResponse); + rpc Hostname(google.protobuf.Empty) returns (HostnameResponse); + rpc Kubeconfig(google.protobuf.Empty) returns (stream common.Data); + rpc List(ListRequest) returns (stream FileInfo); + rpc DiskUsage(DiskUsageRequest) returns (stream DiskUsageInfo); + rpc LoadAvg(google.protobuf.Empty) returns (LoadAvgResponse); + rpc Logs(LogsRequest) returns (stream common.Data); + rpc Memory(google.protobuf.Empty) returns (MemoryResponse); + rpc Mounts(google.protobuf.Empty) returns (MountsResponse); + rpc NetworkDeviceStats(google.protobuf.Empty) returns (NetworkDeviceStatsResponse); + rpc Processes(google.protobuf.Empty) returns (ProcessesResponse); + rpc Read(ReadRequest) returns (stream common.Data); + rpc Reboot(RebootRequest) returns (RebootResponse); + rpc Restart(RestartRequest) returns (RestartResponse); + rpc Rollback(RollbackRequest) returns (RollbackResponse); + rpc Reset(ResetRequest) returns (ResetResponse); + rpc ServiceList(google.protobuf.Empty) returns (ServiceListResponse); + rpc ServiceRestart(ServiceRestartRequest) returns (ServiceRestartResponse); + rpc ServiceStart(ServiceStartRequest) returns (ServiceStartResponse); + rpc ServiceStop(ServiceStopRequest) returns (ServiceStopResponse); + rpc Shutdown(ShutdownRequest) returns (ShutdownResponse); + rpc Stats(StatsRequest) returns (StatsResponse); + rpc SystemStat(google.protobuf.Empty) returns (SystemStatResponse); + rpc Upgrade(UpgradeRequest) returns (UpgradeResponse); + rpc Version(google.protobuf.Empty) returns (VersionResponse); + // GenerateClientConfiguration generates talosctl client configuration (talosconfig). + rpc GenerateClientConfiguration(GenerateClientConfigurationRequest) returns (GenerateClientConfigurationResponse); + // PacketCapture performs packet capture and streams back pcap file. + rpc PacketCapture(PacketCaptureRequest) returns (stream common.Data); +} + +// rpc applyConfiguration +// ApplyConfiguration describes a request to assert a new configuration upon a +// node. +message ApplyConfigurationRequest { + enum Mode { + REBOOT = 0; + AUTO = 1; + NO_REBOOT = 2; + STAGED = 3; + TRY = 4; + } + bytes data = 1; + // replaced by mode + bool on_reboot = 2 [ + (common.remove_deprecated_field) = "v1.4", + deprecated = true + ]; + // replaced by mode + bool immediate = 3 [ + (common.remove_deprecated_field) = "v1.4", + deprecated = true + ]; + Mode mode = 4; + bool dry_run = 5; + google.protobuf.Duration try_mode_timeout = 6; +} + +// ApplyConfigurationResponse describes the response to a configuration request. +message ApplyConfiguration { + common.Metadata metadata = 1; + // Configuration validation warnings. + repeated string warnings = 2; + // States which mode was actually chosen. + ApplyConfigurationRequest.Mode mode = 3; + // Human-readable message explaining the result of the apply configuration call. + string mode_details = 4; +} + +message ApplyConfigurationResponse { + repeated ApplyConfiguration messages = 1; +} + +// rpc reboot +message RebootRequest { + enum Mode { + DEFAULT = 0; + POWERCYCLE = 1; + } + Mode mode = 1; +} + +// The reboot message containing the reboot status. +message Reboot { + common.Metadata metadata = 1; + string actor_id = 2; +} + +message RebootResponse { + repeated Reboot messages = 1; +} + +// rpc Bootstrap +message BootstrapRequest { + // Enable etcd recovery from the snapshot. + // + // Snapshot should be uploaded before this call via EtcdRecover RPC. + bool recover_etcd = 1; + // Skip hash check on the snapshot (etcd). + // + // Enable this when recovering from data directory copy to skip integrity check. + bool recover_skip_hash_check = 2; +} + +// The bootstrap message containing the bootstrap status. +message Bootstrap { + common.Metadata metadata = 1; +} + +message BootstrapResponse { + repeated Bootstrap messages = 1; +} + +// rpc events +message SequenceEvent { + string sequence = 1; + enum Action { + NOOP = 0; + START = 1; + STOP = 2; + } + Action action = 2; + common.Error error = 3; +} + +message PhaseEvent { + string phase = 1; + enum Action { + START = 0; + STOP = 1; + } + Action action = 2; +} + +message TaskEvent { + string task = 1; + enum Action { + START = 0; + STOP = 1; + } + Action action = 2; +} + +message ServiceStateEvent { + string service = 1; + enum Action { + INITIALIZED = 0; + PREPARING = 1; + WAITING = 2; + RUNNING = 3; + STOPPING = 4; + FINISHED = 5; + FAILED = 6; + SKIPPED = 7; + } + Action action = 2; + string message = 3; + ServiceHealth health = 4; +} + +message RestartEvent { + int64 cmd = 1; +} + +// ConfigLoadErrorEvent is reported when the config loading has failed. +message ConfigLoadErrorEvent { + string error = 1; +} + +// ConfigValidationErrorEvent is reported when config validation has failed. +message ConfigValidationErrorEvent { + string error = 1; +} + +// AddressEvent reports node endpoints aggregated from k8s.Endpoints and network.Hostname. +message AddressEvent { + string hostname = 1; + repeated string addresses = 2; +} + +// MachineStatusEvent reports changes to the MachineStatus resource. +message MachineStatusEvent { + message MachineStatus { + message UnmetCondition { + string name = 1; + string reason = 2; + } + bool ready = 1; + repeated UnmetCondition unmet_conditions = 2; + } + enum MachineStage { + UNKNOWN = 0; + BOOTING = 1; + INSTALLING = 2; + MAINTENANCE = 3; + RUNNING = 4; + REBOOTING = 5; + SHUTTING_DOWN = 6; + RESETTING = 7; + UPGRADING = 8; + } + MachineStage stage = 1; + MachineStatus status = 2; +} + +message EventsRequest { + int32 tail_events = 1; + string tail_id = 2; + int32 tail_seconds = 3; + string with_actor_id = 4; +} + +message Event { + common.Metadata metadata = 1; + google.protobuf.Any data = 2; + string id = 3; + string actor_id = 4; +} + +// rpc reset +message ResetPartitionSpec { + string label = 1; + bool wipe = 2; +} + +message ResetRequest { + // Graceful indicates whether node should leave etcd before the upgrade, it also + // enforces etcd checks before leaving. + bool graceful = 1; + // Reboot indicates whether node should reboot or halt after resetting. + bool reboot = 2; + // System_partitions_to_wipe lists specific system disk partitions to be reset (wiped). + // If system_partitions_to_wipe is empty, all the partitions are erased. + repeated ResetPartitionSpec system_partitions_to_wipe = 3; +} + +// The reset message containing the restart status. +message Reset { + common.Metadata metadata = 1; + string actor_id = 2; +} + +message ResetResponse { + repeated Reset messages = 1; +} + +// rpc shutdown +// The messages message containing the shutdown status. +message Shutdown { + common.Metadata metadata = 1; + string actor_id = 2; +} + +message ShutdownRequest { + // Force indicates whether node should shutdown without first cordening and draining + bool force = 1; +} + +message ShutdownResponse { + repeated Shutdown messages = 1; +} + +// rpc upgrade +message UpgradeRequest { + string image = 1; + bool preserve = 2; + bool stage = 3; + bool force = 4; +} + +message Upgrade { + common.Metadata metadata = 1; + string ack = 2; + string actor_id = 3; +} + +message UpgradeResponse { + repeated Upgrade messages = 1; +} + +// rpc servicelist +message ServiceList { + common.Metadata metadata = 1; + repeated ServiceInfo services = 2; +} + +message ServiceListResponse { + repeated ServiceList messages = 1; +} + +message ServiceInfo { + string id = 1; + string state = 2; + ServiceEvents events = 3; + ServiceHealth health = 4; +} + +message ServiceEvents { + repeated ServiceEvent events = 1; +} + +message ServiceEvent { + string msg = 1; + string state = 2; + google.protobuf.Timestamp ts = 3; +} + +message ServiceHealth { + bool unknown = 1; + bool healthy = 2; + string last_message = 3; + google.protobuf.Timestamp last_change = 4; +} + +// rpc servicestart +message ServiceStartRequest { + string id = 1; +} + +message ServiceStart { + common.Metadata metadata = 1; + string resp = 2; +} + +message ServiceStartResponse { + repeated ServiceStart messages = 1; +} + +message ServiceStopRequest { + string id = 1; +} + +message ServiceStop { + common.Metadata metadata = 1; + string resp = 2; +} + +message ServiceStopResponse { + repeated ServiceStop messages = 1; +} + +message ServiceRestartRequest { + string id = 1; +} + +message ServiceRestart { + common.Metadata metadata = 1; + string resp = 2; +} + +message ServiceRestartResponse { + repeated ServiceRestart messages = 1; +} + +// CopyRequest describes a request to copy data out of Talos node +// +// Copy produces .tar.gz archive which is streamed back to the caller +message CopyRequest { + // Root path to start copying data out, it might be either a file or directory + string root_path = 1; +} + +// ListRequest describes a request to list the contents of a directory. +message ListRequest { + // Root indicates the root directory for the list. If not indicated, '/' is + // presumed. + string root = 1; + // Recurse indicates that subdirectories should be recursed. + bool recurse = 2; + // RecursionDepth indicates how many levels of subdirectories should be + // recursed. The default (0) indicates that no limit should be enforced. + int32 recursion_depth = 3; + // File type. + enum Type { + // Regular file (not directory, symlink, etc). + REGULAR = 0; + // Directory. + DIRECTORY = 1; + // Symbolic link. + SYMLINK = 2; + } + // Types indicates what file type should be returned. If not indicated, + // all files will be returned. + repeated Type types = 4; +} + +// DiskUsageRequest describes a request to list disk usage of directories and regular files +message DiskUsageRequest { + // RecursionDepth indicates how many levels of subdirectories should be + // recursed. The default (0) indicates that no limit should be enforced. + int32 recursion_depth = 1; + // All write sizes for all files, not just directories. + bool all = 2; + // Threshold exclude entries smaller than SIZE if positive, + // or entries greater than SIZE if negative. + int64 threshold = 3; + // DiskUsagePaths is the list of directories to calculate disk usage for. + repeated string paths = 4; +} + +// FileInfo describes a file or directory's information +message FileInfo { + common.Metadata metadata = 1; + // Name is the name (including prefixed path) of the file or directory + string name = 2; + // Size indicates the number of bytes contained within the file + int64 size = 3; + // Mode is the bitmap of UNIX mode/permission flags of the file + uint32 mode = 4; + // Modified indicates the UNIX timestamp at which the file was last modified + int64 modified = 5; + // IsDir indicates that the file is a directory + bool is_dir = 6; + // Error describes any error encountered while trying to read the file + // information. + string error = 7; + // Link is filled with symlink target + string link = 8; + // RelativeName is the name of the file or directory relative to the RootPath + string relative_name = 9; + // Owner uid + uint32 uid = 10; + // Owner gid + uint32 gid = 11; +} + +// DiskUsageInfo describes a file or directory's information for du command +message DiskUsageInfo { + common.Metadata metadata = 1; + // Name is the name (including prefixed path) of the file or directory + string name = 2; + // Size indicates the number of bytes contained within the file + int64 size = 3; + // Error describes any error encountered while trying to read the file + // information. + string error = 4; + // RelativeName is the name of the file or directory relative to the RootPath + string relative_name = 5; +} + +// The messages message containing the requested df stats. +message Mounts { + common.Metadata metadata = 1; + repeated MountStat stats = 2; +} + +message MountsResponse { + repeated Mounts messages = 1; +} + +// The messages message containing the requested processes. +message MountStat { + string filesystem = 1; + uint64 size = 2; + uint64 available = 3; + string mounted_on = 4; +} + +message Version { + common.Metadata metadata = 1; + VersionInfo version = 2; + PlatformInfo platform = 3; + // Features describe individual Talos features that can be switched on or off. + FeaturesInfo features = 4; +} + +message VersionResponse { + repeated Version messages = 1; +} + +message VersionInfo { + string tag = 1; + string sha = 2; + string built = 3; + string go_version = 4; + string os = 5; + string arch = 6; +} + +message PlatformInfo { + string name = 1; + string mode = 2; +} + +// FeaturesInfo describes individual Talos features that can be switched on or off. +message FeaturesInfo { + // RBAC is true if role-based access control is enabled. + bool rbac = 1; +} + +// rpc logs +// The request message containing the process name. +message LogsRequest { + string namespace = 1; + string id = 2; + // driver might be default "containerd" or "cri" + common.ContainerDriver driver = 3; + bool follow = 4; + int32 tail_lines = 5; +} + +message ReadRequest { + string path = 1; +} + +// rpc rollback +message RollbackRequest {} + +message Rollback { + common.Metadata metadata = 1; +} + +message RollbackResponse { + repeated Rollback messages = 1; +} + +// rpc Containers + +message ContainersRequest { + string namespace = 1; + // driver might be default "containerd" or "cri" + common.ContainerDriver driver = 2; +} + +// The messages message containing the requested containers. +message ContainerInfo { + string namespace = 1; + string id = 2; + string image = 3; + uint32 pid = 4; + string status = 5; + string pod_id = 6; + string name = 7; +} + +// The messages message containing the requested containers. +message Container { + common.Metadata metadata = 1; + repeated ContainerInfo containers = 2; +} + +message ContainersResponse { + repeated Container messages = 1; +} + +// dmesg +message DmesgRequest { + bool follow = 1; + bool tail = 2; +} + +// rpc processes +message ProcessesResponse { + repeated Process messages = 1; +} + +message Process { + common.Metadata metadata = 1; + repeated ProcessInfo processes = 2; +} + +message ProcessInfo { + int32 pid = 1; + int32 ppid = 2; + string state = 3; + int32 threads = 4; + double cpu_time = 5; + uint64 virtual_memory = 6; + uint64 resident_memory = 7; + string command = 8; + string executable = 9; + string args = 10; +} + +// rpc restart +// The request message containing the process to restart. +message RestartRequest { + string namespace = 1; + string id = 2; + // driver might be default "containerd" or "cri" + common.ContainerDriver driver = 3; +} + +message Restart { + common.Metadata metadata = 1; +} + +// The messages message containing the restart status. +message RestartResponse { + repeated Restart messages = 1; +} + +// rpc stats + +// The request message containing the containerd namespace. +message StatsRequest { + string namespace = 1; + // driver might be default "containerd" or "cri" + common.ContainerDriver driver = 2; +} + +// The messages message containing the requested stats. +message Stats { + common.Metadata metadata = 1; + repeated Stat stats = 2; +} + +message StatsResponse { + repeated Stats messages = 1; +} + +// The messages message containing the requested stat. +message Stat { + string namespace = 1; + string id = 2; + uint64 memory_usage = 4; + uint64 cpu_usage = 5; + string pod_id = 6; + string name = 7; +} + +message Memory { + common.Metadata metadata = 1; + MemInfo meminfo = 2; +} + +message MemoryResponse { + repeated Memory messages = 1; +} + +message MemInfo { + uint64 memtotal = 1; + uint64 memfree = 2; + uint64 memavailable = 3; + uint64 buffers = 4; + uint64 cached = 5; + uint64 swapcached = 6; + uint64 active = 7; + uint64 inactive = 8; + uint64 activeanon = 9; + uint64 inactiveanon = 10; + uint64 activefile = 11; + uint64 inactivefile = 12; + uint64 unevictable = 13; + uint64 mlocked = 14; + uint64 swaptotal = 15; + uint64 swapfree = 16; + uint64 dirty = 17; + uint64 writeback = 18; + uint64 anonpages = 19; + uint64 mapped = 20; + uint64 shmem = 21; + uint64 slab = 22; + uint64 sreclaimable = 23; + uint64 sunreclaim = 24; + uint64 kernelstack = 25; + uint64 pagetables = 26; + uint64 nfsunstable = 27; + uint64 bounce = 28; + uint64 writebacktmp = 29; + uint64 commitlimit = 30; + uint64 committedas = 31; + uint64 vmalloctotal = 32; + uint64 vmallocused = 33; + uint64 vmallocchunk = 34; + uint64 hardwarecorrupted = 35; + uint64 anonhugepages = 36; + uint64 shmemhugepages = 37; + uint64 shmempmdmapped = 38; + uint64 cmatotal = 39; + uint64 cmafree = 40; + uint64 hugepagestotal = 41; + uint64 hugepagesfree = 42; + uint64 hugepagesrsvd = 43; + uint64 hugepagessurp = 44; + uint64 hugepagesize = 45; + uint64 directmap4k = 46; + uint64 directmap2m = 47; + uint64 directmap1g = 48; +} + +// rpc Hostname + +message HostnameResponse { + repeated Hostname messages = 1; +} + +message Hostname { + common.Metadata metadata = 1; + string hostname = 2; +} + +// rpc LoadAvg + +message LoadAvgResponse { + repeated LoadAvg messages = 1; +} + +message LoadAvg { + common.Metadata metadata = 1; + double load1 = 2; + double load5 = 3; + double load15 = 4; +} + +// rpc SystemStat + +message SystemStatResponse { + repeated SystemStat messages = 1; +} + +message SystemStat { + common.Metadata metadata = 1; + uint64 boot_time = 2; + CPUStat cpu_total = 3; + repeated CPUStat cpu = 4; + uint64 irq_total = 5; + repeated uint64 irq = 6; + uint64 context_switches = 7; + uint64 process_created = 8; + uint64 process_running = 9; + uint64 process_blocked = 10; + uint64 soft_irq_total = 11; + SoftIRQStat soft_irq = 12; +} + +message CPUStat { + double user = 1; + double nice = 2; + double system = 3; + double idle = 4; + double iowait = 5; + double irq = 6; + double soft_irq = 7; + double steal = 8; + double guest = 9; + double guest_nice = 10; +} + +message SoftIRQStat { + uint64 hi = 1; + uint64 timer = 2; + uint64 net_tx = 3; + uint64 net_rx = 4; + uint64 block = 5; + uint64 block_io_poll = 6; + uint64 tasklet = 7; + uint64 sched = 8; + uint64 hrtimer = 9; + uint64 rcu = 10; +} + +// rpc CPUInfo + +message CPUInfoResponse { + repeated CPUsInfo messages = 1; +} + +message CPUsInfo { + common.Metadata metadata = 1; + repeated CPUInfo cpu_info = 2; +} + +message CPUInfo { + uint32 processor = 1; + string vendor_id = 2; + string cpu_family = 3; + string model = 4; + string model_name = 5; + string stepping = 6; + string microcode = 7; + double cpu_mhz = 8; + string cache_size = 9; + string physical_id = 10; + uint32 siblings = 11; + string core_id = 12; + uint32 cpu_cores = 13; + string apic_id = 14; + string initial_apic_id = 15; + string fpu = 16; + string fpu_exception = 17; + uint32 cpu_id_level = 18; + string wp = 19; + repeated string flags = 20; + repeated string bugs = 21; + double bogo_mips = 22; + uint32 cl_flush_size = 23; + uint32 cache_alignment = 24; + string address_sizes = 25; + string power_management = 26; +} + +// rpc NetworkDeviceStats + +message NetworkDeviceStatsResponse { + repeated NetworkDeviceStats messages = 1; +} + +message NetworkDeviceStats { + common.Metadata metadata = 1; + NetDev total = 2; + repeated NetDev devices = 3; +} + +message NetDev { + string name = 1; + uint64 rx_bytes = 2; + uint64 rx_packets = 3; + uint64 rx_errors = 4; + uint64 rx_dropped = 5; + uint64 rx_fifo = 6; + uint64 rx_frame = 7; + uint64 rx_compressed = 8; + uint64 rx_multicast = 9; + uint64 tx_bytes = 10; + uint64 tx_packets = 11; + uint64 tx_errors = 12; + uint64 tx_dropped = 13; + uint64 tx_fifo = 14; + uint64 tx_collisions = 15; + uint64 tx_carrier = 16; + uint64 tx_compressed = 17; +} + +// rpc DiskStats + +message DiskStatsResponse { + repeated DiskStats messages = 1; +} + +message DiskStats { + common.Metadata metadata = 1; + DiskStat total = 2; + repeated DiskStat devices = 3; +} + +message DiskStat { + string name = 1; + uint64 read_completed = 2; + uint64 read_merged = 3; + uint64 read_sectors = 4; + uint64 read_time_ms = 5; + uint64 write_completed = 6; + uint64 write_merged = 7; + uint64 write_sectors = 8; + uint64 write_time_ms = 9; + uint64 io_in_progress = 10; + uint64 io_time_ms = 11; + uint64 io_time_weighted_ms = 12; + uint64 discard_completed = 13; + uint64 discard_merged = 14; + uint64 discard_sectors = 15; + uint64 discard_time_ms = 16; +} + +message EtcdLeaveClusterRequest {} + +message EtcdLeaveCluster { + common.Metadata metadata = 1; +} + +message EtcdLeaveClusterResponse { + repeated EtcdLeaveCluster messages = 1; +} + +message EtcdRemoveMemberRequest { + string member = 1; +} + +message EtcdRemoveMember { + common.Metadata metadata = 1; +} + +message EtcdRemoveMemberResponse { + repeated EtcdRemoveMember messages = 1; +} + +message EtcdForfeitLeadershipRequest {} + +message EtcdForfeitLeadership { + common.Metadata metadata = 1; + string member = 2; +} + +message EtcdForfeitLeadershipResponse { + repeated EtcdForfeitLeadership messages = 1; +} + +message EtcdMemberListRequest { + bool query_local = 1; +} + +// EtcdMember describes a single etcd member. +message EtcdMember { + // member ID. + uint64 id = 2; + // human-readable name of the member. + string hostname = 3; + // the list of URLs the member exposes to clients for communication. + repeated string peer_urls = 4; + // the list of URLs the member exposes to the cluster for communication. + repeated string client_urls = 5; + // learner flag + bool is_learner = 6; +} + +// EtcdMembers contains the list of members registered on the host. +message EtcdMembers { + common.Metadata metadata = 1; + // list of member hostnames. + repeated string legacy_members = 2; + // the list of etcd members registered on the node. + repeated EtcdMember members = 3; +} + +message EtcdMemberListResponse { + repeated EtcdMembers messages = 1; +} + +message EtcdSnapshotRequest {} + +message EtcdRecover { + common.Metadata metadata = 1; +} + +message EtcdRecoverResponse { + repeated EtcdRecover messages = 1; +} + +// rpc generateConfiguration + +message RouteConfig { + string network = 1; + string gateway = 2; + uint32 metric = 3; +} + +message DHCPOptionsConfig { + uint32 route_metric = 1; +} + +message NetworkDeviceConfig { + string interface = 1; + string cidr = 2; + int32 mtu = 3; + bool dhcp = 4; + bool ignore = 5; + DHCPOptionsConfig dhcp_options = 6; + repeated RouteConfig routes = 7; +} + +message NetworkConfig { + string hostname = 1; + repeated NetworkDeviceConfig interfaces = 2; +} + +message InstallConfig { + string install_disk = 1; + string install_image = 2; +} + +message MachineConfig { + enum MachineType { + TYPE_UNKNOWN = 0; + TYPE_INIT = 1; + TYPE_CONTROL_PLANE = 2; + TYPE_WORKER = 3; + } + MachineType type = 1; + InstallConfig install_config = 2; + NetworkConfig network_config = 3; + string kubernetes_version = 4; +} + +message ControlPlaneConfig { + string endpoint = 1; +} + +message CNIConfig { + string name = 1; + repeated string urls = 2; +} + +message ClusterNetworkConfig { + string dns_domain = 1; + CNIConfig cni_config = 2; +} + +message ClusterConfig { + string name = 1; + ControlPlaneConfig control_plane = 2; + ClusterNetworkConfig cluster_network = 3; + bool allow_scheduling_on_control_planes = 4; +} + +// GenerateConfigurationRequest describes a request to generate a new configuration +// on a node. +message GenerateConfigurationRequest { + string config_version = 1; + ClusterConfig cluster_config = 2; + MachineConfig machine_config = 3; + google.protobuf.Timestamp override_time = 4; +} + +// GenerateConfiguration describes the response to a generate configuration request. +message GenerateConfiguration { + common.Metadata metadata = 1; + repeated bytes data = 2; + bytes talosconfig = 3; +} + +message GenerateConfigurationResponse { + repeated GenerateConfiguration messages = 1; +} + +message GenerateClientConfigurationRequest { + // Roles in the generated client certificate. + repeated string roles = 1; + // Client certificate TTL. + google.protobuf.Duration crt_ttl = 2; +} + +message GenerateClientConfiguration { + common.Metadata metadata = 1; + // PEM-encoded CA certificate. + bytes ca = 2; + // PEM-encoded generated client certificate. + bytes crt = 3; + // PEM-encoded generated client key. + bytes key = 4; + // Client configuration (talosconfig) file content. + bytes talosconfig = 5; +} + +message GenerateClientConfigurationResponse { + repeated GenerateClientConfiguration messages = 1; +} + +message PacketCaptureRequest { + // Interface name to perform packet capture on. + string interface = 1; + // Enable promiscuous mode. + bool promiscuous = 2; + // Snap length in bytes. + uint32 snap_len = 3; + // BPF filter. + repeated BPFInstruction bpf_filter = 4; +} + +message BPFInstruction { + uint32 op = 1; + uint32 jt = 2; + uint32 jf = 3; + uint32 k = 4; +} diff --git a/frontend/src/api/v1alpha1/resource.pb.ts b/frontend/src/api/v1alpha1/resource.pb.ts new file mode 100644 index 00000000..6b1b25d6 --- /dev/null +++ b/frontend/src/api/v1alpha1/resource.pb.ts @@ -0,0 +1,57 @@ +/* eslint-disable */ +// @ts-nocheck +/* +* This file is a generated Typescript file for GRPC Gateway, DO NOT MODIFY +*/ + +import * as GoogleProtobufTimestamp from "../google/protobuf/timestamp.pb" + +export enum LabelTermOperation { + EXISTS = 0, + EQUAL = 1, + NOT_EXISTS = 2, + IN = 3, + LT = 4, + LTE = 5, + LT_NUMERIC = 6, + LTE_NUMERIC = 7, +} + +export type Metadata = { + namespace?: string + type?: string + id?: string + version?: string + owner?: string + phase?: string + created?: GoogleProtobufTimestamp.Timestamp + updated?: GoogleProtobufTimestamp.Timestamp + finalizers?: string[] + annotations?: {[key: string]: string} + labels?: {[key: string]: string} +} + +export type Spec = { + proto_spec?: Uint8Array + yaml_spec?: string +} + +export type Resource = { + metadata?: Metadata + spec?: Spec +} + +export type LabelTerm = { + key?: string + op?: LabelTermOperation + value?: string[] + invert?: boolean +} + +export type LabelQuery = { + terms?: LabelTerm[] +} + +export type IDQuery = { + regexp?: string +} \ No newline at end of file diff --git a/frontend/src/api/v1alpha1/resource.proto b/frontend/src/api/v1alpha1/resource.proto new file mode 100644 index 00000000..28121f7b --- /dev/null +++ b/frontend/src/api/v1alpha1/resource.proto @@ -0,0 +1,84 @@ +syntax = "proto3"; + +// Resource package defines protobuf serialization of COSI resources. +package cosi.resource; + +option go_package = "github.com/cosi-project/runtime/api/v1alpha1"; + +import "google/protobuf/timestamp.proto"; + +// Metadata represents resource metadata. +// +// (namespace, type, id) is a resource pointer. +// (version) is a current resource version. +// (owner) is filled in for controller-managed resources with controller name. +// (phase) indicates whether resource is going through tear down phase. +// (finalizers) are attached controllers blocking teardown of the resource. +// (labels) and (annotations) are free-form key-value pairs; labels allow queries. +message Metadata { + string namespace = 1; + string type = 2; + string id = 3; + string version = 4; + string owner = 5; + string phase = 6; + google.protobuf.Timestamp created = 7; + google.protobuf.Timestamp updated = 8; + repeated string finalizers = 9; + map annotations = 11; + map labels = 10; +} + +// Spec defines content of the resource. +message Spec { + // Protobuf-serialized representation of the resource. + bytes proto_spec = 1; + // YAML representation of the spec (optional). + string yaml_spec = 2; +} + +// Resource is a combination of metadata and spec. +message Resource { + Metadata metadata = 1; + Spec spec = 2; +} + +// LabelTerm is an expression on a label. +message LabelTerm { + enum Operation { + // Label exists. + EXISTS = 0; + // Label value is equal. + EQUAL = 1; + // Label doesn't exist. + NOT_EXISTS = 2 [deprecated=true]; + // Label value is in the set. + IN = 3; + // Label value is less. + LT = 4; + // Label value is less or equal. + LTE = 5; + // Label value is less than number. + LT_NUMERIC = 6; + // Label value is less or equal numeric. + LTE_NUMERIC = 7; + } + + string key = 1; + Operation op = 2; + repeated string value = 3; + // Inverts the condition. + bool invert = 5; +} + +// LabelQuery is a query on resource metadata labels. +// +// Terms are combined with AND. +message LabelQuery { + repeated LabelTerm terms = 1; +} + +// IDQuery is a query on resource metadata ID. +message IDQuery { + string regexp = 1; +} diff --git a/frontend/src/api/watch.ts b/frontend/src/api/watch.ts new file mode 100644 index 00000000..da58806a --- /dev/null +++ b/frontend/src/api/watch.ts @@ -0,0 +1,726 @@ +// Copyright (c) 2024 Sidero Labs, Inc. +// +// Use of this software is governed by the Business Source License +// included in the LICENSE file. + +import { onBeforeUnmount, onMounted, ref, Ref, watch } from 'vue'; +import { Runtime } from '@/api/common/omni.pb'; +import { EventType, WatchRequest, WatchResponse } from '@/api/omni/resources/resources.pb'; +import { Resource, ResourceService, ResourceTyped, Stream } from '@/api/grpc'; +import { Metadata } from '@/api/v1alpha1/resource.pb'; +import { withContext, withMetadata, withRuntime, GRPCMetadata } from '@/api/options'; +import { fetchOption } from '@/api/fetch.pb'; + +export interface Callback { + (message: WatchResponse, spec: WatchEventSpec) +} + +export type WatchEventSpec = { + res?: Resource, + old?: Resource, +}; + +export class WatchFunc { + protected runtime: Runtime = Runtime.Kubernetes; + protected callback: (resp: WatchResponse) => void; + protected stream?: Stream; + + public readonly loading: Ref = ref(false); + public readonly running: Ref = ref(false); + public readonly err: Ref = ref(null); + + constructor(callback: Callback) { + this.callback = (message: WatchResponse) => { + const spec: WatchEventSpec = {}; + + if (message.event?.resource) { + spec.res = JSON.parse(message.event?.resource); + } + + if (message.event?.old) { + spec.old = JSON.parse(message.event?.old); + } + + if (message.event?.event_type === EventType.BOOTSTRAPPED) { + this.loading.value = false; + } + + callback(message, spec); + }; + } + + // setup is meant to be called from the component setup method + public setup(opts: WatchSource | WatchOptions) { + let unmounted = false; + + const reactiveOpts = isRef(opts) ? (opts as WatchSource) : null; + + const startWatch = async () => { + stopWatch(); + + const watchOptions = reactiveOpts ? reactiveOpts.value : opts; + + if (!watchOptions) + return; + + await this.start(watchOptions as WatchOptions); + + if (unmounted) { + stopWatch(); + } + }; + + if (reactiveOpts) { + watch(reactiveOpts, (newval, oldval) => { + if (JSON.stringify(newval) !== JSON.stringify(oldval)) { + startWatch(); + } + }); + } + + const stopWatch = async () => { + this.stop(); + }; + + onMounted(async () => { + await startWatch(); + }); + + onBeforeUnmount(async () => { + unmounted = true; + + stopWatch(); + }); + } + + public start(opts: WatchOptions): Promise { + return this.createStream(opts); + } + + public async createStream(opts: WatchOptions, onStart?: () => void, onError?: (err: Error) => void): Promise { + this.loading.value = true; + this.err.value = ""; + + this.runtime = opts.runtime; + + const metadata: GRPCMetadata = {}; + + if (opts.selectors?.length) { + metadata.selectors = opts.selectors.join(opts.selectUsingOR ? ";" : ","); + } + + const fetchOptions: fetchOption[] = [ + withRuntime(this.runtime), + withMetadata(metadata), + ]; + + if (opts.context) { + fetchOptions.push( + withContext(opts.context), + ); + } + + this.stream = await ResourceService.Watch({ + id: opts.resource.id, + namespace: opts.resource.namespace, + type: opts.resource.type, + tail_events: opts.tailEvents, + limit: opts.limit, + sort_by_field: opts.sortByField, + sort_descending: opts.sortDescending, + search_for: opts.searchFor, + offset: opts.offset, + }, this.callback, fetchOptions, () => { + this.onStart(); + if (onStart) onStart(); + }, (e: Error) => { + this.onError(e); + if (onError) onError(e); + }); + + this.running.value = true; + } + + public stop() { + this.running.value = false; + + if (this.stream) { + this.stream.shutdown(); + } + } + + public id(item: {metadata: {id?: string, name?: string, namespace?: string}}): string { + return itemID(item); + } + + protected onStart() { + this.err.value = null; + this.loading.value = true; + } + + protected onError(error: Error) { + this.err.value = error.message ?? error.toString(); + this.loading.value = false; + } +} + +export type WatchContext = { + cluster: string, + nodes?: string[], +}; + +export type WatchOptions = { + runtime: Runtime, + resource: Metadata, + context?: WatchContext, + selectors?: string[], + selectUsingOR?: boolean, + tailEvents?: number, + offset?: number, + limit?: number, + sortByField?: string, + sortDescending?: boolean, + searchFor?: string[], +} + +export default class Watch extends WatchFunc { + public readonly items?: Ref[]>; + public readonly item?: Ref | undefined>; + public readonly total: Ref = ref(0); + + private watchItems?: WatchItems; + private lastTotal: number = 0; + + constructor(target: Ref[]> | Ref | undefined>, callback?: Callback) { + let handler: Callback | undefined; + + super((event: WatchResponse, spec: WatchEventSpec) => { + if (callback) { + callback(event, spec); + } + + if (handler) { + handler(event, spec); + } + + if (event.total !== undefined) { + this.lastTotal = event.total ?? 0; + + if (this.watchItems?.bootstrapped) { + this.total.value = this.lastTotal; + } + } + }); + + if (target.value && ([]>target.value).push !== undefined) { + handler = this.listHandler.bind(this); + + this.items = ([]>>target) + } else { + handler = this.singleItemHandler.bind(this); + + this.item = ( | undefined>>target); + } + } + + public async start(opts: WatchOptions): Promise { + if (this.items) { + this.watchItems = new WatchItems(this.items.value); + + this.items.value.splice(0, this.items.value.length); + } + + this.watchItems?.setDescending(opts.sortDescending ?? false); + + await this.createStream(opts); + + if (!this.stream) { + return; + } + + this.running.value = true; + } + + public stop() { + super.stop(); + + if (this.watchItems) { + this.watchItems.reset(); + } + + if (this.items) { + this.items.value.splice(0, this.items.value.length); + } else if (this.item) { + this.item.value = undefined; + } + } + + protected onStart() { + if (this.watchItems) { + this.watchItems.reset(); + } + + super.onStart(); + } + + private singleItemHandler(message: WatchResponse, spec: WatchEventSpec) { + if (message.event?.event_type == EventType.BOOTSTRAPPED) { + this.loading.value = false; + + return; + } + + if (!spec.res) { + throw new Error(`malformed ${message.event?.event_type} event: no resource defined`); + } + + if (!this.item) { + return; + } + + switch(message.event?.event_type) { + case EventType.UPDATED: + case EventType.CREATED: + this.item.value = spec.res; + break; + case EventType.DESTROYED: + this.item.value = undefined; + break; + } + } + + private listHandler(message: WatchResponse, spec: WatchEventSpec) { + if (!this.items || !this.watchItems) + return; + + if (message.event?.event_type == EventType.BOOTSTRAPPED) { + this.loading.value = false; + + this.watchItems.bootstrap(); + + return; + } + + if (!spec.res) { + throw new Error(`malformed ${message.event?.event_type} event: no resource defined`); + } + + switch(message.event?.event_type) { + case EventType.UPDATED: + case EventType.CREATED: + this.watchItems.createOrUpdate({...spec.res, sortFieldData: message.sort_field_data}, spec.old); + + break; + case EventType.DESTROYED: + this.watchItems.remove(itemID(spec.res)); + + break; + } + } +} + +const compareFn = (left: ResourceSort, right: ResourceSort, sortDescending?: boolean): number => { + const inv = sortDescending ? -1 : 1; + + if (left.sortFieldData && right.sortFieldData) { + if (left.sortFieldData > right.sortFieldData) { + return 1 * inv + } else if (left.sortFieldData < right.sortFieldData) { + return -1 * inv; + } + } + + const leftID = itemID(left); + const rightID = itemID(right); + + if (leftID > rightID) { + return 1; + } else if (leftID < rightID) { + return -1; + } + + return 0; +} + +function getInsertionIndex(arr: ResourceTyped[], item: ResourceSort, sortDescending?: boolean): number { + const itemsCount = arr.length; + + if (itemsCount === 0) { + return 0; + } + + const lastItem = arr[itemsCount - 1]; + + if (compareFn(item, lastItem, sortDescending) >= 0) { + return itemsCount; + } + + const getMidPoint = (start: number, end: number) => Math.floor((end - start) / 2) + start; + let start = 0; + let end = itemsCount - 1; + let index = getMidPoint(start, end); + + while (start < end) { + const curItem = arr[index]; + + const comparison = compareFn(item, curItem, sortDescending); + + if (comparison === 0) { + break; + } else if (comparison < 0) { + end = index; + } else { + start = index + 1; + } + index = getMidPoint(start, end); + } + + return index; +} + +export const itemID = (item: {metadata: {id?: string, name?: string, namespace?: string}}): string => { + if(item.metadata == null) { + return ""; + } + + return `${item.metadata.namespace || "default"}.${item.metadata.name ?? item.metadata.id}`; +} + +export type ResourceSort = ResourceTyped & {sortFieldData?: string}; + +// WatchItems wraps items list and handles sort order, insertions and removals. +class WatchItems { + private items: ResourceSort[]; + private bootstrapList: ResourceSort[] = []; + + public bootstrapped: boolean = false; + private sortDescending: boolean = false; + + constructor(items: ResourceTyped[]) { + this.items = items; + } + + public setDescending(descending: boolean) { + if (this.sortDescending === descending) { + return; + } + + this.sortDescending = descending; + this.items.sort((a, b): number => { + return compareFn(a, b, descending); + }) + } + + public createOrUpdate(item: ResourceSort, old?: ResourceTyped) { + const items = this.bootstrapped ? this.items : this.bootstrapList; + + let foundIndex = this.findIndex(itemID(old ?? item), items); + + if (foundIndex > -1) { + if (items[foundIndex].sortFieldData !== item.sortFieldData) { + items.splice(foundIndex, 1); + foundIndex = -1; + } else { + items[foundIndex] = item; + } + } + + if (foundIndex < 0) { + const index = getInsertionIndex(items, item, this.sortDescending); + + items.splice(index, 0, item); + } + } + + public remove(id: string) { + const items = this.bootstrapped ? this.items : this.bootstrapList; + + const foundIndex = this.findIndex(id, items); + + if (foundIndex == -1) { + return; + } + + items.splice(foundIndex, 1); + } + + public reset() { + this.bootstrapList = []; + this.bootstrapped = false; + } + + public bootstrap() { + this.bootstrapped = true; + + if (this.items) { + this.items.splice(0, this.items.length); + this.items.push(...this.bootstrapList); + } + + this.bootstrapList = []; + } + + private findIndex(id: string, items: ResourceTyped[]): number { + return items.findIndex((element: ResourceTyped) => { + return itemID(element) === id; + }) + } +} + +export type WatchJoinOptions = WatchOptions & {idFunc?: (res: ResourceTyped) => string}; + +interface WatchSource { + value: T +} + +export class WatchJoin { + private watches: WatchFunc[] = []; + private items: Ref[]>; + private watchItems?: WatchItems; + private itemMap: Record>>> = {}; + private primaryResourceType?: string; + private lastTotal: number = 0; + + public readonly loading = ref(false); + public readonly err: Ref = ref(null); + public readonly total: Ref = ref(0); + + constructor(items: Ref[]>) { + this.items = items; + } + + public setup(primary: WatchSource | WatchJoinOptions, resources: WatchSource | WatchJoinOptions[]) { + let unmounted = false; + + const reactivePrimary = isRef(primary) ? primary as WatchSource : null; + const reactiveResources = isRef(resources) ? resources as WatchSource : null; + + const restartIfDiff = (newval: WatchJoinOptions | WatchJoinOptions[], oldval: WatchJoinOptions | WatchJoinOptions[]) => { + if (JSON.stringify(newval) === JSON.stringify(oldval)) { + return; + } + + startWatch(); + } + + const startWatch = async () => { + stopWatch(); + + const primaryOpts: WatchJoinOptions = reactivePrimary ? reactivePrimary.value : primary as WatchJoinOptions; + const resourcesOpts: WatchJoinOptions[] = reactiveResources ? reactiveResources.value : resources as WatchJoinOptions[]; + + if (!primaryOpts || !resourcesOpts) + return; + + await this.start(primaryOpts, ...resourcesOpts); + + if (unmounted) { + stopWatch(); + } + }; + if (reactivePrimary) { + watch(reactivePrimary as Ref, restartIfDiff); + } + + if (reactiveResources) { + watch(reactiveResources as Ref, restartIfDiff); + } + + const stopWatch = async () => { + this.stop(); + }; + + onMounted(async () => { + await startWatch(); + }); + + onBeforeUnmount(async () => { + unmounted = true; + + stopWatch(); + }); + } + + // start initializes the list of watches. + // the first resource metadata is primary, then it's extended by the specs of the resources defined after. + public async start(primary: WatchOptions, ...resources: WatchJoinOptions[]): Promise { + this.stop(); + + this.watchItems = new WatchItems(this.items.value); + this.watchItems.setDescending(primary.sortDescending ?? false); + this.loading.value = true; + this.err.value = null; + this.primaryResourceType = primary.resource.type; + + const handler = (resourceType: string, opts: WatchJoinOptions) => { + return (resp: WatchResponse, spec: WatchEventSpec) => { + if (!this.itemMap[resourceType]) { + this.itemMap[resourceType] = {}; + } + + if (resourceType == this.primaryResourceType) { + this.lastTotal = resp.total ?? 0; + } + + if (resourceType == this.primaryResourceType && resp.event?.event_type === EventType.BOOTSTRAPPED) { + if (!this.watchItems) + throw new Error("assertion failed on watchItems !== null") + + this.watchItems.bootstrap(); + this.loading.value = false; + this.total.value = this.lastTotal; + + return; + } + + if (resourceType == this.primaryResourceType) { + this.lastTotal = resp.total ?? 0; + + if (this.watchItems?.bootstrapped) { + this.total.value = this.lastTotal; + } + } + + if (!spec.res) { + return; + } + + const resourceID = itemID(spec.res); + const id = opts.idFunc ? `${opts.idFunc(spec.res)}` : resourceID; + + const storeItem = (item: ResourceTyped) => { + if (!this.itemMap[resourceType][id]) { + this.itemMap[resourceType][id] = {}; + } + + this.itemMap[resourceType][id][resourceID] = {...item, sortFieldData: resp.sort_field_data}; + } + + switch (resp.event?.event_type) { + case EventType.CREATED: + storeItem(spec.res); + break; + case EventType.UPDATED: + storeItem(spec.res); + break; + case EventType.DESTROYED: + delete this.itemMap[resourceType][id][resourceID]; + + if (Object.keys(this.itemMap[resourceType][id]).length === 0) { + delete this.itemMap[resourceType][id]; + } + + break; + } + + this.updateItem(id, resourceID); + }; + } + + try { + const list = [primary].concat(resources); + for (const opts of list) { + const watch = new WatchFunc(handler(opts.resource.type || "", opts)); + let onStart: (() => void) | undefined; + let onError: ((err: Error) => void) | undefined; + + if (opts.resource.type === this.primaryResourceType) { + onStart = () => { + this.err.value = null; + this.watchItems?.reset(); + }; + + onError = (err: Error) => { + this.watchItems?.reset(); + this.loading.value = false; + this.err.value = err.message; + } + } + + await watch.createStream(opts, onStart, onError); + + this.watches.push(watch); + } + } catch (err) { + this.stop(); + + this.err.value = err.message; + + throw err; + } + } + + public stop() { + for (const w of this.watches) { + w.stop(); + } + + this.itemMap = {}; + this.loading.value = false; + this.watchItems?.reset(); + } + + public getRelatedResources(item: ResourceTyped, resourceType: string): Record> { + const id = itemID(item); + if (!this.itemMap[resourceType]) { + return {}; + } + + return this.itemMap[resourceType][id] ?? {}; + } + + private updateItem(id: string, resourceID: string) { + if (!this.watchItems || !this.primaryResourceType || !this.itemMap[this.primaryResourceType]) { + return; + } + + const mainGroup = this.itemMap[this.primaryResourceType][id]; + if (!mainGroup) { + this.watchItems.remove(resourceID); + + return; + } + + const main = mainGroup[Object.keys(mainGroup)[0]]; + + const item: ResourceSort = { + metadata: main.metadata, + spec: main.spec, + sortFieldData: main.sortFieldData, + }; + + for (const key in this.itemMap) { + const parts = this.itemMap[key][id]; + if (!parts) { + continue; + } + + let part: ResourceTyped | undefined; + for (const resourceID in parts) { + if (!part || (parts[resourceID]?.metadata?.updated || "") > (part?.metadata?.updated || "")) { + part = parts[resourceID]; + } + } + + if (!part) { + continue; + } + + item.spec = {...item.spec, ...part.spec}; + + if (part.status) { + item.status = {...part.status, ...item.status} + } + + if (part.metadata.labels) { + item.metadata.labels = {...item.metadata.labels, ...part.metadata.labels}; + } + } + + this.watchItems.createOrUpdate(item); + } +} + +const isRef = (value: T | WatchSource) => { + return "value" in value; +} diff --git a/frontend/src/components/SideBar/TSideBar.vue b/frontend/src/components/SideBar/TSideBar.vue new file mode 100644 index 00000000..fe7cc91a --- /dev/null +++ b/frontend/src/components/SideBar/TSideBar.vue @@ -0,0 +1,42 @@ + + + + + + diff --git a/frontend/src/components/SideBar/TSideBarList.vue b/frontend/src/components/SideBar/TSideBarList.vue new file mode 100644 index 00000000..95fc1091 --- /dev/null +++ b/frontend/src/components/SideBar/TSideBarList.vue @@ -0,0 +1,50 @@ + + + + + + diff --git a/frontend/src/components/SideBar/TSideBarNodesLogs.vue b/frontend/src/components/SideBar/TSideBarNodesLogs.vue new file mode 100644 index 00000000..6239d4d0 --- /dev/null +++ b/frontend/src/components/SideBar/TSideBarNodesLogs.vue @@ -0,0 +1,110 @@ + + + + + + diff --git a/frontend/src/components/TAlert.vue b/frontend/src/components/TAlert.vue new file mode 100644 index 00000000..63201a75 --- /dev/null +++ b/frontend/src/components/TAlert.vue @@ -0,0 +1,137 @@ + + + + + + diff --git a/frontend/src/components/TBreadcrumbs.vue b/frontend/src/components/TBreadcrumbs.vue new file mode 100644 index 00000000..14076da9 --- /dev/null +++ b/frontend/src/components/TBreadcrumbs.vue @@ -0,0 +1,81 @@ + + + + + + diff --git a/frontend/src/components/THeader/THeader.vue b/frontend/src/components/THeader/THeader.vue new file mode 100644 index 00000000..cffac75f --- /dev/null +++ b/frontend/src/components/THeader/THeader.vue @@ -0,0 +1,62 @@ + + + + + + diff --git a/frontend/src/components/TModal.vue b/frontend/src/components/TModal.vue new file mode 100644 index 00000000..bfd59a59 --- /dev/null +++ b/frontend/src/components/TModal.vue @@ -0,0 +1,65 @@ + + + + + + diff --git a/frontend/src/components/common/ActionsBox/TActionsBox.vue b/frontend/src/components/common/ActionsBox/TActionsBox.vue new file mode 100644 index 00000000..d0ddd748 --- /dev/null +++ b/frontend/src/components/common/ActionsBox/TActionsBox.vue @@ -0,0 +1,60 @@ + + + + + + diff --git a/frontend/src/components/common/ActionsBox/TActionsBoxItem.vue b/frontend/src/components/common/ActionsBox/TActionsBoxItem.vue new file mode 100644 index 00000000..5d121a58 --- /dev/null +++ b/frontend/src/components/common/ActionsBox/TActionsBoxItem.vue @@ -0,0 +1,54 @@ + + + + + + \ No newline at end of file diff --git a/frontend/src/components/common/Animation/TAnimation.vue b/frontend/src/components/common/Animation/TAnimation.vue new file mode 100644 index 00000000..8ae9da4f --- /dev/null +++ b/frontend/src/components/common/Animation/TAnimation.vue @@ -0,0 +1,50 @@ + + + + + + diff --git a/frontend/src/components/common/Animation/TGroupAnimation.vue b/frontend/src/components/common/Animation/TGroupAnimation.vue new file mode 100644 index 00000000..20a80cd7 --- /dev/null +++ b/frontend/src/components/common/Animation/TGroupAnimation.vue @@ -0,0 +1,25 @@ + + + + diff --git a/frontend/src/components/common/Button/IconButton.vue b/frontend/src/components/common/Button/IconButton.vue new file mode 100644 index 00000000..7cf7510d --- /dev/null +++ b/frontend/src/components/common/Button/IconButton.vue @@ -0,0 +1,58 @@ + + + + + + diff --git a/frontend/src/components/common/Button/TButton.vue b/frontend/src/components/common/Button/TButton.vue new file mode 100644 index 00000000..f6889335 --- /dev/null +++ b/frontend/src/components/common/Button/TButton.vue @@ -0,0 +1,235 @@ + + + + + + diff --git a/frontend/src/components/common/Button/TButtonGroup.vue b/frontend/src/components/common/Button/TButtonGroup.vue new file mode 100644 index 00000000..e2d7f7bf --- /dev/null +++ b/frontend/src/components/common/Button/TButtonGroup.vue @@ -0,0 +1,77 @@ + + + + + + diff --git a/frontend/src/components/common/Charts/RadialBar.vue b/frontend/src/components/common/Charts/RadialBar.vue new file mode 100644 index 00000000..8a5e9b2c --- /dev/null +++ b/frontend/src/components/common/Charts/RadialBar.vue @@ -0,0 +1,109 @@ + + + + diff --git a/frontend/src/components/common/Checkbox/TCheckbox.vue b/frontend/src/components/common/Checkbox/TCheckbox.vue new file mode 100644 index 00000000..3201c501 --- /dev/null +++ b/frontend/src/components/common/Checkbox/TCheckbox.vue @@ -0,0 +1,57 @@ + + + + + + diff --git a/frontend/src/components/common/CodeEditor/CodeEditor.vue b/frontend/src/components/common/CodeEditor/CodeEditor.vue new file mode 100644 index 00000000..f1f211d5 --- /dev/null +++ b/frontend/src/components/common/CodeEditor/CodeEditor.vue @@ -0,0 +1,131 @@ + + + + + + diff --git a/frontend/src/components/common/Icon/TIcon.vue b/frontend/src/components/common/Icon/TIcon.vue new file mode 100644 index 00000000..014fd638 --- /dev/null +++ b/frontend/src/components/common/Icon/TIcon.vue @@ -0,0 +1,144 @@ + + + + diff --git a/frontend/src/components/common/InfoLabel/TInfoLabel.vue b/frontend/src/components/common/InfoLabel/TInfoLabel.vue new file mode 100644 index 00000000..b036c96c --- /dev/null +++ b/frontend/src/components/common/InfoLabel/TInfoLabel.vue @@ -0,0 +1,75 @@ + + + + + + diff --git a/frontend/src/components/common/Labels/Labels.vue b/frontend/src/components/common/Labels/Labels.vue new file mode 100644 index 00000000..02679ba1 --- /dev/null +++ b/frontend/src/components/common/Labels/Labels.vue @@ -0,0 +1,84 @@ + + + + + + diff --git a/frontend/src/components/common/List/TList.vue b/frontend/src/components/common/List/TList.vue new file mode 100644 index 00000000..a1578e66 --- /dev/null +++ b/frontend/src/components/common/List/TList.vue @@ -0,0 +1,342 @@ + + + + + + diff --git a/frontend/src/components/common/List/TListItem.vue b/frontend/src/components/common/List/TListItem.vue new file mode 100644 index 00000000..3b6981ef --- /dev/null +++ b/frontend/src/components/common/List/TListItem.vue @@ -0,0 +1,91 @@ + + + + + + diff --git a/frontend/src/components/common/LogViewer/LogViewer.vue b/frontend/src/components/common/LogViewer/LogViewer.vue new file mode 100644 index 00000000..e02b3f3e --- /dev/null +++ b/frontend/src/components/common/LogViewer/LogViewer.vue @@ -0,0 +1,164 @@ + + + + + + diff --git a/frontend/src/components/common/MenuItem/TMenuItem.vue b/frontend/src/components/common/MenuItem/TMenuItem.vue new file mode 100644 index 00000000..83ece1cf --- /dev/null +++ b/frontend/src/components/common/MenuItem/TMenuItem.vue @@ -0,0 +1,61 @@ + + + + + + diff --git a/frontend/src/components/common/Notification/TNotification.vue b/frontend/src/components/common/Notification/TNotification.vue new file mode 100644 index 00000000..66b0a4b2 --- /dev/null +++ b/frontend/src/components/common/Notification/TNotification.vue @@ -0,0 +1,148 @@ + + + + + + diff --git a/frontend/src/components/common/OngoingTasks/OngoingTasks.vue b/frontend/src/components/common/OngoingTasks/OngoingTasks.vue new file mode 100644 index 00000000..8e463d7e --- /dev/null +++ b/frontend/src/components/common/OngoingTasks/OngoingTasks.vue @@ -0,0 +1,152 @@ + + + + + + \ No newline at end of file diff --git a/frontend/src/components/common/PageHeader.vue b/frontend/src/components/common/PageHeader.vue new file mode 100644 index 00000000..70769eff --- /dev/null +++ b/frontend/src/components/common/PageHeader.vue @@ -0,0 +1,29 @@ + + + + + + diff --git a/frontend/src/components/common/Pagination/TPagination.vue b/frontend/src/components/common/Pagination/TPagination.vue new file mode 100644 index 00000000..87461fd4 --- /dev/null +++ b/frontend/src/components/common/Pagination/TPagination.vue @@ -0,0 +1,175 @@ + + + + + + diff --git a/frontend/src/components/common/SelectList/TSelectList.vue b/frontend/src/components/common/SelectList/TSelectList.vue new file mode 100644 index 00000000..3f25b261 --- /dev/null +++ b/frontend/src/components/common/SelectList/TSelectList.vue @@ -0,0 +1,138 @@ + + + + + + diff --git a/frontend/src/components/common/Shell/TShell.vue b/frontend/src/components/common/Shell/TShell.vue new file mode 100644 index 00000000..d8121137 --- /dev/null +++ b/frontend/src/components/common/Shell/TShell.vue @@ -0,0 +1,47 @@ + + + + + + diff --git a/frontend/src/components/common/SlideDownWrapper/TSlideDownWrapper.vue b/frontend/src/components/common/SlideDownWrapper/TSlideDownWrapper.vue new file mode 100644 index 00000000..38c0e146 --- /dev/null +++ b/frontend/src/components/common/SlideDownWrapper/TSlideDownWrapper.vue @@ -0,0 +1,77 @@ + + + + + + diff --git a/frontend/src/components/common/Spinner/TSpinner.vue b/frontend/src/components/common/Spinner/TSpinner.vue new file mode 100644 index 00000000..1495c426 --- /dev/null +++ b/frontend/src/components/common/Spinner/TSpinner.vue @@ -0,0 +1,49 @@ + + + + \ No newline at end of file diff --git a/frontend/src/components/common/Status/TStatus.vue b/frontend/src/components/common/Status/TStatus.vue new file mode 100644 index 00000000..84f4485f --- /dev/null +++ b/frontend/src/components/common/Status/TStatus.vue @@ -0,0 +1,201 @@ + + + + + + diff --git a/frontend/src/components/common/Suspended/TSuspended.vue b/frontend/src/components/common/Suspended/TSuspended.vue new file mode 100644 index 00000000..c7a9b94b --- /dev/null +++ b/frontend/src/components/common/Suspended/TSuspended.vue @@ -0,0 +1,37 @@ + + + + + + diff --git a/frontend/src/components/common/TInput/TInput.vue b/frontend/src/components/common/TInput/TInput.vue new file mode 100644 index 00000000..445539fb --- /dev/null +++ b/frontend/src/components/common/TInput/TInput.vue @@ -0,0 +1,178 @@ + + + + + + diff --git a/frontend/src/components/common/Tabs/TabButton.vue b/frontend/src/components/common/Tabs/TabButton.vue new file mode 100644 index 00000000..29b725a2 --- /dev/null +++ b/frontend/src/components/common/Tabs/TabButton.vue @@ -0,0 +1,44 @@ + + + + + + diff --git a/frontend/src/components/common/Tabs/TabList.vue b/frontend/src/components/common/Tabs/TabList.vue new file mode 100644 index 00000000..89467c64 --- /dev/null +++ b/frontend/src/components/common/Tabs/TabList.vue @@ -0,0 +1,15 @@ + + + + \ No newline at end of file diff --git a/frontend/src/components/common/Tabs/TabsHeader.vue b/frontend/src/components/common/Tabs/TabsHeader.vue new file mode 100644 index 00000000..5d6a48bd --- /dev/null +++ b/frontend/src/components/common/Tabs/TabsHeader.vue @@ -0,0 +1,11 @@ + + \ No newline at end of file diff --git a/frontend/src/components/common/Tag/TTag.vue b/frontend/src/components/common/Tag/TTag.vue new file mode 100644 index 00000000..e286013a --- /dev/null +++ b/frontend/src/components/common/Tag/TTag.vue @@ -0,0 +1,30 @@ + + + + + + diff --git a/frontend/src/components/common/Tooltip/Tooltip.vue b/frontend/src/components/common/Tooltip/Tooltip.vue new file mode 100644 index 00000000..ec207aea --- /dev/null +++ b/frontend/src/components/common/Tooltip/Tooltip.vue @@ -0,0 +1,53 @@ + + + + diff --git a/frontend/src/components/common/UserInfo/UserInfo.vue b/frontend/src/components/common/UserInfo/UserInfo.vue new file mode 100644 index 00000000..ab5e9e49 --- /dev/null +++ b/frontend/src/components/common/UserInfo/UserInfo.vue @@ -0,0 +1,77 @@ + + + + diff --git a/frontend/src/components/common/Watch/Watch.vue b/frontend/src/components/common/Watch/Watch.vue new file mode 100644 index 00000000..a8380f5b --- /dev/null +++ b/frontend/src/components/common/Watch/Watch.vue @@ -0,0 +1,80 @@ + + + + + + diff --git a/frontend/src/components/icons/IconAWS.vue b/frontend/src/components/icons/IconAWS.vue new file mode 100644 index 00000000..b4b50e27 --- /dev/null +++ b/frontend/src/components/icons/IconAWS.vue @@ -0,0 +1,36 @@ + + diff --git a/frontend/src/components/icons/IconActionHorizontal.vue b/frontend/src/components/icons/IconActionHorizontal.vue new file mode 100644 index 00000000..d0e41026 --- /dev/null +++ b/frontend/src/components/icons/IconActionHorizontal.vue @@ -0,0 +1,19 @@ + + diff --git a/frontend/src/components/icons/IconActionVertical.vue b/frontend/src/components/icons/IconActionVertical.vue new file mode 100644 index 00000000..4762ed46 --- /dev/null +++ b/frontend/src/components/icons/IconActionVertical.vue @@ -0,0 +1,23 @@ + + diff --git a/frontend/src/components/icons/IconArrowDown.vue b/frontend/src/components/icons/IconArrowDown.vue new file mode 100644 index 00000000..852cc3e1 --- /dev/null +++ b/frontend/src/components/icons/IconArrowDown.vue @@ -0,0 +1,17 @@ + + diff --git a/frontend/src/components/icons/IconArrowLeft.vue b/frontend/src/components/icons/IconArrowLeft.vue new file mode 100644 index 00000000..4b5c9662 --- /dev/null +++ b/frontend/src/components/icons/IconArrowLeft.vue @@ -0,0 +1,17 @@ + + diff --git a/frontend/src/components/icons/IconArrowRight.vue b/frontend/src/components/icons/IconArrowRight.vue new file mode 100644 index 00000000..51fdf983 --- /dev/null +++ b/frontend/src/components/icons/IconArrowRight.vue @@ -0,0 +1,17 @@ + + diff --git a/frontend/src/components/icons/IconArrowRightSquare.vue b/frontend/src/components/icons/IconArrowRightSquare.vue new file mode 100644 index 00000000..83cada97 --- /dev/null +++ b/frontend/src/components/icons/IconArrowRightSquare.vue @@ -0,0 +1,29 @@ + + diff --git a/frontend/src/components/icons/IconArrowUp.vue b/frontend/src/components/icons/IconArrowUp.vue new file mode 100644 index 00000000..213b10ae --- /dev/null +++ b/frontend/src/components/icons/IconArrowUp.vue @@ -0,0 +1,17 @@ + + diff --git a/frontend/src/components/icons/IconAttention.vue b/frontend/src/components/icons/IconAttention.vue new file mode 100644 index 00000000..1d413d23 --- /dev/null +++ b/frontend/src/components/icons/IconAttention.vue @@ -0,0 +1,21 @@ + + diff --git a/frontend/src/components/icons/IconBox.vue b/frontend/src/components/icons/IconBox.vue new file mode 100644 index 00000000..84975ef0 --- /dev/null +++ b/frontend/src/components/icons/IconBox.vue @@ -0,0 +1,19 @@ + + diff --git a/frontend/src/components/icons/IconChange.vue b/frontend/src/components/icons/IconChange.vue new file mode 100644 index 00000000..adde817b --- /dev/null +++ b/frontend/src/components/icons/IconChange.vue @@ -0,0 +1,24 @@ + + diff --git a/frontend/src/components/icons/IconCheck.vue b/frontend/src/components/icons/IconCheck.vue new file mode 100644 index 00000000..3876b964 --- /dev/null +++ b/frontend/src/components/icons/IconCheck.vue @@ -0,0 +1,19 @@ + + diff --git a/frontend/src/components/icons/IconCheckInCircle.vue b/frontend/src/components/icons/IconCheckInCircle.vue new file mode 100644 index 00000000..bdf67ccc --- /dev/null +++ b/frontend/src/components/icons/IconCheckInCircle.vue @@ -0,0 +1,15 @@ + + diff --git a/frontend/src/components/icons/IconCheckInCircleClassic.vue b/frontend/src/components/icons/IconCheckInCircleClassic.vue new file mode 100644 index 00000000..5263db43 --- /dev/null +++ b/frontend/src/components/icons/IconCheckInCircleClassic.vue @@ -0,0 +1,24 @@ + + diff --git a/frontend/src/components/icons/IconClose.vue b/frontend/src/components/icons/IconClose.vue new file mode 100644 index 00000000..c69d28c0 --- /dev/null +++ b/frontend/src/components/icons/IconClose.vue @@ -0,0 +1,20 @@ + + diff --git a/frontend/src/components/icons/IconCloudConnection.vue b/frontend/src/components/icons/IconCloudConnection.vue new file mode 100644 index 00000000..06aaba4f --- /dev/null +++ b/frontend/src/components/icons/IconCloudConnection.vue @@ -0,0 +1,39 @@ + + diff --git a/frontend/src/components/icons/IconClusters.vue b/frontend/src/components/icons/IconClusters.vue new file mode 100644 index 00000000..49a10596 --- /dev/null +++ b/frontend/src/components/icons/IconClusters.vue @@ -0,0 +1,34 @@ + + diff --git a/frontend/src/components/icons/IconClustersBig.vue b/frontend/src/components/icons/IconClustersBig.vue new file mode 100644 index 00000000..0a2512c0 --- /dev/null +++ b/frontend/src/components/icons/IconClustersBig.vue @@ -0,0 +1,51 @@ + + + \ No newline at end of file diff --git a/frontend/src/components/icons/IconComplete.vue b/frontend/src/components/icons/IconComplete.vue new file mode 100644 index 00000000..69271420 --- /dev/null +++ b/frontend/src/components/icons/IconComplete.vue @@ -0,0 +1,15 @@ + + + \ No newline at end of file diff --git a/frontend/src/components/icons/IconCopy.vue b/frontend/src/components/icons/IconCopy.vue new file mode 100644 index 00000000..e4089db4 --- /dev/null +++ b/frontend/src/components/icons/IconCopy.vue @@ -0,0 +1,24 @@ + + diff --git a/frontend/src/components/icons/IconDashboard.vue b/frontend/src/components/icons/IconDashboard.vue new file mode 100644 index 00000000..9e92840a --- /dev/null +++ b/frontend/src/components/icons/IconDashboard.vue @@ -0,0 +1,23 @@ + + diff --git a/frontend/src/components/icons/IconDelete.vue b/frontend/src/components/icons/IconDelete.vue new file mode 100644 index 00000000..d3a6675c --- /dev/null +++ b/frontend/src/components/icons/IconDelete.vue @@ -0,0 +1,39 @@ + + diff --git a/frontend/src/components/icons/IconDot.vue b/frontend/src/components/icons/IconDot.vue new file mode 100644 index 00000000..7ec9f50a --- /dev/null +++ b/frontend/src/components/icons/IconDot.vue @@ -0,0 +1,15 @@ + + diff --git a/frontend/src/components/icons/IconDropRight.vue b/frontend/src/components/icons/IconDropRight.vue new file mode 100644 index 00000000..e478754d --- /dev/null +++ b/frontend/src/components/icons/IconDropRight.vue @@ -0,0 +1,15 @@ + + diff --git a/frontend/src/components/icons/IconDropUp.vue b/frontend/src/components/icons/IconDropUp.vue new file mode 100644 index 00000000..d97a7a56 --- /dev/null +++ b/frontend/src/components/icons/IconDropUp.vue @@ -0,0 +1,19 @@ + + diff --git a/frontend/src/components/icons/IconDropdown.vue b/frontend/src/components/icons/IconDropdown.vue new file mode 100644 index 00000000..d356dfd8 --- /dev/null +++ b/frontend/src/components/icons/IconDropdown.vue @@ -0,0 +1,19 @@ + + diff --git a/frontend/src/components/icons/IconEdit.vue b/frontend/src/components/icons/IconEdit.vue new file mode 100644 index 00000000..2d2a8b6a --- /dev/null +++ b/frontend/src/components/icons/IconEdit.vue @@ -0,0 +1,23 @@ + + diff --git a/frontend/src/components/icons/IconError.vue b/frontend/src/components/icons/IconError.vue new file mode 100644 index 00000000..6fa35d86 --- /dev/null +++ b/frontend/src/components/icons/IconError.vue @@ -0,0 +1,29 @@ + + diff --git a/frontend/src/components/icons/IconExternalLink.vue b/frontend/src/components/icons/IconExternalLink.vue new file mode 100644 index 00000000..68f6427e --- /dev/null +++ b/frontend/src/components/icons/IconExternalLink.vue @@ -0,0 +1,22 @@ + + + \ No newline at end of file diff --git a/frontend/src/components/icons/IconFailAuth.vue b/frontend/src/components/icons/IconFailAuth.vue new file mode 100644 index 00000000..b62a290b --- /dev/null +++ b/frontend/src/components/icons/IconFailAuth.vue @@ -0,0 +1,51 @@ + + + \ No newline at end of file diff --git a/frontend/src/components/icons/IconGCP.vue b/frontend/src/components/icons/IconGCP.vue new file mode 100644 index 00000000..3254fa62 --- /dev/null +++ b/frontend/src/components/icons/IconGCP.vue @@ -0,0 +1,34 @@ + + + \ No newline at end of file diff --git a/frontend/src/components/icons/IconHeaderDropdownLoading.vue b/frontend/src/components/icons/IconHeaderDropdownLoading.vue new file mode 100644 index 00000000..75d7f530 --- /dev/null +++ b/frontend/src/components/icons/IconHeaderDropdownLoading.vue @@ -0,0 +1,65 @@ + + + + + + \ No newline at end of file diff --git a/frontend/src/components/icons/IconHeaderLogo.vue b/frontend/src/components/icons/IconHeaderLogo.vue new file mode 100644 index 00000000..951228e6 --- /dev/null +++ b/frontend/src/components/icons/IconHeaderLogo.vue @@ -0,0 +1,42 @@ + + + + \ No newline at end of file diff --git a/frontend/src/components/icons/IconHome.vue b/frontend/src/components/icons/IconHome.vue new file mode 100644 index 00000000..364b39fe --- /dev/null +++ b/frontend/src/components/icons/IconHome.vue @@ -0,0 +1,15 @@ + + + + \ No newline at end of file diff --git a/frontend/src/components/icons/IconInProgress.vue b/frontend/src/components/icons/IconInProgress.vue new file mode 100644 index 00000000..719feaaf --- /dev/null +++ b/frontend/src/components/icons/IconInProgress.vue @@ -0,0 +1,72 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/icons/IconInfo.vue b/frontend/src/components/icons/IconInfo.vue new file mode 100644 index 00000000..d6e1a60b --- /dev/null +++ b/frontend/src/components/icons/IconInfo.vue @@ -0,0 +1,29 @@ + + diff --git a/frontend/src/components/icons/IconKey.vue b/frontend/src/components/icons/IconKey.vue new file mode 100644 index 00000000..dced2b24 --- /dev/null +++ b/frontend/src/components/icons/IconKey.vue @@ -0,0 +1,30 @@ + + + \ No newline at end of file diff --git a/frontend/src/components/icons/IconKubeConfig.vue b/frontend/src/components/icons/IconKubeConfig.vue new file mode 100644 index 00000000..f59b72ae --- /dev/null +++ b/frontend/src/components/icons/IconKubeConfig.vue @@ -0,0 +1,26 @@ + + diff --git a/frontend/src/components/icons/IconKubernetes.vue b/frontend/src/components/icons/IconKubernetes.vue new file mode 100644 index 00000000..f8d4886f --- /dev/null +++ b/frontend/src/components/icons/IconKubernetes.vue @@ -0,0 +1,59 @@ + + diff --git a/frontend/src/components/icons/IconLinkDown.vue b/frontend/src/components/icons/IconLinkDown.vue new file mode 100644 index 00000000..50230439 --- /dev/null +++ b/frontend/src/components/icons/IconLinkDown.vue @@ -0,0 +1,22 @@ + + \ No newline at end of file diff --git a/frontend/src/components/icons/IconLoading.vue b/frontend/src/components/icons/IconLoading.vue new file mode 100644 index 00000000..8ffce702 --- /dev/null +++ b/frontend/src/components/icons/IconLoading.vue @@ -0,0 +1,55 @@ + + diff --git a/frontend/src/components/icons/IconLog.vue b/frontend/src/components/icons/IconLog.vue new file mode 100644 index 00000000..8b8118c5 --- /dev/null +++ b/frontend/src/components/icons/IconLog.vue @@ -0,0 +1,26 @@ + + diff --git a/frontend/src/components/icons/IconLogo.vue b/frontend/src/components/icons/IconLogo.vue new file mode 100644 index 00000000..d9a6fc0f --- /dev/null +++ b/frontend/src/components/icons/IconLogo.vue @@ -0,0 +1,95 @@ + + + \ No newline at end of file diff --git a/frontend/src/components/icons/IconLongArrowDown.vue b/frontend/src/components/icons/IconLongArrowDown.vue new file mode 100644 index 00000000..3e655e06 --- /dev/null +++ b/frontend/src/components/icons/IconLongArrowDown.vue @@ -0,0 +1,24 @@ + + diff --git a/frontend/src/components/icons/IconLongArrowLeft.vue b/frontend/src/components/icons/IconLongArrowLeft.vue new file mode 100644 index 00000000..2dd29d7e --- /dev/null +++ b/frontend/src/components/icons/IconLongArrowLeft.vue @@ -0,0 +1,24 @@ + + diff --git a/frontend/src/components/icons/IconLongArrowRight.vue b/frontend/src/components/icons/IconLongArrowRight.vue new file mode 100644 index 00000000..afc275be --- /dev/null +++ b/frontend/src/components/icons/IconLongArrowRight.vue @@ -0,0 +1,24 @@ + + diff --git a/frontend/src/components/icons/IconLongArrowTop.vue b/frontend/src/components/icons/IconLongArrowTop.vue new file mode 100644 index 00000000..7a6c264c --- /dev/null +++ b/frontend/src/components/icons/IconLongArrowTop.vue @@ -0,0 +1,24 @@ + + diff --git a/frontend/src/components/icons/IconMinus.vue b/frontend/src/components/icons/IconMinus.vue new file mode 100644 index 00000000..143c322e --- /dev/null +++ b/frontend/src/components/icons/IconMinus.vue @@ -0,0 +1,15 @@ + + diff --git a/frontend/src/components/icons/IconNoConnection.vue b/frontend/src/components/icons/IconNoConnection.vue new file mode 100644 index 00000000..172fdc41 --- /dev/null +++ b/frontend/src/components/icons/IconNoConnection.vue @@ -0,0 +1,45 @@ + + + \ No newline at end of file diff --git a/frontend/src/components/icons/IconNodes.vue b/frontend/src/components/icons/IconNodes.vue new file mode 100644 index 00000000..74e8c186 --- /dev/null +++ b/frontend/src/components/icons/IconNodes.vue @@ -0,0 +1,54 @@ + + diff --git a/frontend/src/components/icons/IconOngoingTasks.vue b/frontend/src/components/icons/IconOngoingTasks.vue new file mode 100644 index 00000000..29c04189 --- /dev/null +++ b/frontend/src/components/icons/IconOngoingTasks.vue @@ -0,0 +1,26 @@ + + diff --git a/frontend/src/components/icons/IconOverview.vue b/frontend/src/components/icons/IconOverview.vue new file mode 100644 index 00000000..ccf63a51 --- /dev/null +++ b/frontend/src/components/icons/IconOverview.vue @@ -0,0 +1,29 @@ + + diff --git a/frontend/src/components/icons/IconPin.vue b/frontend/src/components/icons/IconPin.vue new file mode 100644 index 00000000..92fa9388 --- /dev/null +++ b/frontend/src/components/icons/IconPin.vue @@ -0,0 +1,34 @@ + + diff --git a/frontend/src/components/icons/IconPlus.vue b/frontend/src/components/icons/IconPlus.vue new file mode 100644 index 00000000..fad67ee0 --- /dev/null +++ b/frontend/src/components/icons/IconPlus.vue @@ -0,0 +1,20 @@ + + diff --git a/frontend/src/components/icons/IconPodes.vue b/frontend/src/components/icons/IconPodes.vue new file mode 100644 index 00000000..3e4efa99 --- /dev/null +++ b/frontend/src/components/icons/IconPodes.vue @@ -0,0 +1,29 @@ + + diff --git a/frontend/src/components/icons/IconQuestion.vue b/frontend/src/components/icons/IconQuestion.vue new file mode 100644 index 00000000..aa976646 --- /dev/null +++ b/frontend/src/components/icons/IconQuestion.vue @@ -0,0 +1,27 @@ + + + \ No newline at end of file diff --git a/frontend/src/components/icons/IconReboot.vue b/frontend/src/components/icons/IconReboot.vue new file mode 100644 index 00000000..0bd05df1 --- /dev/null +++ b/frontend/src/components/icons/IconReboot.vue @@ -0,0 +1,29 @@ + + diff --git a/frontend/src/components/icons/IconRefresh.vue b/frontend/src/components/icons/IconRefresh.vue new file mode 100644 index 00000000..db329748 --- /dev/null +++ b/frontend/src/components/icons/IconRefresh.vue @@ -0,0 +1,15 @@ + + diff --git a/frontend/src/components/icons/IconReset.vue b/frontend/src/components/icons/IconReset.vue new file mode 100644 index 00000000..1fbb5e53 --- /dev/null +++ b/frontend/src/components/icons/IconReset.vue @@ -0,0 +1,23 @@ + + diff --git a/frontend/src/components/icons/IconRollback.vue b/frontend/src/components/icons/IconRollback.vue new file mode 100644 index 00000000..53eb9db8 --- /dev/null +++ b/frontend/src/components/icons/IconRollback.vue @@ -0,0 +1,16 @@ + + + \ No newline at end of file diff --git a/frontend/src/components/icons/IconSearch.vue b/frontend/src/components/icons/IconSearch.vue new file mode 100644 index 00000000..f47b914d --- /dev/null +++ b/frontend/src/components/icons/IconSearch.vue @@ -0,0 +1,24 @@ + + diff --git a/frontend/src/components/icons/IconSettings.vue b/frontend/src/components/icons/IconSettings.vue new file mode 100644 index 00000000..dd824b36 --- /dev/null +++ b/frontend/src/components/icons/IconSettings.vue @@ -0,0 +1,24 @@ + + diff --git a/frontend/src/components/icons/IconSettingsToggle.vue b/frontend/src/components/icons/IconSettingsToggle.vue new file mode 100644 index 00000000..5458d67a --- /dev/null +++ b/frontend/src/components/icons/IconSettingsToggle.vue @@ -0,0 +1,17 @@ + + diff --git a/frontend/src/components/icons/IconSidero.vue b/frontend/src/components/icons/IconSidero.vue new file mode 100644 index 00000000..84f391e9 --- /dev/null +++ b/frontend/src/components/icons/IconSidero.vue @@ -0,0 +1,95 @@ + + + \ No newline at end of file diff --git a/frontend/src/components/icons/IconSideroMonochrome.vue b/frontend/src/components/icons/IconSideroMonochrome.vue new file mode 100644 index 00000000..fcfe6787 --- /dev/null +++ b/frontend/src/components/icons/IconSideroMonochrome.vue @@ -0,0 +1,38 @@ + + + \ No newline at end of file diff --git a/frontend/src/components/icons/IconTalosConfig.vue b/frontend/src/components/icons/IconTalosConfig.vue new file mode 100644 index 00000000..ca4e037f --- /dev/null +++ b/frontend/src/components/icons/IconTalosConfig.vue @@ -0,0 +1,23 @@ + + diff --git a/frontend/src/components/icons/IconTask.vue b/frontend/src/components/icons/IconTask.vue new file mode 100644 index 00000000..52835019 --- /dev/null +++ b/frontend/src/components/icons/IconTask.vue @@ -0,0 +1,20 @@ + + + diff --git a/frontend/src/components/icons/IconTerminal.vue b/frontend/src/components/icons/IconTerminal.vue new file mode 100644 index 00000000..15a64e99 --- /dev/null +++ b/frontend/src/components/icons/IconTerminal.vue @@ -0,0 +1,24 @@ + + + \ No newline at end of file diff --git a/frontend/src/components/icons/IconTime.vue b/frontend/src/components/icons/IconTime.vue new file mode 100644 index 00000000..74960cd3 --- /dev/null +++ b/frontend/src/components/icons/IconTime.vue @@ -0,0 +1,24 @@ + + diff --git a/frontend/src/components/icons/IconUnknown.vue b/frontend/src/components/icons/IconUnknown.vue new file mode 100644 index 00000000..010e7f35 --- /dev/null +++ b/frontend/src/components/icons/IconUnknown.vue @@ -0,0 +1,31 @@ + + + \ No newline at end of file diff --git a/frontend/src/components/icons/IconUnlink.vue b/frontend/src/components/icons/IconUnlink.vue new file mode 100644 index 00000000..de159c79 --- /dev/null +++ b/frontend/src/components/icons/IconUnlink.vue @@ -0,0 +1,44 @@ + + diff --git a/frontend/src/components/icons/IconUpgradeEmptyState.vue b/frontend/src/components/icons/IconUpgradeEmptyState.vue new file mode 100644 index 00000000..22247c7d --- /dev/null +++ b/frontend/src/components/icons/IconUpgradeEmptyState.vue @@ -0,0 +1,81 @@ + + + \ No newline at end of file diff --git a/frontend/src/components/icons/IconUpload.vue b/frontend/src/components/icons/IconUpload.vue new file mode 100644 index 00000000..ad7e7e48 --- /dev/null +++ b/frontend/src/components/icons/IconUpload.vue @@ -0,0 +1,64 @@ + + diff --git a/frontend/src/components/icons/IconWaiting.vue b/frontend/src/components/icons/IconWaiting.vue new file mode 100644 index 00000000..49426bbd --- /dev/null +++ b/frontend/src/components/icons/IconWaiting.vue @@ -0,0 +1,16 @@ + + + \ No newline at end of file diff --git a/frontend/src/components/icons/IconWarning.vue b/frontend/src/components/icons/IconWarning.vue new file mode 100644 index 00000000..34c70541 --- /dev/null +++ b/frontend/src/components/icons/IconWarning.vue @@ -0,0 +1,29 @@ + + diff --git a/frontend/src/components/icons/IconWarningClear.vue b/frontend/src/components/icons/IconWarningClear.vue new file mode 100644 index 00000000..efbd4ae9 --- /dev/null +++ b/frontend/src/components/icons/IconWarningClear.vue @@ -0,0 +1,22 @@ + + diff --git a/frontend/src/constants/index.ts b/frontend/src/constants/index.ts new file mode 100644 index 00000000..ab57779d --- /dev/null +++ b/frontend/src/constants/index.ts @@ -0,0 +1,57 @@ +// Copyright (c) 2024 Sidero Labs, Inc. +// +// Use of this software is governed by the Business Source License +// included in the LICENSE file. + +export enum TPodsViewFilterOptions { + ALL = "All", + PENDING = "Pending", + RUNNING = "Running", + FAILED = "Failed", + SUCCEEDED = "Succeeded", + UNKNOWN = "Unknown" +} + +export enum NodesViewFilterOptions { + ALL = "All", + READY = "Ready", + UNKNOWN = "Unknown", + NOT_READY = "Not Ready", +} + +export enum TServersServersFilterOptions { + ALL = "All", + ON = "On", + OFF = "Off", +} + +export enum TServersStatusesFilterOptions { + ALL = "All", + READY = "Ready", + NOT_ACCEPTED = "Not Accepted", + FAILED = "Failed", +} + +export enum TCommonStatuses { + ALL = "All", + READY = "Ready", + NOT_READY = "Not Ready", + PENDING = "Pending", + RUNNING = "Running", + SUCCEEDED = "Succeeded", + COMPLETED = "Completed", + FAILED = "Failed", + ERROR = 'Error', + UNKNOWN = "Unknown", + HEALTH_UNKNOWN = "Health Unknown", + UNHEALTHY = "Unhealthy", + HEALTHY = "Healthy", + ON = 'On', + OFF = 'Off', + TRUE = 'True', + FALSE = 'False', + UP_TO_DATE = 'Up-to-Date', + OUTDATED = 'Outdated', + APPLIED = 'Applied', + LOADING = "Loading...", +} \ No newline at end of file diff --git a/frontend/src/context.ts b/frontend/src/context.ts new file mode 100644 index 00000000..f2f9ca23 --- /dev/null +++ b/frontend/src/context.ts @@ -0,0 +1,55 @@ +// Copyright (c) 2024 Sidero Labs, Inc. +// +// Use of this software is governed by the Business Source License +// included in the LICENSE file. + +import { ref } from 'vue'; +import { useRoute } from 'vue-router'; +import { WatchContext } from '@/api/watch'; + +export namespace context { + export const current:any = ref(localStorage.context ? JSON.parse(localStorage.context) : null); + + export const capabilities = { + capi: ref(false), + sidero: ref(false), + packet: ref(false), + }; +} + +export function changeContext(c: Object) { + localStorage.context = JSON.stringify(c); + + context.current.value = c; +} + +export function getContext(route: any = null): WatchContext { + route = route || useRoute(); + + const cluster = clusterName(); + + const res: WatchContext = { + cluster: cluster || "", + }; + + const machine = route.params.machine ?? route.query.machine; + if (machine) { + res.nodes = [machine]; + } + + return res; +} + +export function clusterName(): string | null { + const route = useRoute(); + + if (route && route.params.cluster) { + return route.params.cluster as string; + } + + if (route && route.query.cluster) { + return route.query.cluster as string; + } + + return context.current.value ? context.current.value.name : null; +} \ No newline at end of file diff --git a/frontend/src/fonts.css b/frontend/src/fonts.css new file mode 100644 index 00000000..c0e4a255 --- /dev/null +++ b/frontend/src/fonts.css @@ -0,0 +1,583 @@ +/* +Copyright (c) 2024 Sidero Labs, Inc. + +Use of this software is governed by the Business Source License +included in the LICENSE file. +*/ + +/* cyrillic-ext */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 300; + font-display: swap; + src: url(fonts/KFOlCnqEu92Fr1MmSU5fCRc4EsA.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 300; + font-display: swap; + src: url(fonts/KFOlCnqEu92Fr1MmSU5fABc4EsA.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 300; + font-display: swap; + src: url(fonts/KFOlCnqEu92Fr1MmSU5fCBc4EsA.woff2) format('woff2'); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 300; + font-display: swap; + src: url(fonts/KFOlCnqEu92Fr1MmSU5fBxc4EsA.woff2) format('woff2'); + unicode-range: U+0370-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 300; + font-display: swap; + src: url(fonts/KFOlCnqEu92Fr1MmSU5fCxc4EsA.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 300; + font-display: swap; + src: url(fonts/KFOlCnqEu92Fr1MmSU5fChc4EsA.woff2) format('woff2'); + unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 300; + font-display: swap; + src: url(fonts/KFOlCnqEu92Fr1MmSU5fBBc4.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(fonts/KFOmCnqEu92Fr1Mu72xKOzY.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(fonts/KFOmCnqEu92Fr1Mu5mxKOzY.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(fonts/KFOmCnqEu92Fr1Mu7mxKOzY.woff2) format('woff2'); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(fonts/KFOmCnqEu92Fr1Mu4WxKOzY.woff2) format('woff2'); + unicode-range: U+0370-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(fonts/KFOmCnqEu92Fr1Mu7WxKOzY.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(fonts/KFOmCnqEu92Fr1Mu7GxKOzY.woff2) format('woff2'); + unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(fonts/KFOmCnqEu92Fr1Mu4mxK.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 500; + font-display: swap; + src: url(fonts/KFOlCnqEu92Fr1MmEU9fCRc4EsA.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 500; + font-display: swap; + src: url(fonts/KFOlCnqEu92Fr1MmEU9fABc4EsA.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 500; + font-display: swap; + src: url(fonts/KFOlCnqEu92Fr1MmEU9fCBc4EsA.woff2) format('woff2'); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 500; + font-display: swap; + src: url(fonts/KFOlCnqEu92Fr1MmEU9fBxc4EsA.woff2) format('woff2'); + unicode-range: U+0370-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 500; + font-display: swap; + src: url(fonts/KFOlCnqEu92Fr1MmEU9fCxc4EsA.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 500; + font-display: swap; + src: url(fonts/KFOlCnqEu92Fr1MmEU9fChc4EsA.woff2) format('woff2'); + unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 500; + font-display: swap; + src: url(fonts/KFOlCnqEu92Fr1MmEU9fBBc4.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url(fonts/KFOlCnqEu92Fr1MmWUlfCRc4EsA.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url(fonts/KFOlCnqEu92Fr1MmWUlfABc4EsA.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url(fonts/KFOlCnqEu92Fr1MmWUlfCBc4EsA.woff2) format('woff2'); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url(fonts/KFOlCnqEu92Fr1MmWUlfBxc4EsA.woff2) format('woff2'); + unicode-range: U+0370-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url(fonts/KFOlCnqEu92Fr1MmWUlfCxc4EsA.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url(fonts/KFOlCnqEu92Fr1MmWUlfChc4EsA.woff2) format('woff2'); + unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url(fonts/KFOlCnqEu92Fr1MmWUlfBBc4.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Roboto Mono'; + font-style: italic; + font-weight: 300; + font-display: swap; + src: url(fonts/L0x7DF4xlVMF-BfR8bXMIjhOm3CWWoKC.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Roboto Mono'; + font-style: italic; + font-weight: 300; + font-display: swap; + src: url(fonts/L0x7DF4xlVMF-BfR8bXMIjhOm3mWWoKC.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek */ +@font-face { + font-family: 'Roboto Mono'; + font-style: italic; + font-weight: 300; + font-display: swap; + src: url(fonts/L0x7DF4xlVMF-BfR8bXMIjhOm36WWoKC.woff2) format('woff2'); + unicode-range: U+0370-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Roboto Mono'; + font-style: italic; + font-weight: 300; + font-display: swap; + src: url(fonts/L0x7DF4xlVMF-BfR8bXMIjhOm3KWWoKC.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Roboto Mono'; + font-style: italic; + font-weight: 300; + font-display: swap; + src: url(fonts/L0x7DF4xlVMF-BfR8bXMIjhOm3OWWoKC.woff2) format('woff2'); + unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Roboto Mono'; + font-style: italic; + font-weight: 300; + font-display: swap; + src: url(fonts/L0x7DF4xlVMF-BfR8bXMIjhOm32WWg.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Roboto Mono'; + font-style: italic; + font-weight: 400; + font-display: swap; + src: url(fonts/L0x7DF4xlVMF-BfR8bXMIjhOm3CWWoKC.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Roboto Mono'; + font-style: italic; + font-weight: 400; + font-display: swap; + src: url(fonts/L0x7DF4xlVMF-BfR8bXMIjhOm3mWWoKC.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek */ +@font-face { + font-family: 'Roboto Mono'; + font-style: italic; + font-weight: 400; + font-display: swap; + src: url(fonts/L0x7DF4xlVMF-BfR8bXMIjhOm36WWoKC.woff2) format('woff2'); + unicode-range: U+0370-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Roboto Mono'; + font-style: italic; + font-weight: 400; + font-display: swap; + src: url(fonts/L0x7DF4xlVMF-BfR8bXMIjhOm3KWWoKC.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Roboto Mono'; + font-style: italic; + font-weight: 400; + font-display: swap; + src: url(fonts/L0x7DF4xlVMF-BfR8bXMIjhOm3OWWoKC.woff2) format('woff2'); + unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Roboto Mono'; + font-style: italic; + font-weight: 400; + font-display: swap; + src: url(fonts/L0x7DF4xlVMF-BfR8bXMIjhOm32WWg.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Roboto Mono'; + font-style: italic; + font-weight: 500; + font-display: swap; + src: url(fonts/L0x7DF4xlVMF-BfR8bXMIjhOm3CWWoKC.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Roboto Mono'; + font-style: italic; + font-weight: 500; + font-display: swap; + src: url(fonts/L0x7DF4xlVMF-BfR8bXMIjhOm3mWWoKC.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek */ +@font-face { + font-family: 'Roboto Mono'; + font-style: italic; + font-weight: 500; + font-display: swap; + src: url(fonts/L0x7DF4xlVMF-BfR8bXMIjhOm36WWoKC.woff2) format('woff2'); + unicode-range: U+0370-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Roboto Mono'; + font-style: italic; + font-weight: 500; + font-display: swap; + src: url(fonts/L0x7DF4xlVMF-BfR8bXMIjhOm3KWWoKC.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Roboto Mono'; + font-style: italic; + font-weight: 500; + font-display: swap; + src: url(fonts/L0x7DF4xlVMF-BfR8bXMIjhOm3OWWoKC.woff2) format('woff2'); + unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Roboto Mono'; + font-style: italic; + font-weight: 500; + font-display: swap; + src: url(fonts/L0x7DF4xlVMF-BfR8bXMIjhOm32WWg.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 300; + font-display: swap; + src: url(fonts/L0x5DF4xlVMF-BfR8bXMIjhGq3-OXg.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 300; + font-display: swap; + src: url(fonts/L0x5DF4xlVMF-BfR8bXMIjhPq3-OXg.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 300; + font-display: swap; + src: url(fonts/L0x5DF4xlVMF-BfR8bXMIjhIq3-OXg.woff2) format('woff2'); + unicode-range: U+0370-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 300; + font-display: swap; + src: url(fonts/L0x5DF4xlVMF-BfR8bXMIjhEq3-OXg.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 300; + font-display: swap; + src: url(fonts/L0x5DF4xlVMF-BfR8bXMIjhFq3-OXg.woff2) format('woff2'); + unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 300; + font-display: swap; + src: url(fonts/L0x5DF4xlVMF-BfR8bXMIjhLq38.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(fonts/L0x5DF4xlVMF-BfR8bXMIjhGq3-OXg.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(fonts/L0x5DF4xlVMF-BfR8bXMIjhPq3-OXg.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(fonts/L0x5DF4xlVMF-BfR8bXMIjhIq3-OXg.woff2) format('woff2'); + unicode-range: U+0370-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(fonts/L0x5DF4xlVMF-BfR8bXMIjhEq3-OXg.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(fonts/L0x5DF4xlVMF-BfR8bXMIjhFq3-OXg.woff2) format('woff2'); + unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(fonts/L0x5DF4xlVMF-BfR8bXMIjhLq38.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 500; + font-display: swap; + src: url(fonts/L0x5DF4xlVMF-BfR8bXMIjhGq3-OXg.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 500; + font-display: swap; + src: url(fonts/L0x5DF4xlVMF-BfR8bXMIjhPq3-OXg.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 500; + font-display: swap; + src: url(fonts/L0x5DF4xlVMF-BfR8bXMIjhIq3-OXg.woff2) format('woff2'); + unicode-range: U+0370-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 500; + font-display: swap; + src: url(fonts/L0x5DF4xlVMF-BfR8bXMIjhEq3-OXg.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 500; + font-display: swap; + src: url(fonts/L0x5DF4xlVMF-BfR8bXMIjhFq3-OXg.woff2) format('woff2'); + unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 500; + font-display: swap; + src: url(fonts/L0x5DF4xlVMF-BfR8bXMIjhLq38.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} diff --git a/frontend/src/fonts/KFOlCnqEu92Fr1MmEU9fABc4EsA.woff2 b/frontend/src/fonts/KFOlCnqEu92Fr1MmEU9fABc4EsA.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..cb5834ff837e16e7abd3c92e90ba35158ac196b1 GIT binary patch literal 9840 zcmV-$CXd;7Pew8T0RR91048t%5&!@I09qUX045Fq0RR9100000000000000000000 z0000QY8#q*95x1E0D=SvTnU3b5ey1}fEe*c3xW^;5`h!}HUcCAgd7AQ1%m(wAPj<2 z8-!2?#NAgxceko&nFJCHxQnoHFv}n&Mw~16eO9rwi z^5bng=s0Q}j@GPiM=|s;K#GjMuUAnyWC5UMJM1>ueP?but#aS z!th?-TGu{fRUHFszNz@3_(Z*^q8`ZL9yxz|tc7hH!#kFme>i@1^EpPjs3J-z5zbSv zZ5?f5=$>qwHoGltEyTi6JOwqWj?maAx#W+!dV3N-Nw#G3%*eF6^D{yHHpE4f3b9Kn z06fH!xZLu}_<*t4sg4eFReqF31Nc74ZlIXoV08G|{rCKwFlv%icNfh``&y4<-|v$aprv zASls*OCjJ$gQ|vY?^6l{8IndQPzHrWir%R!BuY>Sg)z+kT-%8{A~Lm)d$aA_LMD?c zj}|zpvv}s~e)bCn0`(@f(6EPCh)^7~V@ui>3XfD6>3;t^H8maS4=V$ZmVmwjSU{58 z9)`CpeJuEO-}cYk(-g+a;^vIJAfZ z!9WuWxbK1i0^k0Bw)Lg&HuQ*BuX?6ISoKY^oOvS!G>mjJ|NMoouwqseoI@9kO0+6L zHfJO8$g=1Md9?8G&6PGkxf0}r1B_cCPw5(yox{IVqG?K$0-{iLGUp2Pe2o;nnx<6p zIlaN4JPn`*GzDSZs-8~zqIc8lnUNXU8G17Y4>4a6ZpZLI55Evy5CA9u6xv7d$@*8>Pypa_P44ndG1F(7 z-SV(}Z~l}e@Ogyj(H%L;RPFqCgKAEF2pio+AGHel>-tMe+A67&T8V>_@VvpZ&{`z{p+K;$F;uY}5Y6 z_mrEv*PveIYb$6osENklQj$!H#nV2bwiDWfL)PE8Z}+wun#1*u0-%<4uTcM{JG$|K zY|#2mUF!+zcs}H48q*iuJ-7BvYX%cji|EwCPB!;fx%R6`=&5P$ z^z5~3ydnImw;}xmV*URk4%2w~_yq)oghfPA%yl>1bjxjb+;z`=4?Oh9V^74SWn>i; zl~t?Jpiv85yG~tt^y<@Z(1=lECQO+&W7fO{OIEDfw#O|ao(Y)@na#GCVkOdMQAipl z4^YHw3ME9%Rt>AA>4l9;mXzs=T#m`Em`%5kV=>W6tj&Jd55Yq45Hf@cp+lGgI3OSb zIP^?+za~<;LQPi$Wg2$Ds2TT2LAq)Zch6>8Otx_Or~N`U#H=_&LP57oe{oO%B7j5A zx?htiU8QC!#+DH*+pu}82`XrguC=ZXb z1nj5vZdM`but=OBp`c|da)h7=0Ee7e1Z8VGXwYS(zTMcsYn&WC9ol8;DSnt0CrBvh zmPx?@9zhYUR2YDV;EW<=8gv=WG-1=7P-sj2Q-O6beAof*KcbW}-)ndp#XO7eP_-SY zvZ>Q!7)@%!!joypYd~|PY7y>mEDf9ujn!V;5vlipC$Xm$3uFb>!B9i1+>Q^DgKE>h zR-3vox&1FQI4y{V$TIJ#ZK~N0+k=LZM6X>d*H2E#YOy+DHfUxVo!wIWaIP${nCYoa zUVAT7XHTF3xg1A5FS5&5QS`4t+U!psZyDxfR%@`^mmS%Fb$^MqiZ{;) z{^R()Y}vuxnUxLGa44{RU2Ll;yjDE`i*7u| zKn_?5Kz0NO0DwrSukS2q{IY;T3o1opfs}_|CO`oP?lO9gDF6y~VPFHcN*@62N7_hx zt~OxtI{1IZX2|C!Bin)B2oy`EYM@0LuSl# zL0&FiSh7P7JA%R4Q7(v>T(g9@32_&aEyPFK`bv{7LuTInc2Bz?2ag|P_r2Gw%v-a@ zWbhM&B=`sETNVM--)_L32D@KZiaR&-)gq4^uqm>;LfBEKGS|2d6?&0`)CU0o{D4}i zBrLW1SHutg2P+4pE`PPiN1aR{B_utP64=dzLpm$aEVS65r&Df^#viv* zLDNh&u-Dn?*C6gEFKYY!jX|LAj~R|-^v6JTyvkMKZO{cd{^JIW&0ca)5&OKJK&$?h zK}szU%hEFjeAUlOmCEM^M*`4ECx64V4s7iJ#{o71t@yDBr5DQRK}w+{X~e?OV_jQi z+SM{h4B3S2JiGji^Ay0!Wp9DX0GZGtpde%PB5LL}j?VFr`69Qd9iMEgxyekh!Cv43 zBIi!(&Ai1LTbHAk?M0>xTSQm7kfY=1aPIRAcg`y%YpD(<3z^e;XDpS`FPnCHX>5*1 zV}})PoYCCnCOZt?7r6}~sg>*7(CnvM-PBTVlVGMtK1AWyRun6jPLu}k48I0Q_!NiN z<`HEvVA@rz`?{xWRIu`xTB)|(nLtZzk{ZfL*~9|Ab|C1IN4CX+RcSgKJdh3FQ$sq3 ztt-CIBw09vJ!+vl$l`aAl-Q{AEZR~{`-+WhSqttRNHW)H@Qe+-P9~uMk@Q3wzP_Q` zYie#;;F3o_d7(X?^h667T`V98;Yj9`DN0SghHbc5x46fb31EzSxe&E;lR{v9ro z^~$ed#7p6xR~N;m-UL&E>7o9-ofCI2ljC>5JIYrV-z%O#6-R>hTvMV^*)epcN#(1C zG%iuzy%NtWNb>bg0GOq=k$^ea9%wn<_};T{`R;b<)e*NFLzHiMsov^XKHGsBmR!$ zPR@xp;W#HbFKmwV;FF7BI;Y2MM|j=6b``U5ty2_3u%2fTR4T=CCQda9$!g#_=Dla! zake~NQ?ptoz2@A_RP~rX$JbJ*GGIC_;knl90934%*UYu@2R{{yRyaR2iD>_o@k^k` zQ#36Yger(>#|7)XRG|Y~8#rS2G~F05U;*!ScF>~11R(MvJoFJt-#WkHA(6oV{u&~> zD<<(BbX6K)K-)1k=0B8Mcf$Yfzjc3QJON9Oake-iFp-S@Q5+=Iqoe1VvIC3efBN#- z95-P9tig)GR=UGK>D5Jcwl97^n^^IG1BBEWj=+)--aylbiaa55XyA=eV!AzAJG-_1*{2DYa-t8syGtG9RkAl(|oH8GaMbdaM!33LP zY;mj*66s%boWiUQRP%16fj8_Zpt#LS7V$;crl@s#>_g#%VnR(JM}&;oQunNkbHt}S z;MpVXLG2is?R$NMtdX4BPpffDAf{Z6-6(6g#f)m~Z^eTn{9EzBFkA#>SVV;RgEH9~ z7v0$Jml07&+k^M#V_2=X(CzOFxzFq4^a;ama7(vI0VeEX*J9Vi&=+qT}DqjS^5 zl(O%Z5a;TTv-S57l6+M?3nvPl#61g9=dFtUk0jpb-?0}JF6hDWQS4y#5fC2vyxI*t zNJsZqIfG~s(tHc+?VJJef2Tgop}Kn~{&)G(z5BKS%s%bkUU{LuwQag=nOl^}WtS9Y zz#PcOk)qq8pQ0Q0vn>oO+N~6Ir&q53W#Fjdq@sW0ubCBHie}}?vZA?)E@G!r9|pI# zR7N$G+M5CMYK zcXap4@$hnV@bJuW_dKH3NvQAc9Bv^#zIN6!1)kl39r=ShPSS75*jdY~{A0I<+@?%x z>Q7OA^*Y*eM_m41{=%2MtFxVjS5r6z3vNU>`sbSQwXtX>42tu!DjOG_HFJAaU+QC- zo4m{1D(BSIqZ!rAi*t#;>m7|Iezoy6m^{-{_-20U#=EO^kb8u`pEup>uw%fXeTUoq zNGWH^KTa(29|bXbLf#@zbNp$+G|w0i3(%B~VNdHS{F3w{Ny*MTFRTLP3-yn`5IE7_ zp}V*2J}x}*_jkdOwEfiijx;ov{hK4m;6)hy-@kh z4)}orZVp)cAt(`W@P*r=ocr-fq?f;`yfQ(4dnVUeY6pUw9^v0(0@9ULd-Fy#R1_7r zjfkXIelAO-GW$hM6;%REBh&k7n^i3kS7$!WeTbEakoKZ08rDkEGqvaW&Cbioe$s(a zmM>%<@3}khyMj?>X*r8gT$}>qXfWJ(F%ol=#;v%_W&VS`U!X>*ywqfgJKXrT*?4Kn z_=yP>7t=3!>5ATmUBs0rNJ;BUlI4Q*l=?#co^gqYeLv)^te$XtBWq(DU@~$$a>>hO zQPdJ*+`1K)w#2`W{rV1O<`JdY`JEW?iZ3zZ3ofL=0{uURe+a)C{z~D)SPFIXYiV?5>!lKE>kNR(M>6g~Vsphj7_wqN}=BzL@bVP$q={^6jC5>&N* z@7&7xw9Xy~aAOLQ5M#UEZ z>_)WAa3L_my)L$T*N?&f9T;l)TI)27FU&QI$H%AN6+BS=vIR5UDiGK{?KeatJ3C&^ z_6d{_33E@tzumHn1ofvqMm`~O#IKm9YJNpy{~GEA{61VdMYz^lSXrRlBvISal@`C+ z)l=>O{F@#XJIeP6znLIaUR_K~rqH%M(lt$c6c?rfCh!%OjHB+>*(!AojgjdeXFpUE zr;gv{8okX?UO{huhH0P-7B^p~<>y~|1Ej;be40VW&i&83|5Nx+PHX)iWdqRn@N3Oy z>-;_5hwT@`j%MVNy0mNX%^kSX(#rB1Y<_cBWA;#LO3tvbFsI$GgfRX0tNOCz{_OMk zD3vrmwdU`p73uqma-RgbSEPpSK1$`?L_AHieae2p78CB8@~+bpU6-Yr6r0|2tC8ZK zQ!ZaX?=3ybQV$i40*F52S>w<+@7tJhxHUz}=u>ZUAJoVA+-u~Eh_o}$K7c@b`f*7* zv(9r>ABFeQ@A)RxMu}ZmXV0ID^d*w1Zo$JN6Ya1ZmjEwc?>N#yamo9s*`l))+2&SN~h#ap0*kTpe7 zHf%qC;*W>oC;#)uC$^f%M+*_Y!&JFSOoaa-2rPuq~=?J>R4 zX0l5f#*qovvSjE4h}+GDxD^=qUq{Uku0l}(Dv^J`es<>sbb=ij5*tcWRe%PlRT8+q zNMGfzY?|HLy6VPiN7ftpAY@G`~+er^R z4W{loMuIm*XfMmrHJG|<;)}+4cwo9({#k_36ecVIYufEck^oatZ_S5A>hycwP6hJ0-TTkHv_a8m) z&?f>xT(q`PDA{>UGm35qtJ%DE3pO9*NKx60IVAs@oj-LRc?mu?bFapR4-wDrJM{hGHrM6!5lka&{c#@pMH+ z^MOmkU?QiyQ1pTUnmsgw|6+Mg72~+V2^K^IMMXH@PG1u4Ut6!;O2~bfDM>Eo@ze97 zg1jrDDf9=tpzg#e)fexZWtim;^0(7Fa_e$(qQg}&mkV(mqH>}TC)W{l*6>moYfV-U z;cS=d;#JhtI>MjLQTjH&&<~z87G@5fY+`}^Q4d-ppCfmYy#1*f6>tsGs3Pjl4HKNP z2l2nHQ0v3~b}Xgrr?^Dg`B|G-HbRG@`lbMaf}Q=CTpglmT@1S=MnHfJ;fCG+DQheV zw-a>BGADyQqf4#P{zylhibAImRb1_2@``X7IiyiW=Yn!1kw*a?(o21U>DV^kSty7? zC`u!R_1Q!0hUh+XL)AY@drDx@V5b)CgKe4jD1aOBvqyr!=6~1o(<*%$upPZ;d4S=w$P$eML*Phdp z_Sfn_1HuJ2cn2NiL|8w;D^-#Ev`I#*j$6Z@Y=0N)CV}1l3}3f5GDfHoc%7ZUp`RIw zV%JSx0a|o_Q^Oo;)4$!^65R?ri@gW|9$=e1$2(PC2kgDvezK6_Y|HrZ41kpO`FjM= zq~3aO`ZI)2Z}S%5JtH1Ui{(mbY-ccgsBpFHoCF=O|1S#ldgF$*46K`!OyMtPs{uFb z&@^;9KfX-@dLUdDr?8U6lSOE6u$h6CJhV1zNyJ;}X_E8Nf?*uS38qSR@1O)X z6>1MRJK;JJ>VPhQfLP}4&K7Iv_B!yeo=w5qPdD3DWAg)KH3` zgT{IS0{n)D2rCrS*&7~LsafBYO=>}FReYLx>&tkcUSkjLbGat2?5Z+#TOJwTfpsyE zkO1Ligb|xh6?yH_6=c9re!WfWGJ#_E9aLTo0thcj9tI5LIC@z0Um{7Kkh@?jEJe?z zq;yvo?D0O3dexe`i;hWmJ}}Q7-Kt$w5AdL$c5}ANh|zb6k5L?hc!ZyXz?Z<@YQ1wNPTNcImu=~H>AfxK zaHq&*4mPw`!wfo2wonLU?n(Lt^h7jfz*zYnTymL-30T)7mI#PcB9%)VUzotZzgcOL zdy#?LjmY^uIJlWGD|m@)wJ%h{auux80xrYI>8_G5s}hbyJT!+E_N=E@;03!jrUWsJ z2%3xeia@OcgHz7hT7F;evRM8sG5E=-U^z)#&z9!gOdBO0MogQ7nxz5)g+I>6d?_as zF!B60M2IJwc7-a*D{_}p0r>KYf<>8-#)1;%D*k3j(Zgi)F0Xt)Tl>#h>T&#mW6r8i z$}@6T{eQkp(aR~r9FJw1)*#ltcAM%rgJwR!TlV6_B$lMnzpmH}&@Jm`ocRG&u5y_( zWQci(jEJWfhe5RzVjy3lc1^d9o9AUdRtMvs{h&*|c)ok?N*(duZu(HH9T5o{4o461 z1H|6r)iYpVn^Ndk?dNKS-~|DF?hAlKZzBbzG~19jQ3iG^an6DalMMO4MN<2(1-73o4bUKE!^2sckT! z3+YLn?M#3&%`=x30tr)4m|0aPFd~DX&U_Y{JeOQFPSQ9C%BDl5Z()CsA}>wB+v#7lR-OD7nIt^{G`l*a)82!>S-KVYqJ! zZ1WsTZwhR<#A-U&a|uR=OA3cDZ#aK=-j(k?OdpD`AAV4lJfz`L-wP1Me#e|3Pa^K8 z_C^w_z48DAL`@thuMYsdj+ae<0~U1k$;zA~vyx=3WugvFc{s+)h$O~Lm^#-hJ=gfb zOU}`<9+i(*Yo=b(C$)WXF_dv{hE@9y*e6FAIa=DFJK?8t53f#1+MIomq%2i@In#FdZ>`yU8LCuv!lPrZ9Xz+ipr>O-+rBN*A*|#ko2ZwM zo)hQ=W+_>t%qnH+hQ~$IFp%q4 zLWIllI^w;W8+dYZM_d_7s+Yf1gEzslx*CWQ$ac!q$OVd(1X9Iw?mb%W$$l`F_DMoO zkADBJuZ`ayPe<0FG=|0V@zOUlpIwrJ+NSsQDYxlbIGVl!ZQ~{Eo^VguzN4p+WJZ6< z#+T-iX>*yF33g2kcF`SSb#ghrb6iuk>A=LRG7CpPjf8#&Xb*`3@A*CgymeH8^-9GG zkdTvB`+&qT5mcJv?MorpHg-Y-MX@A)CgMrEoH=+mn5nfL)2@m7OH!rP1e`u8)Drsa-9oFwF~)C zF~kn%2G7kn$(^_sldxbJ8!&lOC`tRtEJ4?eW&T(=>}GT-S>=@TIgWDVJ%3>Tn-n7_OM0{%kCf@Ivm-76 zr$OSuDY@xbVQJ{7hVJn6oXAfevrmbJp|Wbf^2+#Vq?~L!)x3~zugdl@tDMUx2)W;V zXujfYP`lrK931ue?n|Y8RBthRN^8C%$v{nsl6xLMUj&D3e^i}JEkWXyq@LCw5UL@_ z3GQd!KGm3~@wtTynqq=^YqM(blb|G#`dA0~OpdZ7GDyw7+R{m34FwseG zo6L{7(i&>;6|CENrr<57jrYx8pn%6n zfV+Xq1OZ!t6BOj&sSg?cA`^%a W*E`Tm7TU08C~GZ@>+Fazi~#^e8{{qk literal 0 HcmV?d00001 diff --git a/frontend/src/fonts/KFOlCnqEu92Fr1MmEU9fBBc4.woff2 b/frontend/src/fonts/KFOlCnqEu92Fr1MmEU9fBBc4.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..29342a8de253983b7b1a8c94efc6bb5c4f72a5c0 GIT binary patch literal 15920 zcmV-0KF`5-Pew8T0RR9106s7P5&!@I0FP7v06oh90RR9100000000000000000000 z0000QWE+|u9EDy6U;u+42wVw+JP`~Ef!+jx#t{pI3IGy<5CJv200$rp zf>RqIfF)zx4G+!(0I7U=wAq0cHjV&0;BzAb!NvigcwapD|8L0+5e54J8q*%CY`74` zO3z?$ylu>c!Z!N2v1s_5!WvcAa74x&3Q~mh{z03%;+5I|Lx)Vx%K`E+EFDDJp@LM$efh8kujnI-Aons*`a0FQDmCT0&p+>P?0l#U)zOkx zTXcq)P3heuoz{+I8D@5+`2M*9q@u*#l?(wi9k5^;De0u7XdbX=2t58R4RGz(S_{k#I5oP#9G18a%+;?A3DK@$SJ{hVeKCxw}VE zF{*T(iPGu9C93o-S7?Q*I#=`)kpsrAF>Ea#;pl<6K(g^@Ont4GnQTtG`d_AM``>|p zL}1R)u5)g>JtzUTrdR8x13wO0@a~{+5H&J`5=e&-xmd!+?I{72LrR_O%2wyrt|~XB z)s!x}!aRI`uW8PNq5*sOg`-mHO)Fc0-hA59crCl8O)~)sE`A|gh-@}}nN*c;f>I|W z4k`b~EfQDRRH6;GvOy94|204Dd-F1(Vp77{<+v{#_4t1(Y#r*EJCn@Jdy}6@J`isH z5=}~hGA@v-1Iqjb097W>AiJ(8OkG{IB~Xqd8x*vbWrfC3kRuPgTG$%KqQ>07FZZ4u}yi zka+PR>C!g8&N>#Kx<8x5b!*e; z?AuJdG-T3e-L4llgj^Icb+VQQ?t7#E4s2Q*0+=3K;21Ax;54s1-PEVH?C8T>U-?o` zFIN|T>2rsaR@FbL)xPx|w_on4-0XCd^H@*)fLw{hu+#rOk#|?gw?W)y^s$KA4+J{SU@R(G4{@(dWMH z!u*Av<0OFME;jraov*1y^9LBl8Fp;!Uih`ITek6j&H|K<|5Kk6+V|5Q)A${G*GVtG>ISnJnpD&wTlr3?E#d?r0ntYAnB$-CoM`8SD9@*0N7&Kbac6QCl;& zepjqFEr#rYnezVIkNYpY@LneSR(DhcE-J1~>} ze=jBwQ0UNOAxfMCNmAq~P^Lna8Vwj)wCT`g%8UhTw(Qt*;=+wPPu{B4s8eskq$$&8 z%$hTA!J;M0UU=!1|Gf6zwjI0n95{63*ojj={qo!Y{(xvS2?2wZ7BSk`y~hs15;X^UBHYKLoIxV6XA<)Xf-^%|lHX)>%S(`L+?OCS2+ zqjeiLeM(z>wQa|)J%^4QJ8_yQeeunAKhn?k{3;>tjj_Kjf^oqpeGHODA7R>})jsXs zdyhb`-CSb~(W4A{X$y^PshSaG~TkYAlW7l5#4eft_jzemy zK?m196UUS}M@6=5+p%l!G=dpcE|j=q>YAz8w>i1ybm-&AJ9grVX2uR-2;ht_+S)BE5Pl&zf2wmsAi znh1wZ!JiPN@%zf*CrmH}D<(RyyINvBq9|abNf<-8g^G;QFy z`3Vdf=n~c9sdeEb@FoJq4@iRg%JdJ?@Oia6tOUJ8z)yv`MfpxW;H` z?>y}yF&vOjyW}4R?u=g1;Ne+?$M|{FJ&RVU8rO9q8!?Lds@LWLv`}q*h>-xqzO9{u z=-RR7X&J6 z3sS@@KR(@HI?k@r7Is_XKXx;F< zyL^KL+PzH~D9iDd`lX<|O(=Vkt^!sA>VNO&y#ruj0=QgvL!W-5W~|zEycCI@;_xEJEGPaUf4{ft zM_U9N$JQ8N2Ra9G3p2Xsv;QAHe_k(<*X$)3Ql&@~XU2Gv`}p(YHLs{gKgitua=QEg zeynef7fm2%lYnb{ux|CxX=0daz`ScI2(6iczAOTCBLnNe3H`&URk%YwBA^X_ z3Opxdc9rHm7a@N02v)CW`J(39>nkIuiGo)vcw?kS3oa=mwVFbyoedA%G?OR49^fgY zm)i%ao8{7i&7)^|60mo#Vp0dEB`bg8M;fe3vZnYtWEwS^4NGh^DQSmM%W@02dM`FiE2+fx zQ9sRxe3Gk;5f*u}4N^NBq~gk6g;we4XcBudnLK*UVvRKG%|jR1p<8iBixwSt)QZif zwdrUcbIBjN{AK|_h@vx(tz{_(jWpoYVjaO>$ ze$biswL+~ewg)VX3BvhaM`l~4oV+|Ua^q3kTFPj!wX>B_S>$p7%?2$HjH?04g(~C1s1jkx`)({1%*6yalsJ;E zNjV&VXUB$RGgxa57YeI^yQz0+4YUtN+WKa-S%tl)WRI8S7(V;IUpD1AuwIn2(9|)~ z`^o4UoeKwhH7r?+Tq-+IPLO@* zvdq~5W{FQ=Ph@Svo*WG)>iLgX>W zvi1V(o|1hh5G&kuvX%V?o=fTl$LPV{Hyb={Jy4n|xDopK`U^m+u zD%Hx}MYYjew;uBG+*%gPaT3-OA#YyAj^4>@>D2Nlx}7xY%e1nM9SL`FGu;}YMNQrQ zsA{~%D#1)KQ!f=arP+C=#uGUm%h^=L=`l(g=w)iV>&^lDaF<|ANk~>qDY8l>5F41X&raM&V^z> zdn#0{7o~KeM=6RlbErU2;k$NW4*@f_Rl=VyH=3HWeN(~LbW;m~@@QG8f3Lj*64+!~ z9a1~|#Woz$0e_88yN`wq^fbMtCNe4P&|WR3ZPcmk!Ea~fo&G!l`g>U!?^R z3F8PcRx;l*hXgkAU#dEwt`Dnv1af)f@!(M-9~4^D#!)nhq_6kUwP8W4v3QVD-hSjB ztQaU2)~k2#Ojjk4pnJVUCBn6LZ|P5emF1EIfn<8c$ObN>>gB zs~Su)7!-_cUZ+%U3EHQ`lhWYK3~!@Qpz>-CGvgR2lR70m`ujL(%pZj7d0w7Y!jmv@Sc}!E$lDpKc$m&$60i>|<0oE>X^4 zFf1qOp=~jG7S}g_imngcbq1--y!)bqEkzbn%_Wxy9DbdgVQU_=uUNqP%0$e1i)P6i zmbMMJ(HQ$MvPAxZDbr7dRvZ&9LUgM5-0%+t@q}szxiObW1Oo?=gB*B-dHkAGx*qBW zinky7!mx@?8^-8q*e3S6wb#KRC@?`>v(`1RB~*iFhR_y!bnFKTBI0;uBqK>Tv0m_g zO_^F7jP}Cak=fbRdpooMQG}3Iukb+BJxp@sI^TSuphQj$JJcRJ(LwGFb@O!!J589@ z3WdtE=AH0Y8p$UG7m6XJXf?nQ9VfsgR!LwY{b&@w!uZhNF=2d!Ba#_l2vjgBrJ3`{ph?>*1c%wX{-zkH^XrC2PslsCdKD= zV@o#g!Vc|{*~wDWBQtTDWNGpA{<*k8(+~fQe(j-VVNlSJ1ZM5I2{POW%8y|HnoN3n5 zE-|Ub3S|_~_sisd94NY6yKY|FiEO(~NKFk&Gm~X=hhrO`Dps2h?<(Fm{aI@0AgZs2 ze|@f(C@Us8UXJ+VVkEkk^u2xVWiQLx^>=-okG@TwrbLzc`dkk7b;gJM^DMLW4^qu` z>so#~!aUJDKE?LpXqu9el1GS+2~R_*)MRya<`;H$=9y%6cI4;uw-$CGjVv5=b<7=1 zO^qxZQ_P%jg2D=e!pRV# zlW;|jxq;!GH?BJ1^{b3~R;J0#^Y`=J-D^V3{cxP-mtrfPGbH!CJma?YsV9(OTN^@& zcw6n5?N~QrV0toC(d`hF5@Ejg%1P7FMjvPIU56gdXjd4{Gm^fvzhds(1>)F;8D4@m?211TR;s`h!Ba2b}G zZc-#*^yn?<2caP^xa_GJCK;Gn{#jECjHaoXp`N)Z!PG){H0g=(E7>P3`a*%2FFMEj zhiWi|Gt3vwlcO(+Fojc=rO3w#v5`ZtCuWORW)g^zBd|%6f2U;u@k{Ef{21)>jxBTu z!KJ}EgpleVlU|Zc$&P!mPONzG?Zw0Jgu{Yr|D;wMPJdiwB*?fD77`X6<(C}gPKk=S z`ywc7?bq6bUsA81bgV?ut%OPX-M7!^KHjJJq{W6`Nso=bnv+N>xq?xm8lD(7q!stxn49gyP5O&b@C1B z)V4r_KuM86$$vBY;AG-N87rc2IlSFV{)$S%UBW1Q{q-Bf#uH-Vy+}n*`LOoO_mAEz zE*-sLP__+A%X*QL8Gbn_^<6^Z#WU~lg!`8XfdOH}`(eab#ZBM%w3g9N^lwYAetwx= z^bW$Y80Pyo`oQ?+gkQn7XWufKrrHacdf&*Lc$UkH;>dH!k8LFIO6c^$<}Kee^{M_^YZX>a|-dXr$FTWrHQ%qg}W`) zjR|pjW>5)5P0Q3o7n{w$p^Qy^!k(e%e!mxZJbbBE$(&?vR(|b>Y4*a+6y$hughQI7 zlb*5?^Hg?F#u~B@9i@|los^pxh^F4BJI?pGIK1L;NBl%IcV<~3^zY?YZVR5zXhrFm z-Vddn{P-QTHc+Sglt75BvboeY=7pC zs{}|gX8F0BdSenS6MowBnz5UKsI>Qy4O$`0Ci;%tdD<%u?7nb0i@gvG=V2y20 z8u7cIy0t_eHk-R#rit#leIknFI6Px&D9HD2OTdJzES?cxWeE;>2N%gd7 zEt;;hYASS1(FSaBx6Qox1?|}$Ed8D|(TUD?8htQ70+8f^#i4R1TkXM6v(R(kksBAU z518p&gGW|D9HE1Ex!P(}U`x?vTG2cdz9Zg^Uy>-QZt^$Se$@UnVqo0XnNMa^!o@ZX zoaGecoCA-1?p5G*X4!lOJn|WzTsHaa{3+u5tF52gOJ{^=LU>RdDON$1(Aqz}YYTb` zdb`e*c(a5jq-E?&=c?w*7l)GMn<8@?dT^_F;Mfhl&Y8}=M*#H2 z;rKqXy>sZ_50g?}K0cos*>4xmpT6QeIG34M$SF#Rizz8ghSaTX%Li97|R_F}l8{Rfd& zk`_hGO3j4mJT#uh`jCRXLxZu?Nps|jpSEibB6F5g&Z3LcvXgQ{y=^M+_5n+2-tAF$ z*k2trQ4`9S^3Ic5a%!`(@ImH?t?8{lTjPtF^5!qeOM4QGKmQk{Jy<+jF0ZI96;YYi zuDrw{a+O_Riu_%mjm)NDb0dTiVe*F!Nj_zA5N8?^r?4T(e;7rKnF5So_()XTRAdmj z`*iHRxCWaho7njKk*6Z|5$9F|oEI}|IRA29tf=8qOrN8jztk$virru2ziuozwb}+y z&TWrs0M)Y^5y*&qEQXRjW&zX1b%5$w-J=eGa_$i4acCb{T$Xy(Bl&7cTr=%S)sre- zfy$@z403ED@V|6MSK~TcmhR>CfsvysoP%e8kA0{emf}jRn|Drryzv;;yH_sZ#02X% zNiq6=F*7H})5+MwF4sVa`D|Ts>Tzf;9pN270g7Bm;^6d#DD^3doOmmyNjL8?wy-%m zu?y-6(&%%K4TW27!vl!@bAiN9G@@{>pHvcCW2fuLJKJ!Nm{^aP)NarxPEP5yv=aG$ zS8k#=G**fNn&2H>WLV~%$6pjrPufyOh*gGJ%lhe6F{$^1Tv&E53Y}iOne=y~sNnrE z7tC*hHoKudwj+d;k%aYmji)te4oE0KC#^73#a~GxJtMUZwfPUtOblUhOvp#Es{OZp z-VMDYIogVx?aNHw3r(X9d&~8b`uj%grXR*Sx-2rQHNGGt)ii`~>+!Md$@iA5`!N;9 z$?pskD&n#pk=Q3DWAg5}A@V0E_oI9~yvlLuND62Iia{y`LxDIojC+^8Ktmm8l4We7 z%h8IdYj5puHdq~XQHY0Swy>@oWd3&La)d9RrN@|iN!f^$jX#XxvQJ(3Unf3xRtzfY zO4jrn>o#KBtK0ok(C7?hG}zTU#6HA@6$iE{vxvu!%P+;CDVR96Eet9twsgV{nXy25 z6zt*`Sb@ueQ7{fxV$I2aKjl`wMRU>aQD0B^vz2#kn_1!SDRoEQ!yma%?zI*^iH|LK zXk-9m{_{y{bP!K~D8O4=rwPZWk4&$Np-zxD(;mfDVH4K%lCKdm?nhaP{@sMw|kDtmNnyFh9%pNk%xv)Wn54R?& zhd21CY$rbK+)?=T!JYBLC$$vgU=Jso08bj z4!@Nd?NNU?2$<&_t(Y?n14ZkeF9*y7%Y$aBTAh?Do+6TZ-}pz3Rx{uQz(#dfh+0ME>qoS9f6O0I0_uEZl3iG~j<% zcZVH^9lxx=|K8G&FBn!D*t$2nF+MoHG4)_@Ye-4ma)O!s=tHqtl6q~fzJQp4MXy11k|H13GP~Jp>`_2V*fFq~$dY?I>Zsq7YjDR_= zdAks)2zS)TjhT9?llkADukF4W`R*MO;^i8Y9zuPhJ`-ZFdbufOVZJdrEwiwMlrxFDxq6$ViL}UwTA%_lOv_bQreqknrIV zA#6cUh{YP|!{9LYrA9tqzFJ=POje~@C10iHm(v{6l^h11ZJycfAKRQJV>2V&E+qeZ zeGF4ye(=9uIRO{zV{_vRy{s*>-R`SBP55e}$O-6XUf4ONTVJH$OH<<# z^S$gGVx2OA$D&+ol)`OT&3P`1C)xTrR>}>ke2kVO+UEF>kT0E-^bKMR3<3-cV)PAW z6(*lC!bY18HT^fR4_^#j>3{s9sin8Is=>$I&c!1rCx#dkobB%FYU9_I)n3KR)ZNmI zZmH*YsN+YsW0||E`EAi1^Y>lNrqfKPd#$p3ZN|-xkD1Ioa4q*9MH^VyCdFhVghq74 z^#v)X67)=z6nYs#`qOgrYD=>&`EuEKr%Tuicjn>Efuok9OZg?im{~+(j{%Ra$r*GMqU1H>+t!8YD@c>0PRNClo zHQnOkBu?UM8{bveg@xDEy=!R1=cpPQtEw29<8kI8CO9q0iA?7i=d9ORfir>euUSO? z*iPD-4AccA^CF^x45S=XFnW4w_X(XfIVJU}S1*SK`Z^UvU3EuKhTCTO3Ond1V8w** z`?n@$l-!I9jU_2nN)+SC$t5}6DOc``8LC{;ot6sB1|DfFYJiPZZbF#T5R(KIx}@Vf zF>%Zk%tw@?JH8^`LT&sMcx%2{)HXZR=dWJU{M``*NV0U%9LCg=WM+xcvNXl&nVWKG z!`iC2%R_sJ^{8BZV>u~VVo0UiIq^IN~wueP^ha9-pkj+)g{#bXW?xp@WyXo#>iKB^T{h_8|Y?f7^BJM{se_|BKV6^{n*Ir0PmApPhLRX7S@v_WS+bRaf zbLS*lT-MUl(yOS#d~#@whs9tu?1Vb4`*Wx@)6A`^tMp)eJlNo6l>tlt;8bydQ*lT6 zX~QVEq%~^3Vw}qFk8yIy>AZ$|Ow}%Z>JD<9VLg6mj|m-Zy`%&mr|gPzY%aPD3~ zF7DAT`X|igXCqS|BeF6`Gti3z*w?(f)cMtoq&&Rlm`R(F`l_y4+6X2GGyill7>e~W z*7LAZ8r=0y$-9s;dGShE{Hls5$2oPGU3)TWtE@18BRP2^w<>C9DJiQw%1xm&Ievj; z8P;Rc+Aq zmGarvd~XwVd!?p_xXX3r#M~z#2GPtvH|54j^{ut8QzS!U$Wxo5s8d9H#=V$fmx3}V z7z$tXD)4V-iSM8;ub_vzFukQrv{jvn3ibF!;g9sJ)93>e1z!JPdW|a#?l=0E!2`9i zfz@knV!s&W)_-S{vG#X7!@#Qp*nVy|ZGLGZ(Y098SkbD{SZ5I%_p_icyYI&*1{v51 zb$9l?_}J``(RR|KIAYE{9rS(2*j$#lVXnxi_$C#VuXGbt^_BHw42&!#Mr=V+o~a4l zNwGe@NwM823FsAhJ*=EOR#!nzN8e9JUq+SqIU=RZM?5V=tA|_6M6Qx5BBjb(^SY~w zn2WqVQ#*H}gKl@D5t#qx}Zh!Zia{*7PzzIAoQtS2DrUAq7@Zv6c-y0#~@m z+9{R}xv+-0wfo?*+7$)=pV$;j=OTF3!rC4Gz;{B_nQ-s8xPai;I6qOZn3!PyxM;|O zLyPlAaR+}k3x9S8`oit53GuG?M+v$s?9VN`M8l$X^Fjc!?`BU;gqHx%LM(3@5ap+W zdW(9~+Q+z${;xFmIX>$m&tjlpVD*h2>K6Z^fV6;Ooot#!f==R9LL_fqT2fY0HgDwN z!~6%t2Swh65jv;gwv)EZkGjnJ&J3i44v)F#+LQ}gaf!_4$wx=}`}i8Z9C}F#reG*U zXGcUC@XL8*@+eG@d@UQx~Z5u$tsV2l_vKXxNMKEOjN=~UuyScHew7jXSsiv{9udKAWx9L7z7cm;v zG}09t39mJwd)gBIW0B#d>0RyJ@}MP%Ixg(jBf{GK)0bwxDauv**Bn?X)^M2x*$Hts zYYNkQGa zPk2Y9ELGLONR8mt*JIZ+X_qo|El&9wmJp?uc_|HlJ-)cGCGK)s=A|e#LTDW^J)@4u z!>@YkhLy+vb347(?KJ5mF7I=pc1KlD!!3oBmmJsCl2ve{4Z5cF-`m$80ZTYhC%2lh^5ALnp z`;<-0|}^7 zAOmq9?#FlYWPX4j8 zri%KN@eXT*lHyYENE{L3%Uu6MB>N5R6>StImYl-Hau340O=Jrj_Ugh!s)dWY`a$^a z7gn-M4#Uc05)7|Q-tfv~jaMe`9LoC?WLQ&;F!7p%%xfkOq=WF@MYM+o5TntC`hdfT z#o|VT;@y{rmF@|C{6#=<`*537_JbqZys7U7z?&LaQhFq9oxJ$dNWo!-*Z$s*xPt6* ziEv2)vw~q~k=s9P-<#aw?TMqqo*f`5t+@_52roVCszh$_uEfgWnzSc*@t1@>s|mZ| zSwXi6Iif?=i^6IcVJ94f6LBG4?xhH?mygam^HG&-+35l>Y`DCE&!27PIc9%N|6Ur? zmfZZcl`C^P%dgqBizlwl=?b)KTMrxIlh!Xd`~TVlO%a|oRZ)iXwAFhnECu3d;D${A zdt(6Lmj1m-6aY4f`gq*P%%do}+sGW(`1)Au{lJzT_u74GI*?l5X&fcd;&Vp!eJQrP zLiQ%1Hpv}`7uqmf(8PYRgc)etjA}DpotNQZStpZ@G3oL|<5&+Q64=YisUtvNBBpMh)7A9A#>_WV8r148tD$lsbeUql%v|D5X!O2HRC&$1i zWHe*SEj5#oM+W7ZBv!6RwFY4A!mG8>Q`Fhh(snM|VdYeK=iK3iTl`)B8r3nW6;*!- zUu1I^{^N@z+T}WnJ4Nvyw{sU~6#9t_t6wSQ2 zpE!-xD*k>VLwtaMOaM1&H>Aa)dR&y?JbL}q-D`;|Tj3)EEl+E<-p?o(#x%J2Z<8LAClkvLydCXl|Ta}C1>f5saPw%X?RE&E^boI{BZ^X z7ZO{BprCAne>uQ7nAEUFYgJH20rc1)niU5}%(1fNWmRV78~Oat8$CbkPUi=>ZwW<) zgzSrdOu*mzcpm~FYyC4isP4W+f)#zazkn?~kk6;(m4wkpz#Y)(QGKcY2n zM(Fke;wIHcHm01tf#!X%GjLv#(-DIl5jT_#*I3SLE4gdPv?o+-df%@>eyQrYBX?=xa-js9RA zHUoex>@bsJU`DS>UsgyGqs!kDVlWYtmwzD=;zd2L6H@AZiby-5o!xLi3BWwoqje3s zNYs#c)+R(bIH!O`R7=9(AoZp|8di%o>8Vu~cVezrj#^wYkSJ^*tn}{XZ%>h$9&ALqo!CeXlQ)&=aYa7dsZvc@%D2~gWE>NL+A~il z^n{FSL8M`A#=**2s0-*}o@;})il~##Oeq1D4EDOi;bG z@IKa6o3{{b-vy2rk&jD^(HH?7mz$+5rba=jc?tbg0~-yv2hsDecz-=N8@lgiHS%B+ z*8nL+P0Ng|L#Obj*PGG)eh>3!di!8$-u03F4c*LXCI0XK{i?oCHfcQ!%0v!MH<$=H zXCb!5)#Jz%L8&Dv&{mr)Nr`qIbYi_4rdW}lW2>lnoe{%>l@`@-NpT$H2lWff5;PCb zqQ)^Tba3rzYdgL|$Y2I|rtGl_D|(HwIF~q1c0y$DV!>=!V*7H0ArrUnfY8baKM13Q z?@@ta@Sp-^DZXLX0V6>v*U|}%EqobLVq}N8ZLz$|1x3lE*GCSO| zdoeDld%3*~UB=Gc&dmKN*e?|BLc^m%c|)wv&e(ym8byZ2ZMEUh!e##0RSuyLrfIG% z$r?dhKx&Ip+yCFrrnNszbyHpKE+AVWQ|)Hk&k!)vR;;HSuV&dYt6pFVOi`v6w>^YM zb73AUqcfOBv9HX`OnL{e5r4VN>#)a%1wW}q0e?u-?1=Lzrmsjz%@_H~9!N1gxP(}o z_dbSqQ}SY#Ey*(6#>*2m;+TkZlP4S?hnn3KS(=?9sx@=}F2i}3QZ^Yqa8)I1*K?ZF zM3ks}S_!qw6s4yOOw(3#2e~^B{1tpUscq^_v_hHLZ64V$!rD}w%|k_w|M+)P%%%eN zql$35Zt)ZwkNku^=ckEvLKX3f5O!KcLN;@j<*ACrTjrnUcq_-#T$QBXT@s`IWZ8`Sb$2PUFsDU57W>Ch zNV1+q!IvbhpJFpFURRbNF@HU$m~)$4>)zkve)^vGUh3yTh<;pf=$tTto*_%Ar`-`! zmqS=3g$wpBjD)Bas`Nyc)w$u==-8p*W#T+aa>Ws4RIZ<7SKb^0nY&2bZqsWWC;jn~ z>3SBio&N{uuL$K+Fa4@+&8<7@-SV))tR$;2hSV=?I~X}jTA9NTF-*2HPzX|~f8LQ! zbFCF_^X>^3t&)7(#=NPv&2m%AoNHgR8(DM^2I7-jq14^6B?~)&V7%~!L{k3fw_<{t*LSXCARZ-ru!vj&FArtA=2}FjBWi&Q(vR8w4S!i6<{N5 zPG`+jNzGx2O+a#^@+@g5plBK9cq2@!EovqQ9oQ_8eKxN_6Xh>7~|kpTyk2!P_DuZGHSL z7W%2Ti3SbF&DuRUKu=5T|opQ_%r*uGEFtx;aIlJjy0DXJV_Ac5=I~st^F5HW*rVd z*_W{h6>sJ;eMX_t-TT+0!jQYe{TjQ8wp#YIRM}69JNXz71>z}H5%D9$9N5~)RX<^3gMopP?gl%3chRakees^ zAix|j7&>Nxf9Cee%=2Q;@|MK8GdR^80DQ9mp;fx7YeVB37Tq23L-Q0%31$Eoo5Fzc z;8u7%cOjuyy^9Q^hk){Js1RoXJtRJ#stLq#eS&Obmrej*n4@9a3CB z*K)N)qI%{cat8T-6F>kQEtILu(hl0`@HDpMo6AVRDmChKskl5*oDo_^PCSt{2fmD-sbQdU_Wn5KF2%eKl-@;)Ig8h=kio&4R z(`heeW29Y7G=ZvAqWYHn7_Tp=ye^AAx~#$eSvzCziwU-56}0%LD$<^GNf>jYq|Cfxe(snF++FvGQM}(snTJM{(NJ9?2fbCkTsB=sv3^wN zYQ{J%g-&NwDjG&YV$Zjq81n@tK`^=3ZVQ!BjLP0NRd2yT_qxh>+M;;InU+u&7>BXx zzpPl9T&iy?-W+{AMd9Orq@H*0q96_L;IM#Lbr(Nr5!uDtc}f@W=GHjKbYOaIM z^j(XybQS1OJGLGxz!wm;;^i7KXON4zO@`{&9NO7d_~DTlEB2=6kJ8~wz(t!3R}TeTF8Ox$OyAKp zd29`3*xb#98x~G&lVLqJhr{fOnFUAzQh?+UL^4|am7-B%GfZuqbG}C~0YFaH%$&-& zT%op6@6}_L`_h6gtO-J`StE-zh(QFCGvyuQLY3i=hNG@-*(4}HX~Q5O%otunR8u}z zv#1#=)dHqFG&1v(@Jxj zG#P0sh-$4-WH8*i=4p-%12g2u$Qal$U6I?dxm?$|dRlSi5f)!(`1`Zqoxk+o)Fnb3 z0PxOVX~h7(Eq1^CzfZqa9--xZr{cyg=B33m5;YG`5*e0pym1{aF3G7lwX$oo>l}U0DIL~-|G<>^d6Z%^63fV@dBL{PY z$kY0D(i!992m0jSXGy+bmT$>6b;(T@^GHjfp-JXCs{E2oD9WlXSVIwgJ(X&00FT=# zrUSQ3my`;uGmAFgoPE3^n|bW=iujJfE?!48hIubUHPBf{Kc(i^BfF0 z*D^(QlXHekl~?yxeWjI}X1wEvOYMtRJ?cf}1LgIAQRpiUwD9;Lt#*j5n>^bp*Fl=i z;4HXq(I2z>k2GZ2vV`Wm%G{MZj4{a$!CA&2b6ID#jNn!>4ha}B-0P0Y7!+4uOGs9r zJnByN0&8n%92BINQU2v2<+4nvvI?s_u$7upEXZx`@*`SUgmS12Wa9_bEacT_glDFv z?8KQ5$&SJR{nptgJVw>i2%BSdtctC%Wmv5oHs)ts)0~AO;~1|DQ(L)5AEMmcT>8%l zp3!B9q#Q?;0I@!sMDp~7$df200>sb)07UJK$xw)$1&0TBA95@4^t+Ls$Rz^A%>n=b z9=`CfhABz>@ErHLyd07wvFDSK3<63j!OjX21Yi*$z}ANX0cL{0K{)}A0Hl!+ZeAl{ z7{w*S%gG3gL=r>NQQ&)bmyv^M1|mg?7cEq<5Cj60C{Sz!0XUH&d|?8|HWk62oUW(f zu!vnVyDI8|vNKS$7||I(j@`HDelJX@7GPQI4n-8+q6beZ!}y+ICn4HZp)A4(mg`rh zPRmxRx@ulopm7PJV8}Nlwo{I;sHFRwDg(*+v7-f(7pD6wEW)yW6?PU(88BkSUNBh` z%?jYMlj?5*taf_nrO7}V3_^@BX=v~QM4NH<0!BfU2MwsD!Cgp0PK29j6n__Hg;f$} zn+L#6wB!U?BZyJ}QbB^BoiPCAZ>uZIQ%i+a(FmY+H^WGB1<+&$SYd<%Xk+~>)C61T z%3?hbKp*2{uErO@AS1%dNAX0RR9100000000000000000000 z0000QWE+ci95x1E0D)u(TnU3b5ey2>V8w0=fk*%nZ~-;~Bm;vC1Rw>200$rpf>Rq# zG8JsxC5DXyU}oiBg8x4(a3V73uYqnVENV+9wDD8LZv3|DkSGdR^XqU_oe_1QFETNc z2j@vJu%&*jLY?uvbHBhYiZPez@IjnCe`{1cmeh8Y3b9OS-WnmvED!(g*S|YCC%H49 z3V`TptI@W)LQP*8JlYBctUBw)ptW@N=$VrX5Q8cZ3KvykSyx$M@&mNZ?gTNqzzXIZ zSb@a`L)%`r9AY4$Gei1%VPYYz#O3zqe_&@9p<`v_AZMKow%qNe*C%J-6w;{`zjo zqLn5ir7fVEOUyGOD@q`AszQ>LSI8(<(W2YjxcU^~3}wtRtgeEP=(Y zjmsD8*64@HzX>F!EdORGdW{1an`k#fKs!F|j(|ZUij7TK_4dYf?$>|zkHG+pnQ^KI zKK3QXHY45L^-9kOgX5wDt3tYR!C1!CH9jblLziICZT)fFEfTh}o6=@ods(0SF#%wU zxx)0`#*SrpV^yfw?Owp5Fk=P||K`)bAP$3Oct}6VZ_>0mdU7WTuGcTVcm3}|g|CigimOcVlnpBJp&5Hk)Q``sm18Wfv9!E| zanku8H@wh(*^uZTUUDvoz-7U6GDM{>K*7pM)ijR&bm_kx%$v@CPX;9DR$i3bmrIa@Q8U_ad(2Bz{Uh zpTb~-L;@QYsT&k*n~P!L01nG210TvF=vW+LB@rN12^q>WYEw-e)KW){Hjg~ADxCt< zl2@z>O{|zm?14Hf*eWFA>+%jIoh*9TGKeXZx|iS>k%{-=2&~d^pftKmZ)XqXfUN}D z*H;Mn?oG&BFq$F;NhrWD$)qzr+X#3+h)9XJQz(dlvpc;qU8jBXHFJX#ipv9t4(nlkuw?YmN< z!O<^8Wz@&5fTAbHVmTV4kG|a zs1_(l@DjQ*Ot`vt^Dm^gcj{bMXG@wFa+Pb4ud%>AKn2)&4xz1A@D3BQ^Vji*90_wK zZC2rJ5Wy}=*N5>|f9eU2<$eJItRSy~*j#RJ0m0Yq=mt-US0kww1H12D6hx5w_x7=t z5Eya{M3F0^e!v6_x&HxzDP8L3qu?uBelGtuqFmNmHYPLzf-AAX7wSZo`)bJo+;5L{ z8++U?2Yuoz(Uu$O>x)K#%Oh~DykR$l;v|u{piOgxf&}uavt!EF`?&f*q>%*liKVZE zT)(%6hL2dTjnLYYFA9=agT5m-Runa;s8qLB4W!-FY8YD#zAu$?yA|Z{4_aoI&%U>2 z{(sXS0d@hHZV0AyNf#$w-$Nr6MzdxM>!K%#eIJ%6$RMwB_p!39`ueAgMXsK#5;%O` z#3SFj1;m zfHcr5av(V5HItdmkY6_e=2_mc%d z$>1YslUob=1GafG@T^iR;&WYxNGZ=?8*K-lA&k;6$P!@|i9}Kla?U-6Vl%nhi>XIR z4}--nmh;E#N~~yP#qXSEI_1$VqH-*+-%_{1mfvQ=dIMQOD7-*Puo7k;r3NAMFr%6oV$M6zF=>L0YmFHl=;}JE@hy4%TV2?T}s}`_Vo$A96tE zJ~>wT&jk~AwUv=Ey~?T3d-9$If}1Zn$H0A4NV8mCUEJ`Kf`Wbl^hiR?gc~!nqGHe_ z0d&8PfS77lR_v9(V4s8_7kxCbv@BZMHAVnp5+zDfETD;5!mlgfQWQ@`kyW03XHj%H z2Cil)WhLzLK}$Q55SAT-$`^Z_o7ck`r_UZSGug-lAUNoh0AzW0OK3vV1ZzgnE~Pc= z#LBZDm2%3lN1H{;NUBaXuqi8=*L;#54x9LR#;zr!>8lAPspS|_BU4aK|GRE>3Jh)q zb-LqXd-m+1Bl0!&om!ZSNjZfF)z4&@o|tcopYWqSW5JkQ{qI@z*C%CxVh4P#k%Xc2 zi;m(N){*U`!H9z%Vqb+=ufBIFP;O=P>IUfOvQjre)0Hgs6k8W+?3S7$>*^C@lA-*ei}A5bt8i4$Z$eRASVC5C!Os-4 zv~sWEzKL#t8ETnoulI6wB>{(}6{SZ&1RVuc1RXlvI0Pc-P|6^q@$oa^`97$4*nFfb zS)?$gfpnL83W-|=i0cQ~^zMING+&$+)*=2TRFpJ7e(NOH6yQje!p3&E3e|Qlu78fM zi>>b(%=sU-wFo{ue+I~IZ_iu7>y6;Qe+~n@IfNf{g8w&m1K@_oUN7^#|JzS~+SW=+ z!Tflken=n9y%XI&LQZIxR^^=~)KunzM$Qg!+B4ce+UQiFmTJRo9WKSLxsk6b#zH1S z%A;Sq=M>$Oj&Loa(uEgAk42>$E{f^okF!shHfjlCwx(omTH};&ZTm#Y3aP$C(K803|qwSnZ?48i3oa``I z2Ro6S2gwf)&o?mkGC#V4xCSNZk6IK6*9;e#3tZ%5u58C#V6&BeZCK<$V+&tI^F zxlVjYsI)45ZdFyDo=445K1Y4I|GqUi?6SAkS&jVug6aLuxw}NS7Y9JpoSr@WA=#nc zF9jbMLduPi@OHhHN+u^I5^JM?>>k@UF3Vz+$Q%CGfVn9&(=;P z2ouQzk-<6vF?pdfUJ4;+ZO{K|d^L33UUy(h#Q6rLI-W5NwvT=OXl{6oJs70ppVI6u<)aEyr>L3d9IjEOmKMdYKSJ67Boj2;US+nzmad13GjEZJIEo7$N+;1oBC2GK@#;5cz zA=5+JS-c&q;EC7+f}uH7i^+}JboYL>}{FkZ!vW|aWmHcRHopaRqE-` zEm`)gGE6FrR4R&1QdDsGEpVFD)b&m zUAmN`;cMTJbHm;YaYlI^%b$OD#~gajgTb62r3l>oUwuBFgYV)aZLtIx{qq5nEC|yu z&p1cOdDzySO-+j;4BzxsD8f;(}ya;7A zC!}f*hI`v^>j?Nq>#0O4LCzWpf^cIGw~sqe6#_?PLbe#<*M-;)a07~*DSL#`4(j?|A4&h z3cMRE*zuqK9KL-G!rw@3g7Uff)k$Fq#f3SuN+0c+m zMaDSq=3+0Tm^%>;es}?YoQ%F}r-$l}0iY)1=g7enpXGXl1UI5C3P+;=3InBDx&Roc ze3(dtTyMtKcppC~xuzj|vm&%YHCcvmL`4KdNJK zpCJqWKsEU18$*lh+Qe2Lb7E3HHj~(~8pl?0`tkE~Xd*VhKYsAgjKCjz47RERkXP+I_bq`A(^ZCLOWeSiRB8fR+ z$OgW=9ZgNr^X}A&-~)U{oWcVMiMl}%y$beC{)>i?PZ9BL9xQU?1xiFjDM)HKJqk=B z5a8pnKO7$tyWV^udhUZ;WoAN0#7LSav}$$;lZc!9}G$S8tVeJnCI*KcEvFfo)%ZLy6xc zxubuR_aX~rBe(&q2t^L1BBD3E9+^On`HkH3b_IE%s*Hv#H)YF2$*xG&wJ1liYhe#U zBOnu4f{G|b!P7_PrylUvH5p7RZoz&$vI(kdbbMO2DZ_ykJ+elI#3WI2UxWeMlR7C> z|5TBfUPd0K>T*U==`f%&R7rt^5|W=OgT5fKO3OwSs8ld@pxW1Ax^v<-ap(<&6v7T8 zR9Iv`w!q_{YV?}YrV1;s1P&BbtngLD2}M;grA8-+V0jBFsZiuQQlX`u%TNf+E2e%_ zs7nZqfT~d;wqezZVNgJ{f~^fmPQ)M=sCGWbKofK~W**Dlfa&&6R8s!UAk*t4Q-r?i zUrD|rSw;sCspwq+8KiqI%XKW(zJ>-U&|4-MB)tl9a{66g*6a9B@wC316tAGj3%r}B z@^hR?0G-YnAt^}n$cD!6$C=liGI+o_FDThBX*}i~G}T@|(whPP-RnL2N%=kj^;crz zFs0OX(4HrQOXs*F(v;L1#9T%6-1B3A(EAaI(u_T^%R}iEg3lIyw6rw$>`K5<0imp3|nlqc#VM)Y=NSo!C0%JRUOaupCsLv2%9| zk>@$~<<@m(o7A-}ZeEFCMyZ=y+&AvA7*rrG(t@=GZlx?MW_Z~9tK1UTtBhF-JzdSw z^%S^js>BJw6P7e5i9N_BsZ{&;yY@3*i~RRc2cG2H`vhkcJ+!-%WvhCs*{u zHA!h*j>Cp!9KSRdS)b0Oy@D;a-0kHP6eSbz6n1M1NBOEoMp)_f$g7I&vI=a+^KAAAqzN>U(MKR@);DJokJ!bcu(iye#6 zu})pvm6!q4_220qp36f(aU%VN0Y7)~g$GKbnq}m2oS+l|!40}RtIZxYpd7OqcS~ST z$9X9w8yjCUa7@5GfNXi1L7PH%kW1Bcs94o(h!LaHM4l-A0Lr7L!Pr@^k)$55@Ge|y z6mZXrPX5?s{1&I;R2Sg_37{pNC@$BD6(>r?F0E1Ggwic1CYRexfWZi|*d1?z+hu7T zu-jLJzuMAE-!lti^HFbX_o8oNQqmqXuLh| z0Dy1)EHw@MT-<*ByBxh;1}xIS5)?*nGWE`!0G2(J?-=_g2%ctpC@Mv`#&Ql?33cOi znk6Xh2}(70vvD|`Kn#zkX(ghX)HUa4sK(1H=dm!~bIEGX!O%sq!0c0h{lNQqQFRS; zmZmz&bH%&ZhKRK+HO&~GwGvv3EB^n3P1|MP?z3$Eda{UDK65^~@k!>9AsSO$Q5a z`Alz@M^m$$7h3XYt@lT%8@PSX%N4xh?qIAnhIrftj+Kh z>zs&>u2qgwXDkdDG-X(q4xL8vf&~i7#`7`^FrmHLrq9x^g}U%{h*?^YVl%yNu}@qjvziSJO2tA3tnFm)Va5{nv(w5QEDd0UGGXtL#yO zq6K7R!uHn`*iBj}yN!REeprV9y?Tq9{h0L;sh2BDiZuC3oau*RQ6L&mk2d18I_7GN z#tJmNDBSg^(z+d}=g_qs`uK4(XF?xui}A6eM!uH&KE<7{t59xcV76yz_Dc~inn7qE z-mPS2kl{C+K{Y!S=46N&wEvZ8wfYRE@L?QUVFsJ|prfJOVpsPm0RR9100000000000000000000 z0000QCL16eHU?k-GzeS?gFF!o3WIQiQwtCP5)=V80we<*1Rw>200$rpf>Rr#2mp?h zE<-lK!~g%bexDnJl)9M2d0vbJajKa&U^YgMkxWFs=sfZ|zA9UYe{c7h*@P;HQGGFs z$<>cXk-$3>;lZlAPtx9B32}TXY@8~hDoc_;MpRf?-9#j{>)4L0vr&5w@Lz#I z!3h9NM_@uA5Ga5hup05Rb=%GRQ*P?4-UO8^=f++}J;=zOkOo z6AS=LY3Avwc9HlE9rR1|`5;ntmHILR4R~9?U@FUsZ*?)jQ#l@GVhRT4B?<=ON&sz{ zE-^4rw~@keqayHV7^r~|cYQo={kI=IfB+zm=Qx`yIGgX-D8?R5x>V^djazsca8GsP zRxTwmz7)sQg(Rz9Y}zv1+UX?f61Qn4(@c+(sI-x6*3eBKAOIx3a%rt;nH1uT$o(RI zM26-}TGg&jzZ5>h2oHy(==Mv+CqAF*lB4em$ozya$ zbY83flt{pk)Mwa`G{h@|5zjNbKN4Bym)ceqt@@M*8jO)mEF-eV{qL8$uY7YgtEQ#4 zMeYxIWH2Pty%as2*7c;lCLJA5+uS#Hpp zNk5_O1-}Z7CqbZKL5at40bmBe30Q%Zz#xbA{&&!sw31h&spw8}nk?7myIk9M4UJev z+g&4Kl)23Qw?0ZZ<&$@s#DRA|J^kai8ygP1bH16k8rc7~?bJ8Lt~MJjYrw|qjSX*z zoTt&{(`tV^x;g1!c_f?)3}8_{i&$ zZ#h56YyWA#+$(On?ta8K4L?1o-*D62@jpstEx0JU>eXqVuj-ZAv=q>|f z#N4;vCjB*U;u(x2wVw+JP`~Ef#W!V%RLK&S^yG(cmXy7Bm;*q1Rw>200$rp zf>RswdnIg}M)BZ0fS~;Le3emAKS-+rjYJ3=2S6ltI{5!j37iZOIu~s9yC@MA!V*xN zpg6u`5n!!Y3MM7%r^Mr-K1YLhM-&t->dUWVE!OYqh}VrDmVSZ)nyk6i7OxqeqksQD zYnx3p_I2BB8y(HvWg9k-2d6kfW1r-b#6Q{b|6e`5cF#Fa&YV&atnUnPNJc+`Ls%IY zT}=EW3YTKoj>%yF@aq7i=lsh5MnDecfuhwf@dpL=5+{$^r-xe4C77$oK zi&!+=sKVudCzQ2dWq)$B@67;__h!QK&$ZX`D(e)6B<%k&`@REOIo99L|;9OC|7dZj9b0k^K_RV7zQ61R>#*`L{{O59zU-5%LrF)r?vmIJI~QO%}%0dpV{yfB8c0ODT{7cAau{k_g?@ZpLhGP9h6C|4Y?u-v_Zc6ftzJ&nk0!3X)ltT(1OU(#N>4t`$FG!GJkO zQlkdsw%Z`}8bK)9L8#t?tXl`!vJJB969@zbI0SGU7>FYmK!d0IAkq{euDsgvGLU(K z7!?9!o*v~J3}l|;6%z(zK+k?EDhzOeaNq-q%>{<@NCNue9qylp0Gt)!xMZw2@`v0k zj{4rt$wiC_j{ZP-(EA>ii;BZ{N%|F0{VTUbGe&mRFhLzt>E%&A;$BRF)!QI|v8)#n z5H>s_1?#7cHgN+!FlcIvB{M&TY)i|1gw_whD+EDv9bR{zDZ3z)i{+`a@!p3eOZKJD zyS_z>_a!@b+xW^BbbnoPRC2-{oFma`O(3kecrUKz_OeM^OYfzST-*ArjR+UHpq}@6 z3A?ekS0$~$ZEUlhP_^t_YR6RzL7h!TLXt_EbVvSF{Xwa%!2$D{p9tNU0XetNre}Yo z$sP7{Sb-NGiw!n_D|5*j};gjljeZ`=YdO zjHo=dK3XvIz1groyEg59x_TaaqF0}< zlI!~{j0S+yX@J*7fH4C&bKqeCXgEOe26lMhMXsy7Z4Y;%es}4ZB5A0~b=>foW0h4Zkc?e7%1JV# z;AQ}27BJ=jZ5}Wd0BsR4mH_QFuz3gk-UGLFK-dI6TflF}WU1MpMljI{l->&j4yd1b z3(AXzV|ASeVI|}ptM5<(c}T`pY4Nxv|q z$~xIJ6wY*E01N_i#i2f)+Tss%`ZJ_L|Uib{e6`0KQr$5_Q25ba9u z6cSVYp33714>9Bv<#w9Wk;j?Ii+spYL3Kp&&SM~t2A_x|Bs-dcGH| zj-1E9zL&th1%Q2Hz`lN9-zKo{1F)|E&`1GJ1Dr=6a6jO2z#9PX1bhN;F|18>>X~*E z>=%X2np|=9Z*<`XcOGzmZGBH(y=H9`EqwU$<8Q}qfAL>?(_^Mwmng}a58dYBB_m0Z zDowf!nciA;4Oy06PkT?{a|5#Fz_1ry%I#ebX3s~3Uisvf+vH6taZ8EMq7=TBoZwjV zYzP!XfMYgKd`mU1d5(R17oIMOHJ9K^0j{Fr8-n;pKd!|U&x(K?e*gh=4p6WF+Lk>8 z6-ophe=r%3aNJshC=%J50pzJc6+z^c22-RE@KfQC^FnUtzIt>LAzgPzAWr3cpv=i# zDG^}AH!<#*70!}+H2O)Ts=?nUBiIzfCVF_2{J?2H|C&&2Z5os5^MH|RQaBq)DMc3j zJsbUX93`S5t#aA+eoLAr%9iq!&_epC>Uz`-;&RchyuzRB;FO!?dN}_$%ZPyOVf4BH zKV{d3)ILK`Wg@j^FSgo}`o0aLfr_mWTcbvl49OI6ZwoQ>;aRha{wnrO?iJtlf*c}d z@a^**6ySevlEOS5Ey2#IdKB`2SEE3 z;1|GQ#{$Q`7J$42SpEcDxCbEn5rL_RhRHA`Oo#V@GiI2~%0&~MQJ`=FY1j<3bY?Ur zAw$_GXHc0T46h0vqC)~;!ZZ#nTyWq!s?4@D)De>nH3eQM9+G5fst!W=Ss!J zE-FkHcO`;7>2kofuXL2sd4^ki@ikOpa8;nn)E?YyV{B8g)xAoou9F@Hi!JW# z?K02ve%$V-ZgayO_Z3#?eO(tt?rjt7E_phyEq2|xSTtIuL@3D5nHx>T6stphhVz1( z^s^CZ{D-m{;EBZz`;Z7_2)Q9$*kKQ3c}AyUBa`hqq#yT&W7aWRoh7bLOJq*mpMv|{ z{{IyCX`qh!CseSiVO@!cy_Zd{HddsWNTeTf2LMx)lt~~H zg7X<35Kkvex57gXKNw-+#C`3C+8(JipS|7 z=heKe#Wgx(Zo9Y9VW7ZNkg4+()ZmU}z%fLSNCpa>qezS`+RezMGs=%@b1oiwuQ*(3 zPLWB%8#}l%9yf%`J8d~6 zx(gcX#90MMI5(Rhge!?IQzA||p*pdV;MfXczC6~RTUk<5!P z(K=~nov@IgN_!nzI)y8WQiLaz2AKeUqG@;pc!?A1P%`bC9al<-lLHl_b?Hj9{%&oH zmXC;Eqk{XzhvY1vMYyjO>UwnvJwzC@-PD_OPsqsx8! zk@Cw4I~t_>dd`Gz>TCpfPm4=IN<(X>eOtDV(1SMzJ$P?yzRn_DrWuBlQ z+GE|`p4)p~Uxk)>_q0W<>{eC6^KeKUEi)0!rv<%l&%UY?;$X2#<7S~TiTrM-gm$<_ zyE4oCI@MY*rABwMoi`ickUc#b#7ff84hpHTiVO(xz9f~NqfLX7bCNuZK&PQE!knt4 zboYkCHzXq~Me?d=YHaUar#KOgscrm)Zjo%a_97*lu$McbPH^D;28?iu*>f2#Brxu@ zMZEgIh*WZYwI%fYs{KfjC=rgm;qZ2Vf|xpqmJN$g-nG)L@^-qHn%5Mg!O@5)d6)RDjj~=6S5`+~- zN7`1vD-()<^aHxoAR!hs&6x^lQem&>_nR2?!`{CsYT6Z6U_#dfu*zu9sLh}6W!9Qk zg8aZ=na~idQn+RE;l07g@n|<|Tb%k%n~;kdDuS!eu=8P0Ka<^Sni#FFji`C)x*qhG zSNBDauNws2<@H@NICF11Y{mDq{5C7wS5V$Z5a?xYVI#Y9VImXwCRfqBcMqYY&Mr*I z&SqnGX0Sw?CJ^5)S?KJ>gh6?1NZMApE@-yQ&rfIvu#|!>Iz4ua;);cI-jhyaHAg^! zR*dv`wBUe^cNLEuMD^Jy)hm)R)x7 zuHs+nyQnTG!VC85OjR|Ocz1r%J8?h~S({#mi3H_1lqg-z*02#iGjNtmw&gel3E1O= zs)rARmGD5-+&a~07p+r_!UeQ-l`6N_u*0&TugD@Ei0rn{u6AggdIp=RGTYOkkyvVosE}L=2%P2Pb`>Nj1S7* zD?F&u-j2yuN8^; zE{Ks7_&NRwOC7T(HARVSrXv=Ej1s!AltINFUU|Bz@N#SDYT^8T{q1k93Jt~2*)6uL zshv6oZ>K_w}^B@xiww)rA~HsseqA{m-QDE z^{+>s2gB+%0~D1ZDmqLRHgpr#bTc{izb2R_yy@K~yyPXAy4LXjGGTV>w3RY_p4QI$ ze65wbV9tKI(uk+khlf(32bLI!gKns)t_MILFMoTCY-oCL{N2<7u{pB&XLDdGLq)di zo*KLK!};f{r_b`AWY&Ur;RLhTuOzv9cRNYVd!oM$z$2wbPGs+Cb0$ z6(*P6eLNik?e*waVyh;cllwmO!CH4qWu3TT?WQE7-%}Y`S?*58ZuZ${+g#%U;Z|F4 zpV;x=SE1OfVR_AQmd7<^zR+z!PdYyc{&*2Eo*p4 zMt9#wwS)b7QcrA!Vdji}S_L8Hv7Za?j+oSe*uA8G9}4nTzX`#-2U)J&td468Ag3qk zdAm$RJgWZ=m>YARe$RgPs4o8*F)r_^5m=tabC~lvO0&I)T#4jxls4mI zbNKH1W)&{H`Ocf`i`M?r1vfW+VQVQjfgvp>J>;^Jy1oIyz`)1AfS_+Mrh4<=)svd_ zY#p~cgkmE=I)}sehYnJjTGX{+GS_wKVG-W(>vn4XMB%JNYfrwvd3W?ImmSE|(T~JU$QAI zS%r7voN{HXG_7llF3jtrdG9#I74SrN357=xy;QokNgdTP9o3|6eRI=HGgEz4nQO;i zQE9kHX>V2Ok)C+@=A1m5NfJGHi2i-XAZGK14rBD=V4{KNlt#=X)gK))$m7?%c%Q>TGH5zQsIW_I>d)? z-mmfNya+KZHlZ2%99)z|9iYF^cRfUO(v55mVrpX;F%+L@9Z?5VSChIcuEvw$S?PjP zyWb$ni^h_)hfaEzMW=+8M7c8JG9K;u75wIVHH43=4^|<{rBYIc6t;g?{R~a&O=Ngf zr^b`-CHp28hUK=5-DAtSgrv^vfc^9#`<2}}jBJ;wFCJsFPe`2uG?!=hQ?e3F5g~T89C|$+hU-L&oqtO>a6kIhD#HFSA%&oVuJV6)k%2JW6TVQ8~ zF$Z#!W3RW@$~Ec|ChWqmDkE{ zQZ|q)uqhbo1$E<2et8~u4MX6IH0q#}v$6CHm`a>2Jj>ch{i%T9-$~b8B&-k)uw#k_ zcAaUR^v=|uGSWTSedLY6 z1N~T+t5*W-4QyPEJli`S+=DXp-OcQ6L#@vr6#d`*X#9O`u{r{KfIV1foWJJ|#C< zFF!j+$Esi9rgznM(XsTw`awGR0-T5=(uuCm+tkdqFjS* z%&%%+L@#+wtkjtwgRsr%_O{K1XYjAs_Lg=Hx`vcw9qEg!kIxlH?*Jz#M##XXi>0?h zgt@9^@u_^5@|Ilnw!EW-ZszPU9*$I>g#s!>Rk50vP_ zW+n+=>X8JJ$|UaZ(D=i71LH0*DB$Xk`5|16-4T9({ZTvk6ORB`Ua1In}~YMVXVP4oyFkiw6Jwh{a$9;+!%B^H_k6rGJin`!J-M)XM&ae|w2| z5zPpJQe(r40*M7|+ZDT}8lSn9m_;&T>hPqc zlte|q62m1j&h0iY{8vE*Wtw=iCOVe>s-E}dA^)2puHHpxxbuMAiAF)n-$(z+`AB+X z1}2;s<^RGm(-o0)FI0im>EAH(&aM^_h7Z23XLlpx^xbZVM5gA}Lb{P4JIR->mNS~e zg*LcdS~bhUkGak#fS#d5|2-dN94PWg;O&pP0vk_))5({YS}Tv*=d_dI-oZtBw#8{G z6;5;Q&bF3KtNM$*p&Nng#mB- zwz%IuQ7@mOUUzR z=zB>*8uT_Ovz#*xd^7%@3-ZhrjuZ~t_^#PfU764itq3|mGKrYXkVElP zRCbf~P+m`7Ph#&C$yozm%(E^DsrqrQTCqjUCiahsT@+1*EoN7WG(y^u;);TaI7)L9 zccmgnqV}ZNh^HCInY6<=DbEqFc&W_8SEuB)BK!@#BqgYSqTYPV~xy>*-hS+lYDgcv?$1->=AUY_paK=(%cRM4j3H z1%8KF{q}oqBeEv4W@G06BlwcU>H%YR3g=sp%A4w2fV21ONI%K~Q4uKtcVDCHWJ!k{ zsXp^xd;tMmWU05GP8o5GS%(R&#Ov891T_1r;o{o+4C+iCzu5$nKc^PAyM{fBy^9BE z3-94W@aZ?(PX^7d#v~mj*~b{zx`%_niO&-tQ1R^a9Uiigb(%fhCQCcyNcCIv@CO8N zWsy3aA**oV*@T7D>7_oG&PVJdI0E9;l&+K%hc$t=DkJeMJi$7BU-L9B#r*MG5I;8l z#oduF0IF(%81o)O=45`;yQjR}?3+6W+;&_d(1U2=3sP@Is^kB>&Mr+F_6vJV*m8{~ zxM=9mPZi7|Mjg@HdjE9wkRPN$dOOS0|A1ntmE6vUQmGzw=-aqsKD46 zV8cO0Zzh}aA^mcce_yo!?IF@Em2maLO^ zlTp@W`mWrzm6dP_>WQ8hwkl`|2Sd2$F8RufMv5q{Dy2iGjcD&_06e=^kWIQOZ z!pkeKg_ME?4;LVj>t)mEG%22w5$~C}Vi8e*^2Sy=6#F~>Jcd9dhv2g+;}8GYnOmil~%Oyo~{j=P3~B2^t#HblnFYafk4ORUvZD%e@`^);HdfB)WDdf5|U-t+(gJYbKf+`NM?a%FW~EHf&C3$a8vdJ1zEoJgp75k= zue|c=>9glh-;kG7+BRd8$}7KvQ?cXj zj5`_}9DLK&5KoUUc$I^b06EIw+j45@=YYbam&;wU?bh-L3)5l6aHM0Ii9MmEQX;Myf;lr(Y`pcRt{8hw;m=2y~hub&#ku$nq1(jChg_BGW^NPwN zm?JrPQQRW$yQ;6o?us4D{$l4;JOp1xheJd=By+%&XS?i^^)^rUN6lGLCoZ?XH-^Ru z`I))Q?V9!g9rZett_sCclT(uag4%u9JKStUWgpSGnE3ccN}y3>2m*XqIJ%}pKzr2R zU{uV}7owBYzoS#%7~!Y+hx9_C&4Zucz92$v0@C_8vz$4^`*;6OHCAess!94Qbz?|?F|eI?|jVr;FsK&!N8GI0*FN19PNxU=|bep!68%hY^{ zPFc*J;`{RvrZLAPmsFA+8Xj1?5En+jFz%UYNK;H72ZY%{EA+hu9 zuG2ohKrKvd|HB_$L_k)|I;I*vP-GYUUhn@I9SM2Kk3)V?6Y;@G9%PRfhxbct#Nh*7N^iAVQ+1#L=_jqe{;w_@r(3$6Nk&>X zw1M=?4TIi#F&no9#M#lFiaj~ikoiOuk=g$p$B7f~3JvWo@Va57PIv?SvEGaCCwyf` zAYZ6~^!t5A{@`$budiBk44TK63)4t%g*iYO(u?q68Q9t4ja>Y0!*9SJ=#GBow^5LgW8{QiMl_!vI$jCtUgq|;9sBbk)! zuXgt_^)Vew@1^$A7a==4Ut@O&Uk@vWx9d)S5^|I8gFFZN2$Nz_JQ)d(`C9p^s|27{ z&W`^?Fg0!Ovs^Adyk>B(W@!5<=pNj?l?0_{!lGg2nv+K|R32yG4CSUy?S-0MX}5(8 z^&#Up9=}f_d5|6a_IyXzj;QKSvFnMyKIE1@!Cg{%>U}OZD)(ufL{(Xzv6$w@z;x>L z0P(U|{QrR{btDV~rWl>_@}aU3EQ>Q5%o}vzx@?Cxa)-P#VA1eW-I`AdiGs;Y@X2rc z0|XRLh7IYuZ+G&4rG`g8yfs3Co=;v&@FC*&?~1iA{REw-U-;iHCTl}!{%17lr}RJj`)uv~*<632M7Dq6`M18` zX54O}wD{kgx>Nn#f;7iGe=uK5seLv!wDO19!ikfW=}u9mMj4~alw~?U51nxIGW^xS zlO4)V^+ELzWk@`bqejFt{C_Pp7baYwRb-Wy7ZmSmMR^(}IypjGja}_f>6b+ieY7H9 zRGeBVqtW}T^e-GGovVj!{E2Bi2lp5AeSnP90Jgnbw28Ef4F!=`%@G$>ovu$h^*6$) znCZSZx&c(C^2NIpRaB!Mjm(sM)TB;Uu=7Rar{yKeQ#??cx+BOYZ1Y!?)Pee&keTvU z)TI7;WTE;QYEb^xkhuLK?|fX&RNJ%~N_Q>D@y@K73FMS@ZswzF`{2#mWz?X*Heo=b zfWqGFo8amjW#%u@otZQEjt;M6tLT@Y8NVTkTR& zm0=TnZdP!GCoHmM>pu2=H^!I=9%PN+FH7_#FNYkq&)b*mv}8#XC5$ZFH+ zL$UJZ#e9mz<;8w<7YfKPib`U`6$4hSXdjBi0PFkKlf<^;!Fm-K&y#ieD&p$=-2c=z zC}4)E`8{O4r>IOrMrLf4hvdffB!_xfb7$@5rxF`)Tp9h0P2R3)T?P8CXUyi8q^tt0 zVuPWYl6$lc9e+m#a#Y>Lwd-yy7wI=Ym)HtpBXS{+1G7L4X=2@7nRqNXB>Sr%yL#V+ z&(6(HSskCSZ8!9lYF}wrv|@^%zxch56$1Ge{0#^6Kh-nUz_@p1Q3TYtA)$9Wd;q6! zRiPHuN!jXizR~2X=xh1v0%zb_-U|K|vl-OW8k&>apX9~*i?xdZ`~Lv=?))4!{!LlQ zWU?1n0a(T*#}A!3^nEWVYNXre*Fyj`$XvXD8(I=WR9v5swX#pp-9-hyU8@O`sjoUD zP;~x=kI&9;?eObs81N!pg2V%E2M>j0AQhJMSwIk6KW(>`Jz>2OTeq;=E7^u67O?xQ zu$x;vAUx& ztE2;M6~^QhA^vjv5sCG{R;inNey$QiVK$W|M4z;-h;Q1o{ty>bCVAo^H!JW~dTRg` zQWSpDx)B*oqP#DO3fWWN9rISqPNqvZvFq z84Yt6Eo#KZYS>R%^+k|k@wD(Z&(3+$%>t~P2Gh;Dg@&}n=vAeuj>3O|4))T0s<73* z)4lTBpKV&K)SK@3cl2)OR$3kwP>QPE6rd7XWR>-^mmNe{q76#U>-^7mL4_HvD|T6T zpyM0!VudP`N&z=E(f~`U)h%c}O`E=iKr*I5q9+FZ^sAr=e*nZFgh<l_fZ%O+K;2xC#qdP!KOAlYhmwne6GK9dYyVXeg43zcTaBRPA83- zC2rjEd^zaI=-2XLho7u{X%`F~CIT;bfn{0JoEFUwwhT|A3Y}o$$sP)xtZ~7MB`nla zkgirep^Ir_^XM5oM+FrC0!5R{s7v{W3YDP@5D0_7BksGcfX%5PDDLNm1HhbvnUHi( z*&hoRjzPBGG%#SC;}hV+M-Oas0O2#Y%_@{f`Iefjxmt{sOlH)n>)cSCnrMGa+e0I= zEoRcLNyXLdOkCgv7U|to@h+>;E?-uRa{-a#Hze%+6!=^iU0_mK&0h@+t*L_cRbE>eIIp zReX?h^+_ZmLRdq|BO8TboJ)jv3$ot@J&Ae*uG!4q-_=1#L5-x7`_ju^h(TF1GDZ*(hlUhD$iCk2ml^`z}UA?5T%q=jth*e_asCGbJ(4 zU@i)3b{eH?S{0&|9;pSDGbN@m-Cr8^e+GRJ-D)ojqyMokr+5k3*q-<$Xm#7KsCKOq zYc@|Rq)iScPczmj6ZB;A;=CE}-huU^)|qu~9cfk$2Rh`esWY)-Dy&d$Y}UnJk_8u+ z!7o@!?$gD4MUehuz zbAZetGte+SXfODQMBoa;BNyJ_F;8Va4tj0J_?bHOS}$#1Pw|KkZd>gG{3laa$;`^~ zylW8V{#^5gBE8+5sl5|^)gI1$N7Sio3_gd%LJV2wbr>mYkxrF%(;HU&IrXcrY-0U z#;VpvA9b#2!;yEd*{bN_w^4xLLgwki0RC4`EDafT8Xs&Y)yl{ z`cew|&`~?Om4YNqWvyJA`~9AYi{8wcBm2JkmUn7}gJdDBNQ@Rs3mLybnpe={;4dDgE*f(tQQlKn z-zIHidO&nTo*~a5Yx-jgO4nmg5SQtZcfg28Kwx#K@{7MXktJhNo33!ouXuWe~^~H#xQR2k+)3 zv)LW7a)BH)ZoSQAvAdVs#kw{nZzCV9O3M_gq7vX~mA-9YCK#<-wYc_FTr}d+{&&`k zuKIq>C@b+wtfG=})a*oRDAooxHKALillW}3W=G7G$B@tc>*mTs#IwudI(hv0xG+~X zuu(8q8sM^cAy#fqOAeTMnO#huX6Mm7^H;XV;>ay$WvMg@as`FEyc)pV2AzKT`+=t( z+Dqw+l{j}$BIQ>J$Q2}Il4e;pLS8!N5b@O6Pzr8=4?c4JBfvd;_a3|p#*DYqx4Q`+ z!{^e^CshWRg`T3jk!MX!lJC2Qk|5knk|=13rS!8lTnjGKTcd zh9U#)X>K!{gDY!$Wb;9Ny#{iHItD)NJ;P%xSbqIrIDk89aKP-D>4+`vsF=p}i~#uv zp?)1rm=Y#Tv?p6gb-E$861}rXE6d`Sj*t~#FLev=(=O}SThdxcC}Qnr9lB5j-}^3s ztZtlVC~y}ALdZ;^w?k}RlQujDH(Md*TkwDy;5&T<-~H|pCq#(vBF6slMZ~svum1*m zk^Gfjq_2GQTUhX2+~K?CPw;kna_|{JA9fEmKmoDR9^T9WWj_pxBkoDp-V4={Fb!Kx zwRJ$`GHpuetka%yPF{o|Vt!WN(~T!+45-BL>U8KMQIwgyv?yzW-ociaMhWHqoISOf zyb36)FfM+9Lqti?MmZ==P;40K{I6IklNk#Y56VnR@8^)pG%PHUH(WgBo`UGte&oSd($=$$)$InbrscLr z5m%Z%=d~Mq9bhgw%^1>c*K_oq5!RR;sULOg>5hmjl^t6!2{xfTbnmgCi{06kJV#l_ zw~f!)TufkFFD!#t%tcU|LOn>6%fJ_jzBt;3hRiZBV+sO4B=RzWXo@am=*uIH6lHn8 z3sR@;$vuPY64nncZ9=OWY`H7mQKv>qeh)^l zU<+fO6&TIr^~t{8?R(gHt4LLn(*q@*JiuOtPrbmehSz#JIa$4sPs4>b!?E>V=FCnw z$g-wNl;C+(-qE#CkINefR@U8h#(`8xCkE=t1{_0lC5!0ELw>v|J5Oe_PpJ>mTnDPg zso|*FeXja>xu;}1jFKNB8y7XzLLwRXEr%EkM5!1mquY&&MtFBW6=!eJrUF}_CxVQ^ z!DHHj8vY}lsV&)I_mU)T>#ik7u0X6v8`cMjEVB^VW2OB*8wL7@AWZQ(yGOG`|As9O z>d8C13J4uUv_mU>vz|U07s*TiAYqgS$9e$g7_)_2O7m*=LQyNNL?WdE%o=;amVBN! z=-g5PRT=5GQVLP+bHUfgZw*w9-0K%@Xj8Cyu7uxIV6(}P$A^7&jlewn&GYiLxN5%7 zT!%wwpYMZybdQ(-G}O(3$cJa|i&VFda00O9G_>Krunsj&+Fhyc_8v8-Mly3y#n>AC z^8Khts%Z}WH<&^s>TCV+i9PyqA+rTJkU0yLhWgMLX2$i1Azs$N1(|5_PpdPPPNL}5 z`Z}gk5f*}t4ND{3QcRwv$EwvL^<5^9cq!?Zi;5?^VQ$Q^*&my;$6ya7ymH{K&| zN#^Qe4^soh@hmQMZ|VjvxXE39Rj6WNI1mRrXqqhc~B}n zmfA^wg}@#oel>PViRvkgVVSvHmCB!!5ac221Tx*2B^(81cjku4`|7*8#D; zB8>+LJMnOOWt29MP{dSLj?xywy$yZ>iRr=4bAuRR!u5&&7cqgR=;+;6O;jn-DwIb| z4w5J=%9=MTWJdjeBfK`}T;#5df;0{e5_&Be&I7NOIjIoafANlhc~1;pxW0My5X#_- zR3@5niG8jL=Z~0__Jg;eGmu7Xjol@S73}a`%=3#U*M)ih@U*g>Hx(D<$Z)9@(-w64 zZc;a=x_i4E5CHfe8V*3IltMDik|HA9)tbHpP=P`r18^l=B{&idT1iHk3 zlu(p`#DMMHN}|Mw#ybv_ui(q3kTUfn4;9`GnN4#^DGx+u#AgN!6;m`d&MN1jMCNER zC3sBY33*P6$v?Mr&Yqv^pYPQ9|8N`T)&PL7{ilBh0Q|h!|Ks=Z!1Au!PBdT_3_t_c z=WJ{M>^?gb*)Aawj)woE=ktO4**2hkg-AKzsdM~7R$d*-7k#xWWEtew?R!J1xX5J< zDtEdXRW`|NC$!*@NW>K4w+9pPzJ;y7o_l|zdc8KkkLOGmVMRIbN>38o#hC&7*$~fH zT@;4lAQ4ZVHO^+e2a^?M)ug4=w?^?<~93O!lx55&yZi%DOQikRI8EfVJJp}$IAP~oLi2C0{i`15*bf%D#QS6_ujmv?v@EG^@^qA$td5Ppxy(pydA8n5Z5{NJE}~ zj(OENaxo^ps!^&4GWAtE&L zmbgN2k0QsSkStM#-^k^;cRa^Y%OdP z2h_Y%D1u=P+1BK+f(7g>O!)eC_<@763wRj7_J#=a*c*mJd?}nRMZn%jGROuKRJYz= z4wsEE5H12yltBIh#E_s)m0GjA1QX#5AcXJ!&4j^IHZD0d#Ii3oqfx_GW_?8=2-kzLd-Uqxe%1V&EM!%(4*;*bwyq&JniFTBprbG<0t2tIqCC}+3vJODc139s zKDPaF7@ScM=a~%9xHwP>RPeuXqtjCPplBL(Ky2$`XsIb(5fnI(Qiw`j49!Lgmx`ng z>6nPu#nN;ooRpH{l$h7Uf$NBf|AB~mF*Mv-Dw1ZUW1-8Bsz`}&h^WXj&y$Cu0RRBJ C{StNn literal 0 HcmV?d00001 diff --git a/frontend/src/fonts/KFOlCnqEu92Fr1MmEU9fChc4EsA.woff2 b/frontend/src/fonts/KFOlCnqEu92Fr1MmEU9fChc4EsA.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..68f094cde5f01602cffb230f477c66b53ca40da2 GIT binary patch literal 11800 zcmV+zF6YsAPew8T0RR9104^8+5&!@I0C8Xd04=is0RR9100000000000000000000 z0000QKpTz>9Dy(fU;u*@2wVw+JP`~EfwMe;p+^gYdH@oF2mv+%Bm;+V1Rw>200$rp zf>RqmWi@P@1~t1KfTWK8=pzHc#sMIaZI7aAvuyDHe@#xtkWm3swf-Vv!%T?K!cdnv zyWx`6EsTvs2&9ggQj>eubA0gn8yL@>J9T%5eKr%s+P)gmh0kSUogdCudpANv21Hz9 zLnY7!)5V(~7U*d!_2||ENh*@%d){&Kcge(QG_h4?%7CCL>LNC;9-*a=cnKbL@Aq?L zNlxAZF}J{c7nr+jMO49uSVR2W{@#KpVWXvEM2#LYdZR>;%0Z8Ai5y~&3Sl6iO^vj_ zU^G$|2+a7(0F{<&x~@N&Q#cS3Wn#qh=h|a0M4MzO%h~-vCHn4g{0Y;kIszq*g*jm> zT!lO(8vummBsaFsd5&7bP^ajv{00EOPiOCp(4N_q4%*K}8!FTOF0|S`_CIDx6Ii`; z);S$FJr`|SSq{Pd-+bW$=`f3K2;CnOXfc&?Vp(+Q?zaNo+8p@m_mpZOJPuOu*aH9m zPF2oW!&bVS?k&JdTU^Qu@cr-T1hfA9IuGr(R_D-`KZX>SE7ahJ6DIkuvlZcxB)fhy z-QdyfIIsUXFNHAprB1!MAsxnG->>NhybHVlzofr}J5z_U-dD;BmmPoqH?^eyTehz{ zdy=oR)C!nnrxsjk0J6Wl9$91g_O#xV-7CG#jCW&=Qfyx-h2;e$@K9QXLFoik7?=rT3?r+o4!!i=#&2J-{%b<^+(GZ$)|?6 zSDce~4X`t0oqF5Sdiz7KY(P6RRXOHh02s<%#xq#9-D_V7Yj1P~XzOv?b$dyDalETk zRPX<)k)7=KQt?5x*?x*tWrp!0(7L+TRxs}OE30P*0Mp}bBc-?IbWQ0M??jg+jc;iE zTe$rjiUh!_IwkxqYCZ{TD3fbU{Hi@@pcVIXbq0y?HcYOp(XB4`1L~&5PZO%mM2HkE z);6SXbLDG`yU4&_|1Tc0akoMCVIf4A2qclBM2itCPP_zUiISw;-rbkAeE8AFpZNTO z!pf@Z+WN+(a~CdMX=&@|?CS36?d!ifFi0D^HhO)EK0CkoK*V-`1Y+0ogD{GV%kA-e zf4;x}?jGakFGzMsZGahjV1^}CJ$5=XJXZ)suL8(wtc(Mv=w`$Tl8BFfrx=xY> zIQX=th6z)6;&Em2^ihZD7!YVuQW^MN90XuBF{N#27}|#RD*9kY9~W%7+7*UimT$ra zy74yKIZCnkvGl-1!ySoEH?{x-#cV`sQNC~m<)Vnf>goHM8B8)Ogn#|@uYzx$yyPxO zE*oxP_+WUxK7K+{ZY(-L%%{)oJ{NYEE_W`!9hh5Yif?JNU!o1Lc)$WPaWDXfzULE| zA9Nc)UbE0hkpg#x-IAHX1)7LB|EIAj3rMvpaSY;vr{6 zLoE;u+JTOAgc-oRBp?ZMiDC(c#9t{XsdlMesXnP8sasNarO`)6VVNF6K?;x(qzxHD zj*vSP07dYbRA?~!4<>v^AhE7Qp2VKS&up7ir*%{64($Pkw}VTxy@mqqRsFO}-igDZ z!@ zY*;oA{s;mdga^?9GYxe-$QBC-5e3s2-uz2@os= zfCb@+3+B(HZOFpesLB(;I7u1m|jBMH&W3^@K?C#9-ZBcc+Ai?fLIB%CI@rp zhe=Jeh=J!T*6E*T&1>NMy@A~U6P+e1oKJ86HD;$8Iu!-J6!Sz()RO6tK(b-iE{F7p zK(*ijB8l=|B+z0FLUgC>Y!?ND;s}6y(^x{)EJ4v$a`L__{EEuC3@A7JCD_0BJ3u*Q zWcjbE6bUvv1>|f_YQ=?8HgEt%ZF+2gK$0=39a(|@1H`|8+kx?!foUdzegx#}fhC_1 zBv968ceJ>ql;qM~FiW}%M0YeB&Y78J`7yJdD8aD|i^?9t&H)Ry4pB?ffPDU%HTX?| zlRyZ>#xpF*Vzt%T(%`t)vGD35qf?sFY-Vp-IhaVb(~d4NnBv?-7qn88`an9RZbr6J zCR0=D3R{mZ$=ny6>4(AbD`mAdp{3MXuk2-_l#nb|+GZEU$jCD0E~!qdOYg1 znu=)tZVn#IA*egen3Js%5&u8in@zzjPJx<$F|&WW-19npIu=m_8Y*0r#Gh$=#gr4f z#>7rV7`WaTu7vN8bs14y>+N}1K*?|ssyUn&+SBvj*v=V`7-oDqI5j-u7K^}3IBWSe z^nsuM+O+$?AveV4Mw}rL$)hHyr84G<-1>cIkeCuhPuBpF?@}*-Y}%hwbWpG7YwYQe z=6LW+hpcNBg{~|zD^0o)#naroNJv=IkoOvH5j<>D`4RvrZTxmGX}I#U*iRNr(smBj zeEN%-Q^;F%I4uXWPO)=7B+WEhXgHdD-lcf%L(jv)<1CShvF~O<#F^D!xh}j<8Q@tq z03gZJ;|mxl@&|5f(9we(6LKiTff#e-k5{KWAQ^E<8*5ba`iS>Oy8Pu9=^I~@>s+lR zR~zp$oCmpG(s;Me>_9TiMeoq|v+><_LDhCLx1yHR@((WO$LY1+SemtzA=lfl=1f@3 zv|D;9y+rd)8&%E-t=#TTB&`@&63qhHdN8m2odep+eH*F!1%%8oY)BlrP!&C+Vq%7RL=ZC&TmlI3FjT+!j;uzVK3qeb?+=!j_O014xdf$# z*}}7+!;~-uKF7$@+i*Eqg@A2<#4nkV_xxt+BUg282acF|edI>@ga4a&)cx**U z$Sx?nROOrux|=K=N_zqK_3YS3%vUhAZhzHQuEIHCAZrNsSscR-?IDYY2SWB_0aM)h`C+>s2gq-izcY$(&T0T-CNn?jd&*%-k}v0f65w{a;#xx$* zcE;E^j*?~IMBwMA5=s^7kOM91u{XI{K>nWb1tHsGwBeg%V0NKFkuD4bJp)YjHbg3+VHI(78bSsK<`zUVMwIDg83=o_5yc$<5dMC1$fAI7 z5+bfZW2Huc-t(W1OP$WaR)^Jq+*!?gE#Gjy-DXZ>QP`PA1~#{zwb_uFS#S`G0mXYM zI^lxIJ2rzfp(I{4LWPT<7Q8`nXGolDj-yFMV&p525VR~y zael9x)$j#+mCt;Lm?gV6dz4s|xFA}8we`+(^pY%z?<}If$Ol#nR%Y^|_!wuE)BhgX zl;{9CqQgUd0J7&Ruul2GnY!8nhkVN*UwE8}mYZ&}E2~T>ZB-_j#uhBm`JcB9Vd%BM zXH~@C0k-xUP1te-^Kbf)g81Q=yU$}?mul5N-_EZt`Q(d1CuI! zZN?Am9=97|dS*C6)OEXche`IN12CgY z52!=-I3l>aZI}>g__|0(vo7o*+1{9ZoFV>0Y~_Dt7S>+cPuTbP@3V-ZDVI~?Y7rL6 zaG=!4&i-{@l}5O^_Z?k64L@(dq57{4@%J~GgD0-bP1dOX5L7S40xU5Rdt*>{`wam7 z;=XeW+1WjE^!sHmMpWzNe_a5RZ{>M?B|Tdg@5g=2bRUsdlNX;{lv@aK`WQY<4JZls zCxu(gW-ZVpR@a-i;z}RoFv-<<#aU$}f9Hlsw~&W<{+;n-g3o_kW=pDnSbmVzR(h_e zC^F0eu{OK5zc%%tP}5I>ht=xn4f38>Z;DZg= z=2-uGP*_^(>w))iEi=68ol1f`t;0i-2Npt;SJ~y^B7azw)+YBpBFEO@J}Id_DY?Di z>SDB`8JkgsHGJ6uO zS%)iC74LRLU_sLy#TPH6c14sFWLX5fjO4Jo5|UBDoAnsQnx2qV;v&cVu13E}%HxQB zBeKl)YbEtl5SB=;iz{kRuPDg1i%1&0x1+xMtF7o(N&`Oo?TL(rw4%Eug46Vr^0Cv1 zGt-P)@c}-5^)~rP1~`7JTn3f_2^-?=ifrr*4Qyh9lW?vCIk~^MX8<>G6<`@&< zUj7ko5uW@uV4X3KxOcDKB!!oOO%qtdvSg*!PP-xt?lbO&dj^Fz*c8DSSa*WLmF&aS zvc@;OA{?LDs2TffiGQ8=`zY)V_-ic(@s@h z)D^dREpHiV^+(55ar9JI<+s~oQ`_U`82E4>59bg&GecifakEwrLi(xt-4S~6WBWrzsLGkVGKpkP|J-`Cw_boFQ-XG(a_%FT$O7tXq9 zg{O;_X1dC({u?>cUTA-s(o?%NH5G2POtC@_49`@DcvN@Q?_Hb#CTmSNJjUlr24g+k zOE-ge>>g{UYJxGWXFGHDQb~EF(WGsMwZRi}{k$94QtaYWdN`Eohqv@0Xb*1& z=ae7Ip-Uu0r$3qdokgCK##h&cKAvv2NPn@fm$*&+P0U9RDSLVs%>z{e){UNLz}DGl zcpH|W-nu*s+`)~LUL_Y4PT3JoBCx_)=22T$Xk&BSKj&{F&u5Qgzg_tg#E17k9&|P7Xk%u025nwrBa`f+rdv!z2fCj%-F?M(=c(k)oA>;btV$N{ z(?-VIZJl}U1zEA9(gqegMmmDVCZ~o>PxA}k_AgBKd2J=_Z#fpJ-2CtpwN=VTrF!{DR0DSlE_^pr-sAi%(9?M z;?#`&jdIE=S{>TW-OgQ=cYYZ^hh^H^Xm;QHmeI9a%XBvHt^d<|xE3`GSGTutXsshj z`S*5~*|1nxA{-!xU=dwxCK!5lvI`&2b1xd3H4%-GLJ-%`s=p=AXZ(9rSqzr9!B$x> zM`<-R)#HqUlP=+swdqqFJDTc|T7^m+6^V;a57gED#yL&7(0E~zn+IKEEiNBccm4^7 zpkNcf5c?x}&C!jV!3zqXd(Roe+1nP`+2Sy40$zGn_?*W;JzXp7ob5^ogsJ%EX7pyI z1_Z{v_vU2qKGw9f(9pCn$7q=0g79}mt}6FS5Z$ z+E^Fitx=Y%?tWvEG6mbyRrT#oDt7>f+xo zO`ET7{PK^8@b?VMk3dq*Yq5wlz4}v$GcTzx&m!jbf&P};Hgo$K_1W3St@_5){d(%# zzA!_k@hqdcY1^-C_T~o-N;7Z0{|an?-_d?tDw^mhpEC9eexgIJD@%z{Pk4 zkz7+4Sdm8Ta|YTu(lY>rKl-x=-2P+fZOpQm_<`gN>J8iUwy>*T1*L1{tx@j^KzFDs zdRc#q?($D6;%u#On>*In1jvv<|7oC=xoO(?_qDb?PspOy=vjgGHv{v$Po=mena-ej zGQPk^z(G`dbQN>{CAZ%Ffp}}wk=OH-VuI=&j;cWWzVVo2P!8rtFlN5^=rzyF)jjk? z_CQ1X|2s8m7e;7E9dXc4KZ%P(D1nTDo+`{I+#t|CUf)Q z{fANX-^aZAuH?TbOME*Fm`N1QQcu0CCObR6vMLj1lKGl{<@?w5093&3K!2exuzN$x z=ga!8T~N6C++!%rsX9D8`k9rZy~q79W%EHP57>||y*by>mJG`XSs((R9dB}J|5tjc z_Y&&(EM?>8BqjeHAtspM7!~4V9}z@!i3|*~m&eGeWo<^pzy)0(qlpmU$^6B?@R7FUMl!s?|&V&{IevZ+0kgNQJPFL&1_v(R5b>Y zZU0<+6If*HI{))dIb`YPIRCnr$*q@HFt^%}KozKyIpU4@>uZUY}y|OI-jWaQ`%kKr851 z*u;Wk!9MK#i2@2xfZm3{iEZ7MTQ((nGwhSSd%o+q0h9ydP zYo}PF+X%63PX@|GEQB}414Y2D{Kl2M*`3*ggL^3HtdD+cw`5NmjbYovPDz4-U>6=* ztR7ZU)lv~7$5PDkTK=c9Kq6)$6aj|%?1f+|QgF)sMto=4FDG7c3xHu3%?rT38xN7$i9lX-T?>OL z)td_94iI6SAm~R`Z%Y&?SWBsjg78!Oz(bMBTLZc#d4Nr+!b=v+3+P6*mEZstiZzs> zx-%Q0j;^tAf^4BNrEzc^0E%`I37KmbFt8pN7wn@-la)R|M{>Fi;aCqS0YIqRjgL@X zO8)?JbQqK$5*tB829!3ZuAy?-p^fou2(Df<{NQsQP6PaoY34;FIR=GP%kt<_>zmGz z0pK#biq#5%ta%pjqWVR_A7%QWN?wFa43HOKVId*G8B|}L1FAr;EG96DVK}Eeoog|1 zs=#K7{-Wed^31=@Q&8W=D6>+?0!K!=e zPLKQU{hHObuC*-#?Rv4~4PoyZ`Sv;>qT8rMUe($zlbhxD@T{<-f^J`fr_ai!3JVMo-KWtV`s zt3R%-eLo6z@9gVfR6UH4zTTjX1~h8FtZ~>lglT1(S-*ntVlCS1I|HNx`#N;$5Q`2w zdEwA`y~>cvj2{ooEYs3{Js_N}v-SD}w8^Fwns(ulOhDBj4Qd@aho`CcNYu6bn3e%- z*Ndqes-8Fk%fzcM3rI2`{=x}BEPy?g3A9cI4B3AJ+_L0Mug@W5EFNH14FIHFORdng zYp8|L_WQTZ_s1;lnlCfSjA(_1&7U2RizT%kPV^o&&<+j21lfueYoTmiBX@f>snqpP z`Q5IrDFf|#F?B;}Y*+oD9>TF}lq2v3>i4e!X`p;`AU*jT4CflQvgau<+hgFxy*}51 z?zICz;cqwZ6@y!Fp!OT+ck6L%`~4JE$PsNBnLZD(sWB~w=ck|XNm z8^U6zijZYFdXW7=arLoK3|CsbkV@2b6;&XYcqbKfFDMw;_w@X|dAa;)%DTqYwa6*M z|6gK7o3=<2gQBHI|NX+s9I9!wa_4v?sB9ch4Omf4p zm4G(mX5cp2AfuGjVGBn&jx)@KrxKdn2274<>t<`|?d41s*oZS~y`~+*#6>-mM2{C$ zOBfL{fk_`B4akrQqEWLBWxSL%GznwC*6|0Z1#iV$Cw|S7D-H64P{;!aQJ5f63IRD3 zroMC_3mH1;Ym}T+MeC#=L`F5G`*lX+c!ix2-O%KyqQ)E{4M-BCj-$b1ByHkUUEUN_ zsHsy(Q`BAqb&eL>&VfN_RE{n09J~$9m$55L;d2jXnh_t4$wrk{IP;mfk;l4O)JF%D zf&;cEYj>_ zPPdttgjJd_?J}u8F<)fiO{vdpEN;?)Va2+!P($#P@l|njeRwx76>0rP=KJB7wCdigZMhZ0&B3U zM5(xlA}tUypg7h>RIrI@{9Nd7oU~XzfUpO@bE|07`y-?Qi?%`#b9WgrF_H+UG3{YR z432c(NoszgfdO@PT*-vYv>4NM3QkCY?buX(&~jb(TU2R<6Q3+vpVqx0v>K&({chdk z<4SRDNH1n!%Yz;z-oe(zS07}Qf~tNApqpsDL9)9p|ZTQX)*STKWe2! zZ}<_;NwiHJ43ny+cjNcTKG`SxQwXGQ&l%TXJ|Kwtp7002#4JVcc#r9?5RlKH;Yi=v zhKTnUlE=3$to3~<4X7ub7Crpt4$ z5aksyPh$W+8Iw_+wos~*61xRxE(T-ia;F+XJ%n&(?J!St@M%DUczM3B0wLpM(GPgT zEgXPqPB~uY=OcW?TI@ZtV8-jRc|bOX8P5)8|79)1jXm&$#F7!Zo4`Kvj+k5jDR_qW zqhIUYJ#Ng0`}u89zuzrw4W+g{$zAiU8SK5DWEi8b$g=2N4irY9v3tkHbg#Dyv5B>Y z)x}n!XY9U^PS|e2NB8?#`D(wKeORXo?@a%s0DrY7i-hu(f!6IH$?-7A#?m`VsP0z# z@q{d4q)KT9W@xf0GW@g+D4BIxtw9ZiWebIUS5EGg@=QWx1qQW72$gF|^jrYnUeZJ6 zRt3`s?U7CH{P)2TbNWsulROSuHC}@p_jg2dE-f zERJaUD-CIs*lJ)8n;}j@;rXg<_U06z2(|@X)N$0!;M3#ww!j9*B(*D6eSH9R>}t8N z=C#I*4*OPfyFi^|aIU7^Et;GZl#$2SAvQTAb4s3DO>U;O@{tw$C1Z&s4U}f3n>nGP zn#DcE@m-|M6JOO5rnsPhji(6WPf~_b9u&sFT%%=;^eh3`Lk@}7o-gH~kPo1~s^D)g zf|)i4h;tgkOig+Ou^7?kS8-}2$%{Y&BLdrbF^Z}x$ilR*#DsvzHH8v`k)Q{Td`x;( z$V9uO>xJ8}(12#6x}hS6YYLpARgqzY>cR>JoguWjj+%jw3kCPl!5HwW6C8Nv&X<=8 zYldLyNJPtfc@LzyZ1#N`H(2Nv0*os*)aTNIcB+VrK+rn%4yBS$5xRhc;=A}Q{)*1U zfFdi`G3j9kRc%|eVglf|A*w7N(Z!rp^i zykoJKJh)lsbUOYFa|*ywShF$mKy%JQsKNevd+hvmcK&{mc3dEgj1!@T1PdcOJ6@-C z=?D}wWYB!88K>Z4TsUNg#*Qx!WvIAv_?dcr9`U5>KqFonn?m^ z-oB!=>dkX7g%g5`^I+ZHZ{ZdetQkAwY&?oQE3BxQj3E&$=|+%1JxU1si}6p8c8!HE z^aKet=P9*E0UcmIv>6j$#u_W%-5UqvH0MIyP^jzSQG89r3wqKRKBaZe=sIt}Hri&h zQYa*{Rs*oeVzc_#P&ZYp#9(0p3wv(WS5Y!Xlt57eH(SOhZ;_PVr|eye@wRJiW2P$HDrFgUujMaNVI>iD*L>LQ#BfpZgmfB<)2ltTw`d40H-sDJ}J zI}F``{aY^Gr~5K;E)Crj?Y37nF6&VHWC*WZYel7w%qiOy=Vcuu+$4rkT!jDk=o4Wr z`ZbaL|N6j3|Ct$&Y_XRbmfiztoe7b5(IEOpp%>-4@X2aps(77pRYj7?S8-86OK*x7 zeWM3Wm2WC805hF716e@1cNZF+F?F)Mj=?c8GJ{3o;|ZQ-v<*J(DH&}EauGCWt~Up% ziNpk>XOrLjonnWdXu;06VGI^BW34>Gy84SB=&@x!LDO;{nagGd33CxTa75`fB9xYs z6m)-Byep0UdS57J}G(Ob(h!qg&Honlr&<8q^IT`a@|A_2 z?_id>BX^8=daE3r=Y&Uhm-NoqJk&9U&I^j5+zsfFsJRF9vKs&~+vq$so_ZBwf=m(^ z+G?J#w75Em90miidpq`t35ju#w!MjA#+UO#Aef_f@gkEvQM={}&*qRrP{$r!Zs~dE z1u?h&_Po=)oVUaOy3CI6E^%EieY_l%X7(dHXdD^fa`EQ&O?_MJeq1g-5UZhdRe5aVO@EYtt1(pM+~zF8jwV^XuByX z`XG%&9j}1PY`3V;x~q0}45CwPr8nJUu#ptA)TZu+?wHZQjhz_0_;N26sS4-8IdXzG zo5mJU(q4zvr_~-d-~+X75lf?*nv5pxItYl5sG1T1 z$x0}kVop0SVju7}IT~JN25BTcVsi>jZBs;JxuTe}RJLj)UF>Jdzd@y$E*AW}fib8; z5tg;`9&?cI)nyqESLx)V17$goC#WM;9*x&?i7_BbAe{*w3O8QT_=D5a4(Kc|6kXVI zl*4p^07ZjBd1_6>5%Y;0X&)Mf+No)Zu9T|T#js$goU^qaV$Hr;uNbu$9a~*o5#4y<7RrI36*ts3{%ng;!XerDD47?XGUaNWRz)*ig1h0EY;9=fp2Hg zJlw4~HzrfpvdE@)>3}n9?md_ut=Fd6ri{R;MTG`#{U=UM; z7zb`C=b8lRi_5LoY3*#5)&JhZbV2&Zhz2CNCy ziK>|-9+qY!r3CmxKT719J?g1=`;t*omE%DVl-mx!FcDRLO)EiWF%n+<2k; z{z!elnfh#A=$8#;!oA;6mu@pLR*NAVtg+#ALiW^f_ySP*^v)3)`y^K*nwsVo&Xm+~ zQXtm}w{@t54sii7Pz1cVK=4512TJ*thqv4N+ieFDwlzzlR>%WV4EEd^apPH1)UnWjm&>+$*LSaQ!hypx2nQCG zLhtfhOk#69N}~|A+V6@oo&h)=sa=$6+}x!>ZvQJIv~sZo+&sCcwbt$t^Z{`^3im?U zGzV5L7lcE?JmoT2GI(_I)OJU03Sp2nPVKu#I*j4}be8S^GaAA1$oHNPDqaW|ooxlN zOP8jRzIHA0*giz>5qU$T-9tM7gdIV7ZC;utU75B_nj){mF7m#G&0oIiJ(RT-N~x^K zRL1-MvkcA~-9uXWIyi_X*x~g?(J*1ckSeMpaTbHLGXMu=2)=BaC|-QY%QkzXn`Wr*+Hdm{ zHA3A`0ksP*@{k~PC2Od$rkZQ1wYE~E$&iIq%X=EDIQ0SXdb?br?u4G(P14&4$%